Files
gocryptotrader/backtester/funding/collateralpair_test.go
Adrian Gallagher a79e0d2b3e qa/spelling: Add Codespell support (#1121)
* Add codespell support

* Fix paths

* Add HTML files to exclusion list
2023-01-30 12:36:56 +11:00

312 lines
8.5 KiB
Go

package funding
import (
"errors"
"testing"
"github.com/shopspring/decimal"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
gctorder "github.com/thrasher-corp/gocryptotrader/exchanges/order"
)
func TestCollateralCanPlaceOrder(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{available: decimal.NewFromInt(1337)},
}
if !c.CanPlaceOrder(gctorder.UnknownSide) {
t.Error("expected true")
}
}
func TestCollateralTakeProfit(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{
asset: asset.Futures,
isCollateral: true,
},
contract: &Item{asset: asset.Futures,
available: decimal.NewFromInt(1),
},
}
var expectedError error
err := c.TakeProfit(decimal.NewFromInt(1), decimal.NewFromInt(1))
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
}
func TestCollateralCollateralCurrency(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{currency: currency.DOGE},
}
if !c.CollateralCurrency().Equal(currency.DOGE) {
t.Errorf("received '%v' expected '%v'", c.CollateralCurrency(), currency.DOGE)
}
}
func TestCollateralContractCurrency(t *testing.T) {
t.Parallel()
c := &CollateralPair{
contract: &Item{currency: currency.DOGE},
}
if !c.ContractCurrency().Equal(currency.DOGE) {
t.Errorf("received '%v' expected '%v'", c.ContractCurrency(), currency.DOGE)
}
}
func TestCollateralInitialFunds(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{initialFunds: decimal.NewFromInt(1337)},
}
if !c.InitialFunds().Equal(decimal.NewFromInt(1337)) {
t.Errorf("received '%v' expected '%v'", c.InitialFunds(), decimal.NewFromInt(1337))
}
}
func TestCollateralAvailableFunds(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{available: decimal.NewFromInt(1337)},
}
if !c.AvailableFunds().Equal(decimal.NewFromInt(1337)) {
t.Errorf("received '%v' expected '%v'", c.AvailableFunds(), decimal.NewFromInt(1337))
}
}
func TestCollateralGetPairReader(t *testing.T) {
t.Parallel()
c := &CollateralPair{
contract: &Item{},
collateral: &Item{},
}
if _, err := c.GetPairReader(); !errors.Is(err, ErrNotPair) {
t.Errorf("received '%v' expected '%v'", err, ErrNotPair)
}
}
func TestCollateralGetCollateralReader(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{available: decimal.NewFromInt(1337)},
}
var expectedError error
cr, err := c.GetCollateralReader()
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
if cr != c {
t.Error("expected the same thing")
}
}
func TestCollateralUpdateContracts(t *testing.T) {
t.Parallel()
b := gctorder.Buy
var expectedError error
c := &CollateralPair{
collateral: &Item{
asset: asset.Futures,
isCollateral: true,
},
contract: &Item{asset: asset.Futures},
currentDirection: &b,
}
leet := decimal.NewFromInt(1337)
err := c.UpdateContracts(gctorder.Buy, leet)
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
if !c.contract.available.Equal(leet) {
t.Errorf("received '%v' expected '%v'", c.contract.available, leet)
}
b = gctorder.Sell
err = c.UpdateContracts(gctorder.Buy, leet)
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
if !c.contract.available.Equal(decimal.Zero) {
t.Errorf("received '%v' expected '%v'", c.contract.available, decimal.Zero)
}
c.currentDirection = nil
err = c.UpdateContracts(gctorder.Buy, leet)
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
if !c.contract.available.Equal(leet) {
t.Errorf("received '%v' expected '%v'", c.contract.available, leet)
}
}
func TestCollateralReleaseContracts(t *testing.T) {
t.Parallel()
b := gctorder.Buy
c := &CollateralPair{
collateral: &Item{
asset: asset.Futures,
isCollateral: true,
},
contract: &Item{asset: asset.Futures},
currentDirection: &b,
}
expectedError := errPositiveOnly
err := c.ReleaseContracts(decimal.Zero)
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
expectedError = errCannotAllocate
err = c.ReleaseContracts(decimal.NewFromInt(1337))
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
expectedError = nil
c.contract.available = decimal.NewFromInt(1337)
err = c.ReleaseContracts(decimal.NewFromInt(1337))
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
}
func TestCollateralFundReader(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{available: decimal.NewFromInt(1337)},
}
if c.FundReader() != c {
t.Error("expected the same thing")
}
}
func TestCollateralPairReleaser(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{},
contract: &Item{},
}
if _, err := c.PairReleaser(); !errors.Is(err, ErrNotPair) {
t.Errorf("received '%v' expected '%v'", err, ErrNotPair)
}
}
func TestCollateralFundReserver(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{available: decimal.NewFromInt(1337)},
}
if c.FundReserver() != c {
t.Error("expected the same thing")
}
}
func TestCollateralCollateralReleaser(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{},
contract: &Item{},
}
var expectedError error
if _, err := c.CollateralReleaser(); !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
}
func TestCollateralFundReleaser(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{available: decimal.NewFromInt(1337)},
}
if c.FundReleaser() != c {
t.Error("expected the same thing")
}
}
func TestCollateralReserve(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{
asset: asset.Futures,
isCollateral: true,
available: decimal.NewFromInt(1337),
},
contract: &Item{asset: asset.Futures},
}
var expectedError error
err := c.Reserve(decimal.NewFromInt(1), gctorder.Long)
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
if !c.collateral.reserved.Equal(decimal.NewFromInt(1)) {
t.Errorf("received '%v' expected '%v'", c.collateral.reserved, decimal.NewFromInt(1))
}
if !c.collateral.available.Equal(decimal.NewFromInt(1336)) {
t.Errorf("received '%v' expected '%v'", c.collateral.available, decimal.NewFromInt(1336))
}
err = c.Reserve(decimal.NewFromInt(1), gctorder.Short)
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
if !c.collateral.reserved.Equal(decimal.NewFromInt(2)) {
t.Errorf("received '%v' expected '%v'", c.collateral.reserved, decimal.NewFromInt(2))
}
if !c.collateral.available.Equal(decimal.NewFromInt(1335)) {
t.Errorf("received '%v' expected '%v'", c.collateral.available, decimal.NewFromInt(1335))
}
err = c.Reserve(decimal.NewFromInt(2), gctorder.ClosePosition)
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
if !c.collateral.reserved.Equal(decimal.NewFromInt(4)) {
t.Errorf("received '%v' expected '%v'", c.collateral.reserved, decimal.Zero)
}
if !c.collateral.available.Equal(decimal.NewFromInt(1333)) {
t.Errorf("received '%v' expected '%v'", c.collateral.available, decimal.NewFromInt(1333))
}
expectedError = errCannotAllocate
err = c.Reserve(decimal.NewFromInt(2), gctorder.Buy)
if !errors.Is(err, expectedError) {
t.Errorf("received '%v' expected '%v'", err, expectedError)
}
}
func TestCollateralLiquidate(t *testing.T) {
t.Parallel()
c := &CollateralPair{
collateral: &Item{
asset: asset.Futures,
isCollateral: true,
available: decimal.NewFromInt(1337),
},
contract: &Item{asset: asset.Futures,
available: decimal.NewFromInt(1337),
},
}
c.Liquidate()
if !c.collateral.available.Equal(decimal.Zero) {
t.Errorf("received '%v' expected '%v'", c.collateral.available, decimal.Zero)
}
if !c.contract.available.Equal(decimal.Zero) {
t.Errorf("received '%v' expected '%v'", c.contract.available, decimal.Zero)
}
}
func TestCollateralCurrentHoldings(t *testing.T) {
t.Parallel()
c := &CollateralPair{
contract: &Item{available: decimal.NewFromInt(1337)},
}
if !c.CurrentHoldings().Equal(decimal.NewFromInt(1337)) {
t.Errorf("received '%v' expected '%v'", c.CurrentHoldings(), decimal.NewFromInt(1337))
}
}