6 "github.com/bytom/vapor/application/mov/common"
7 "github.com/bytom/vapor/application/mov/database"
8 "github.com/bytom/vapor/application/mov/mock"
12 btc2eth = &common.TradePair{FromAssetID: &mock.BTC, ToAssetID: &mock.ETH}
15 func TestOrderBook(t *testing.T) {
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
26 desc: "no arrival orders, no add order, no pop order",
27 initMovStore: mock.NewMovStore(
28 []*common.TradePair{btc2eth},
30 mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
33 wantPeekedOrders: map[common.TradePair]*common.Order{
34 *btc2eth: mock.Btc2EthOrders[0],
38 desc: "no arrival orders, add lower price order, no pop order",
39 initMovStore: mock.NewMovStore(
40 []*common.TradePair{btc2eth},
42 mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
44 addOrders: []*common.Order{mock.Btc2EthOrders[3]},
45 wantPeekedOrders: map[common.TradePair]*common.Order{
46 *btc2eth: mock.Btc2EthOrders[3],
50 desc: "no arrival orders, no add order, pop one order",
51 initMovStore: mock.NewMovStore(
52 []*common.TradePair{btc2eth},
54 mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
56 popOrders: []*common.TradePair{btc2eth},
57 wantPeekedOrders: map[common.TradePair]*common.Order{
58 *btc2eth: mock.Btc2EthOrders[2],
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},
66 mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
68 initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[3]},
69 wantPeekedOrders: map[common.TradePair]*common.Order{
70 *btc2eth: mock.Btc2EthOrders[3],
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},
78 mock.Btc2EthOrders[0], mock.Btc2EthOrders[1],
80 initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[2]},
81 wantPeekedOrders: map[common.TradePair]*common.Order{
82 *btc2eth: mock.Btc2EthOrders[0],
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},
90 mock.Btc2EthOrders[1], mock.Btc2EthOrders[2], mock.Btc2EthOrders[3],
92 initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[0]},
93 popOrders: []*common.TradePair{btc2eth},
94 wantPeekedOrders: map[common.TradePair]*common.Order{
95 *btc2eth: mock.Btc2EthOrders[0],
99 desc: "has arrival delete orders, no add order, no pop order",
100 initMovStore: mock.NewMovStore(
101 []*common.TradePair{btc2eth},
103 mock.Btc2EthOrders[1], mock.Btc2EthOrders[2], mock.Btc2EthOrders[3],
105 initArrivalDelOrders: []*common.Order{mock.Btc2EthOrders[3]},
106 wantPeekedOrders: map[common.TradePair]*common.Order{
107 *btc2eth: mock.Btc2EthOrders[2],
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},
115 mock.Btc2EthOrders[3], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2],
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],
124 desc: "has arrival delete orders and arrival add orders, no add order, pop one order",
125 initMovStore: mock.NewMovStore(
126 []*common.TradePair{btc2eth},
128 mock.Btc2EthOrders[3], mock.Btc2EthOrders[1],
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],
138 desc: "has arrival add orders, but db order is empty",
139 initMovStore: mock.NewMovStore(
140 []*common.TradePair{btc2eth},
142 initArrivalAddOrders: []*common.Order{mock.Btc2EthOrders[0], mock.Btc2EthOrders[2]},
143 wantPeekedOrders: map[common.TradePair]*common.Order{
144 *btc2eth: mock.Btc2EthOrders[0],
148 desc: "no add orders, and db order is empty",
149 initMovStore: mock.NewMovStore(
150 []*common.TradePair{btc2eth},
152 initArrivalAddOrders: []*common.Order{},
153 wantPeekedOrders: map[common.TradePair]*common.Order{
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},
162 mock.Btc2EthOrders[0], mock.Btc2EthOrders[1], mock.Btc2EthOrders[2], mock.Btc2EthOrders[3],
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],
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 {
180 for _, tradePair := range c.popOrders {
181 orderBook.PopOrder(tradePair)
184 for tradePair, wantOrder := range c.wantPeekedOrders {
185 gotOrder := orderBook.PeekOrder(&tradePair)
186 if wantOrder == gotOrder && wantOrder == nil {
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)