bbgo_origin/pkg/dynamic/compare_test.go

208 lines
4.6 KiB
Go

package dynamic
import (
"fmt"
"reflect"
"testing"
"github.com/stretchr/testify/assert"
"github.com/c9s/bbgo/pkg/fixedpoint"
"github.com/c9s/bbgo/pkg/types"
)
func Test_convertToStr(t *testing.T) {
t.Run("str-str", func(t *testing.T) {
out := convertToStr(reflect.ValueOf("a"))
assert.Equal(t, "a", out)
})
t.Run("bool-str", func(t *testing.T) {
out := convertToStr(reflect.ValueOf(false))
assert.Equal(t, "false", out)
out = convertToStr(reflect.ValueOf(true))
assert.Equal(t, "true", out)
})
t.Run("float-str", func(t *testing.T) {
out := convertToStr(reflect.ValueOf(0.444))
assert.Equal(t, "0.444", out)
})
t.Run("int-str", func(t *testing.T) {
a := int(123)
out := convertToStr(reflect.ValueOf(a))
assert.Equal(t, "123", out)
})
t.Run("uint-str", func(t *testing.T) {
a := uint(123)
out := convertToStr(reflect.ValueOf(a))
assert.Equal(t, "123", out)
})
t.Run("int-ptr-str", func(t *testing.T) {
a := int(123)
out := convertToStr(reflect.ValueOf(&a))
assert.Equal(t, "123", out)
})
t.Run("fixedpoint-str", func(t *testing.T) {
a := fixedpoint.NewFromInt(100)
out := convertToStr(reflect.ValueOf(a))
assert.Equal(t, "100", out)
})
}
func Test_Compare(t *testing.T) {
tests := []struct {
name string
a, b interface{}
want []Diff
wantErr assert.ErrorAssertionFunc
}{
{
name: "order",
wantErr: assert.NoError,
a: &types.Order{
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Quantity: fixedpoint.NewFromFloat(100.0),
},
Status: types.OrderStatusFilled,
ExecutedQuantity: fixedpoint.NewFromFloat(100.0),
},
b: &types.Order{
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Quantity: fixedpoint.NewFromFloat(100.0),
},
ExecutedQuantity: fixedpoint.NewFromFloat(50.0),
Status: types.OrderStatusPartiallyFilled,
},
want: []Diff{
{
Field: "Status",
Before: "PARTIALLY_FILLED",
After: "FILLED",
},
{
Field: "ExecutedQuantity",
Before: "50",
After: "100",
},
},
},
{
name: "deposit and order",
wantErr: assert.NoError,
a: &types.Deposit{
Address: "0x6666",
TransactionID: "0x3333",
Status: types.DepositPending,
Confirmation: "10/15",
},
b: &types.Deposit{
Address: "0x6666",
TransactionID: "0x3333",
Status: types.DepositPending,
Confirmation: "1/15",
},
want: []Diff{
{
Field: "Confirmation",
Before: "1/15",
After: "10/15",
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := Compare(tt.a, tt.b)
if !tt.wantErr(t, err, fmt.Sprintf("Compare(%v, %v)", tt.a, tt.b)) {
return
}
assert.Equalf(t, tt.want, got, "Compare(%v, %v)", tt.a, tt.b)
})
}
}
func Test_compareStruct(t *testing.T) {
tests := []struct {
name string
a, b reflect.Value
want []Diff
wantErr assert.ErrorAssertionFunc
}{
{
name: "order ptrs",
wantErr: assert.NoError,
a: reflect.ValueOf(&types.Order{
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Quantity: fixedpoint.NewFromFloat(100.0),
},
ExecutedQuantity: fixedpoint.NewFromFloat(50.0),
}),
b: reflect.ValueOf(&types.Order{
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Quantity: fixedpoint.NewFromFloat(100.0),
},
ExecutedQuantity: fixedpoint.NewFromFloat(20.0),
}),
want: []Diff{
{
Field: "ExecutedQuantity",
Before: "20",
After: "50",
},
},
},
{
name: "order ptr and value",
wantErr: assert.NoError,
a: reflect.ValueOf(types.Order{
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Quantity: fixedpoint.NewFromFloat(100.0),
},
Status: types.OrderStatusFilled,
ExecutedQuantity: fixedpoint.NewFromFloat(100.0),
}),
b: reflect.ValueOf(&types.Order{
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Quantity: fixedpoint.NewFromFloat(100.0),
},
ExecutedQuantity: fixedpoint.NewFromFloat(50.0),
Status: types.OrderStatusPartiallyFilled,
}),
want: []Diff{
{
Field: "Status",
Before: "PARTIALLY_FILLED",
After: "FILLED",
},
{
Field: "ExecutedQuantity",
Before: "50",
After: "100",
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := compareStruct(tt.a, tt.b)
if !tt.wantErr(t, err, fmt.Sprintf("compareStruct(%v, %v)", tt.a, tt.b)) {
return
}
assert.Equalf(t, tt.want, got, "compareStruct(%v, %v)", tt.a, tt.b)
})
}
}