6 "github.com/bytom/vapor/protocol/bc"
7 "github.com/bytom/vapor/testutil"
8 "github.com/bytom/vapor/application/mov/common"
9 "github.com/bytom/vapor/application/mov/mock"
10 "github.com/bytom/vapor/protocol/bc/types"
14 Test: validateTradePairs vaild and invaild case for 2, 3 trade pairs
16 func TestGenerateMatchedTxs(t *testing.T) {
17 btc2eth := &common.TradePair{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH}
18 eth2btc := &common.TradePair{FromAssetID: &mock.ETH, ToAssetID: &mock.BTC}
22 tradePair *common.TradePair
23 initStoreOrders []*common.Order
24 wantMatchedTxs []*types.Tx
28 tradePair: &common.TradePair{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH},
29 initStoreOrders: []*common.Order{
30 mock.Btc2EthOrders[0], mock.Btc2EthOrders[1],
31 mock.Eth2BtcOrders[0],
33 wantMatchedTxs: []*types.Tx{
38 desc: "partial matched",
39 tradePair: &common.TradePair{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH},
40 initStoreOrders: []*common.Order{
41 mock.Btc2EthOrders[0], mock.Btc2EthOrders[1],
42 mock.Eth2BtcOrders[1],
44 wantMatchedTxs: []*types.Tx{
49 desc: "partial matched and continue to match",
50 tradePair: &common.TradePair{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH},
51 initStoreOrders: []*common.Order{
52 mock.Btc2EthOrders[0], mock.Btc2EthOrders[1],
53 mock.Eth2BtcOrders[2],
55 wantMatchedTxs: []*types.Tx{
61 desc: "unable to match",
62 tradePair: &common.TradePair{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH},
63 initStoreOrders: []*common.Order{
64 mock.Btc2EthOrders[1],
65 mock.Eth2BtcOrders[0],
67 wantMatchedTxs: []*types.Tx{},
71 for i, c := range cases {
72 movStore := mock.NewMovStore([]*common.TradePair{btc2eth, eth2btc}, c.initStoreOrders)
73 matchEngine := NewEngine(NewOrderTable(movStore, nil, nil), 0.05, mock.NodeProgram)
74 var gotMatchedTxs []*types.Tx
75 for matchEngine.HasMatchedTx(c.tradePair, c.tradePair.Reverse()) {
76 matchedTx, err := matchEngine.NextMatchedTx(c.tradePair, c.tradePair.Reverse())
81 gotMatchedTxs = append(gotMatchedTxs, matchedTx)
84 if len(c.wantMatchedTxs) != len(gotMatchedTxs) {
85 t.Errorf("#%d(%s) the length of got matched tx is not equals want matched tx", i, c.desc)
89 for i, gotMatchedTx := range gotMatchedTxs {
90 c.wantMatchedTxs[i].Version = 1
91 byteData, err := c.wantMatchedTxs[i].MarshalText()
96 c.wantMatchedTxs[i].SerializedSize = uint64(len(byteData))
97 wantMatchedTx := types.NewTx(c.wantMatchedTxs[i].TxData)
98 if gotMatchedTx.ID != wantMatchedTx.ID {
99 t.Errorf("#%d(%s) the tx hash of got matched tx: %s is not equals want matched tx: %s", i, c.desc, gotMatchedTx.ID.String(), wantMatchedTx.ID.String())
105 func TestCalcMatchedTxFee(t *testing.T) {
110 wantMatchedTxFee map[bc.AssetID]*MatchedTxFee
113 desc: "fee less than max fee",
115 wantMatchedTxFee: map[bc.AssetID]*MatchedTxFee{mock.ETH: {FeeAmount: 10, MaxFeeAmount: 26}},
116 tx: &mock.MatchedTxs[1].TxData,
119 desc: "fee refund in tx",
121 wantMatchedTxFee: map[bc.AssetID]*MatchedTxFee{mock.ETH: {FeeAmount: 27, MaxFeeAmount: 27}},
122 tx: &mock.MatchedTxs[2].TxData,
127 wantMatchedTxFee: map[bc.AssetID]*MatchedTxFee{},
128 tx: &mock.MatchedTxs[0].TxData,
132 for i, c := range cases {
133 gotMatchedTxFee, err := CalcMatchedTxFee(c.tx, c.maxFeeRate)
138 if !testutil.DeepEqual(gotMatchedTxFee, c.wantMatchedTxFee) {
139 t.Errorf("#%d(%s):fail to caculate matched tx fee, got (%v), want (%v)", i, c.desc, gotMatchedTxFee, c.wantMatchedTxFee)