OSDN Git Service

e401970260e435f77d7211b928e7d515894c7b41
[bytom/vapor.git] / application / mov / match / order_book_test.go
1 package match
2
3 import (
4         "testing"
5
6         "github.com/bytom/vapor/application/mov/common"
7         "github.com/bytom/vapor/application/mov/database"
8         "github.com/bytom/vapor/application/mov/mock"
9 )
10
11 var (
12         btc2eth = &common.TradePair{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH}
13 )
14
15 func TestOrderBook(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                         desc: "has arrival delete orders, no add order, no pop order, need recursive to peek one order",
159                         initMovStore: mock.NewMovStore(
160                                 []*common.TradePair{btc2eth},
161                                 []*common.Order{
162                                         mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2], mock.Btc2EthOrders[3],
163                                 }),
164                         initArrivalAddOrders: []*common.Order{},
165                         initArrivalDelOrders: []*common.Order{mock.Btc2EthOrders[3], mock.Btc2EthOrders[0], mock.Btc2EthOrders[2]},
166                         wantPeekedOrders: map[common.TradePair]*common.Order{
167                                 *btc2eth: mock.Btc2EthOrders[1],
168                         },
169                 },
170         }
171
172         for i, c := range cases {
173                 orderBook := NewOrderBook(c.initMovStore, c.initArrivalAddOrders, c.initArrivalDelOrders)
174                 for _, order := range c.addOrders {
175                         if err := orderBook.AddOrder(order); err != nil {
176                                 t.Fatal(err)
177                         }
178                 }
179
180                 for _, tradePair := range c.popOrders {
181                         orderBook.PopOrder(tradePair)
182                 }
183
184                 for tradePair, wantOrder := range c.wantPeekedOrders {
185                         gotOrder := orderBook.PeekOrder(&tradePair)
186                         if wantOrder == gotOrder && wantOrder == nil {
187                                 continue
188                         }
189
190                         if gotOrder.Key() != wantOrder.Key() {
191                                 t.Errorf("#%d(%s):the key of got order(%v) is not equals key of want order(%v)", i, c.desc, gotOrder, wantOrder)
192                         }
193                 }
194         }
195 }