--- /dev/null
+package database
+
+import (
+ "sort"
+
+ "github.com/vapor/application/mov/common"
+ "github.com/vapor/errors"
+ "github.com/vapor/protocol/bc"
+ "github.com/vapor/protocol/bc/types"
+)
+
+type MockMovStore struct {
+ TradePairs []*common.TradePair
+ OrderMap map[string][]*common.Order
+ DBState *common.MovDatabaseState
+}
+
+func (m *MockMovStore) GetMovDatabaseState() (*common.MovDatabaseState, error) {
+ return m.DBState, nil
+}
+
+func (m *MockMovStore) ListOrders(orderAfter *common.Order) ([]*common.Order, error) {
+ tradePair := &common.TradePair{FromAssetID: orderAfter.FromAssetID, ToAssetID: orderAfter.ToAssetID}
+ orders := m.OrderMap[tradePair.Key()]
+ begin := len(orders)
+ if orderAfter.Rate == 0 {
+ begin = 0
+ } else {
+ for i, order := range orders {
+ if order.Rate == orderAfter.Rate {
+ begin = i + 1
+ break
+ }
+ }
+ }
+ var result []*common.Order
+ for i := begin; i < len(orders) && len(result) < 3; i++ {
+ result = append(result, orders[i])
+ }
+ return result, nil
+}
+
+func (m *MockMovStore) ListTradePairsWithStart(fromAssetIDAfter, toAssetIDAfter *bc.AssetID) ([]*common.TradePair, error) {
+ begin := len(m.TradePairs)
+ if fromAssetIDAfter == nil || toAssetIDAfter == nil {
+ begin = 0
+ } else {
+ for i, tradePair := range m.TradePairs {
+ if *tradePair.FromAssetID == *fromAssetIDAfter && *tradePair.ToAssetID == *toAssetIDAfter {
+ begin = i + 1
+ break
+ }
+ }
+ }
+ var result []*common.TradePair
+ for i := begin; i < len(m.TradePairs) && len(result) < 3; i++ {
+ result = append(result, m.TradePairs[i])
+ }
+ return result, nil
+}
+
+type OrderSlice []*common.Order
+
+func (o OrderSlice) Len() int {
+ return len(o)
+}
+func (o OrderSlice) Swap(i, j int) {
+ o[i], o[j] = o[j], o[i]
+}
+func (o OrderSlice) Less(i, j int) bool {
+ return o[i].Rate < o[j].Rate
+}
+
+func (m *MockMovStore) ProcessOrders(addOrders []*common.Order, delOrders []*common.Order, blockHeader *types.BlockHeader) error {
+ for _, order := range addOrders {
+ tradePair := &common.TradePair{FromAssetID: order.FromAssetID, ToAssetID: order.ToAssetID}
+ m.OrderMap[tradePair.Key()] = append(m.OrderMap[tradePair.Key()], order)
+ }
+ for _, delOrder := range delOrders {
+ tradePair := &common.TradePair{FromAssetID: delOrder.FromAssetID, ToAssetID: delOrder.ToAssetID}
+ orders := m.OrderMap[tradePair.Key()]
+ for i, order := range orders {
+ if delOrder.Key() == order.Key() {
+ m.OrderMap[tradePair.Key()] = append(orders[0:i], orders[i+1:]...)
+ }
+ }
+ }
+ for _, orders := range m.OrderMap {
+ sort.Sort(OrderSlice(orders))
+ }
+
+ if blockHeader.Height == m.DBState.Height {
+ m.DBState = &common.MovDatabaseState{Height: blockHeader.Height - 1, Hash: &blockHeader.PreviousBlockHash}
+ } else if blockHeader.Height == m.DBState.Height+1 {
+ blockHash := blockHeader.Hash()
+ m.DBState = &common.MovDatabaseState{Height: blockHeader.Height, Hash: &blockHash}
+ } else {
+ return errors.New("error block header")
+ }
+ return nil
+}