OSDN Git Service

fec13402c5fefd76fc0258216a79af50ef28ec67
[bytom/vapor.git] / application / mov / match / order_table_test.go
1 package match
2
3 import (
4         "testing"
5
6         "github.com/vapor/application/mov/common"
7         "github.com/vapor/application/mov/database"
8         "github.com/vapor/application/mov/mock"
9 )
10
11 var (
12         btc2eth = &common.TradePair{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH}
13 )
14
15 func TestOrderTable(t *testing.T) {
16         cases := []struct {
17                 desc                 string
18                 initMovStore         database.MovStore
19                 initArrivalAddOrders []*common.Order
20                 initArrivalDelOrders []*common.Order
21                 addOrders            []*common.Order
22                 popOrders            []*common.TradePair
23                 wantPeekedOrders     map[common.TradePair]*common.Order
24         }{
25                 {
26                         desc: "no arrival orders, no add order, no pop order",
27                         initMovStore: mock.NewMovStore(
28                                 []*common.TradePair{btc2eth},
29                                 []*common.Order{
30                                         mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
31                                 },
32                         ),
33                         wantPeekedOrders: map[common.TradePair]*common.Order{
34                                 *btc2eth: mock.Btc2EthOrders[0],
35                         },
36                 },
37                 {
38                         desc: "no arrival orders, add lower price order, no pop order",
39                         initMovStore: mock.NewMovStore(
40                                 []*common.TradePair{btc2eth},
41                                 []*common.Order{
42                                         mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
43                                 }),
44                         addOrders: []*common.Order{mock.Btc2EthOrders[3]},
45                         wantPeekedOrders: map[common.TradePair]*common.Order{
46                                 *btc2eth: mock.Btc2EthOrders[3],
47                         },
48                 },
49                 {
50                         desc: "no arrival orders, no add order, pop one order",
51                         initMovStore: mock.NewMovStore(
52                                 []*common.TradePair{btc2eth},
53                                 []*common.Order{
54                                         mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
55                                 }),
56                         popOrders: []*common.TradePair{btc2eth},
57                         wantPeekedOrders: map[common.TradePair]*common.Order{
58                                 *btc2eth: mock.Btc2EthOrders[2],
59                         },
60                 },
61                 {
62                         desc: "has arrival add orders, no add order, no pop order, the arrival add order is lower price",
63                         initMovStore: mock.NewMovStore(
64                                 []*common.TradePair{btc2eth},
65                                 []*common.Order{
66                                         mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
67                                 }),
68                         initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[3]},
69                         wantPeekedOrders: map[common.TradePair]*common.Order{
70                                 *btc2eth: mock.Btc2EthOrders[3],
71                         },
72                 },
73                 {
74                         desc: "has arrival add orders, no add order, no pop order, the db add order is lower price",
75                         initMovStore: mock.NewMovStore(
76                                 []*common.TradePair{btc2eth},
77                                 []*common.Order{
78                                         mock.Btc2EthOrders[0], mock.Btc2EthOrders[1],
79                                 }),
80                         initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[2]},
81                         wantPeekedOrders: map[common.TradePair]*common.Order{
82                                 *btc2eth: mock.Btc2EthOrders[0],
83                         },
84                 },
85                 {
86                         desc: "has arrival add orders, no add order, pop one order, after pop the arrival order is lower price",
87                         initMovStore: mock.NewMovStore(
88                                 []*common.TradePair{btc2eth},
89                                 []*common.Order{
90                                         mock.Btc2EthOrders[1], mock.Btc2EthOrders[2], mock.Btc2EthOrders[3],
91                                 }),
92                         initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[0]},
93                         popOrders: []*common.TradePair{btc2eth},
94                         wantPeekedOrders: map[common.TradePair]*common.Order{
95                                 *btc2eth: mock.Btc2EthOrders[0],
96                         },
97                 },
98                 {
99                         desc: "has arrival delete orders, no add order, no pop order",
100                         initMovStore: mock.NewMovStore(
101                                 []*common.TradePair{btc2eth},
102                                 []*common.Order{
103                                         mock.Btc2EthOrders[1], mock.Btc2EthOrders[2], mock.Btc2EthOrders[3],
104                                 }),
105                         initArrivalDelOrders: []*common.Order{mock.Btc2EthOrders[3]},
106                         wantPeekedOrders: map[common.TradePair]*common.Order{
107                                 *btc2eth: mock.Btc2EthOrders[2],
108                         },
109                 },
110                 {
111                         desc: "has arrival delete orders and arrival add orders, no add order, no pop order, the arrival order is lower price",
112                         initMovStore: mock.NewMovStore(
113                                 []*common.TradePair{btc2eth},
114                                 []*common.Order{
115                                         mock.Btc2EthOrders[3], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
116                                 }),
117                         initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[0]},
118                         initArrivalDelOrders: []*common.Order{mock.Btc2EthOrders[3]},
119                         wantPeekedOrders: map[common.TradePair]*common.Order{
120                                 *btc2eth: mock.Btc2EthOrders[0],
121                         },
122                 },
123                 {
124                         desc: "has arrival delete orders and arrival add orders, no add order, pop one order",
125                         initMovStore: mock.NewMovStore(
126                                 []*common.TradePair{btc2eth},
127                                 []*common.Order{
128                                         mock.Btc2EthOrders[3], mock.Btc2EthOrders[1],
129                                 }),
130                         initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[0], mock.Btc2EthOrders[2]},
131                         initArrivalDelOrders: []*common.Order{mock.Btc2EthOrders[3]},
132                         popOrders: []*common.TradePair{btc2eth},
133                         wantPeekedOrders: map[common.TradePair]*common.Order{
134                                 *btc2eth: mock.Btc2EthOrders[2],
135                         },
136                 },
137                 {
138                         desc: "has arrival add orders, but db order is empty",
139                         initMovStore: mock.NewMovStore(
140                                 []*common.TradePair{btc2eth},
141                                 []*common.Order{}),
142                         initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[0], mock.Btc2EthOrders[2]},
143                         wantPeekedOrders: map[common.TradePair]*common.Order{
144                                 *btc2eth: mock.Btc2EthOrders[0],
145                         },
146                 },
147                 {
148                         desc: "no add orders, and db order is empty",
149                         initMovStore: mock.NewMovStore(
150                                 []*common.TradePair{btc2eth},
151                                 []*common.Order{}),
152                         initArrivalAddOrders: []*common.Order{},
153                         wantPeekedOrders: map[common.TradePair]*common.Order{
154                                 *btc2eth: nil,
155                         },
156                 },
157         }
158
159         for i, c := range cases {
160                 orderTable := NewOrderTable(c.initMovStore, c.initArrivalAddOrders, c.initArrivalDelOrders)
161                 for _, order := range c.addOrders {
162                         if err := orderTable.AddOrder(order); err != nil {
163                                 t.Fatal(err)
164                         }
165                 }
166
167                 for _, tradePair := range c.popOrders {
168                         orderTable.PopOrder(tradePair)
169                 }
170
171                 for tradePair, wantOrder := range c.wantPeekedOrders {
172                         gotOrder := orderTable.PeekOrder(&tradePair)
173                         if wantOrder == gotOrder && wantOrder == nil {
174                                 continue
175                         }
176
177                         if wantOrder != nil && gotOrder != nil && gotOrder.Key() != wantOrder.Key() {
178                                 t.Errorf("#%d(%s):the key of got order(%v) is not equals key of want order(%v)", i, c.desc, gotOrder, wantOrder)
179                         }
180                 }
181         }
182 }