decred.org/dcrdex@v1.0.5/server/db/interface_test.go (about) 1 // This code is available on the terms of the project LICENSE.md file, 2 // also available online at https://blueoakcouncil.org/license/1.0.0. 3 4 package db 5 6 import ( 7 "encoding/hex" 8 "testing" 9 10 "decred.org/dcrdex/dex" 11 "decred.org/dcrdex/dex/order" 12 ) 13 14 func TestValidateOrder(t *testing.T) { 15 mktInfo, err := dex.NewMarketInfoFromSymbols("dcr", "btc", LotSize, RateStep, EpochDuration, 0, MarketBuyBuffer) 16 if err != nil { 17 t.Fatalf("invalid market: %v", err) 18 } 19 20 AssetDCR = mktInfo.Base 21 AssetBTC = mktInfo.Quote 22 23 orderBadLotSize := newLimitOrder(false, 4900000, 1, order.StandingTiF, 0) 24 orderBadLotSize.Quantity /= 2 25 26 orderBadType := newLimitOrder(false, 4900000, 1, order.StandingTiF, 0) 27 orderBadType.OrderType = order.CancelOrderType // bad type 28 29 orderBadMarket := newLimitOrder(false, 4900000, 1, order.StandingTiF, 0) 30 orderBadMarket.BaseAsset = AssetDCR 31 orderBadMarket.QuoteAsset = AssetDCR // same as base 32 33 marketOrderBadType := newMarketSellOrder(1, 0) 34 marketOrderBadType.OrderType = order.CancelOrderType // wrong type 35 36 marketOrderBadAmt := newMarketSellOrder(1, 0) 37 marketOrderBadAmt.Quantity /= 2 38 39 marketOrderBadRemaining := newMarketSellOrder(1, 0) 40 marketOrderBadRemaining.FillAmt = marketOrderBadAmt.Quantity / 2 41 42 // order ID for a cancel order 43 orderID0, _ := hex.DecodeString("dd64e2ae2845d281ba55a6d46eceb9297b2bdec5c5bada78f9ae9e373164df0d") 44 var targetOrderID order.OrderID 45 copy(targetOrderID[:], orderID0) 46 47 cancelOrderBadType := newCancelOrder(targetOrderID, AssetDCR, AssetBTC, 0) 48 cancelOrderBadType.OrderType = order.LimitOrderType // wrong type 49 50 type args struct { 51 ord order.Order 52 status order.OrderStatus 53 mkt *dex.MarketInfo 54 } 55 tests := []struct { 56 name string 57 args args 58 want bool 59 }{ 60 { 61 name: "limit booked immediate (bad)", 62 args: args{ 63 ord: newLimitOrder(false, 4900000, 1, order.ImmediateTiF, 0), 64 status: order.OrderStatusBooked, 65 mkt: mktInfo, 66 }, 67 want: false, 68 }, 69 { 70 name: "unknown order status", 71 args: args{ 72 ord: newMarketSellOrder(1, 0), 73 status: order.OrderStatusUnknown, 74 mkt: mktInfo, 75 }, 76 want: false, 77 }, 78 { 79 name: "bad lot size", 80 args: args{ 81 ord: orderBadLotSize, 82 status: order.OrderStatusEpoch, 83 mkt: mktInfo, 84 }, 85 want: false, 86 }, 87 { 88 name: "bad order type", 89 args: args{ 90 ord: orderBadType, 91 status: order.OrderStatusEpoch, 92 mkt: mktInfo, 93 }, 94 want: false, 95 }, 96 { 97 name: "bad market", 98 args: args{ 99 ord: orderBadMarket, 100 status: order.OrderStatusEpoch, 101 mkt: mktInfo, 102 }, 103 want: false, 104 }, 105 { 106 name: "ok", 107 args: args{ 108 ord: newMarketSellOrder(1, 0), 109 status: order.OrderStatusEpoch, 110 mkt: mktInfo, 111 }, 112 want: true, 113 }, 114 { 115 name: "market order bad status (booked)", 116 args: args{ 117 ord: newMarketSellOrder(1, 0), 118 status: order.OrderStatusBooked, 119 mkt: mktInfo, 120 }, 121 want: false, 122 }, 123 { 124 name: "market order bad status (canceled)", 125 args: args{ 126 ord: newMarketSellOrder(1, 0), 127 status: order.OrderStatusCanceled, 128 mkt: mktInfo, 129 }, 130 want: false, 131 }, 132 { 133 name: "market order bad type", 134 args: args{ 135 ord: marketOrderBadType, 136 status: order.OrderStatusEpoch, 137 mkt: mktInfo, 138 }, 139 want: false, 140 }, 141 { 142 name: "market order bad amount", 143 args: args{ 144 ord: marketOrderBadAmt, 145 status: order.OrderStatusEpoch, 146 mkt: mktInfo, 147 }, 148 want: false, 149 }, 150 { 151 name: "market order bad remaining", 152 args: args{ 153 ord: marketOrderBadRemaining, 154 status: order.OrderStatusEpoch, 155 mkt: mktInfo, 156 }, 157 want: false, 158 }, 159 { 160 name: "cancel bad status (booked)", 161 args: args{ 162 ord: newCancelOrder(targetOrderID, AssetDCR, AssetBTC, 0), 163 status: order.OrderStatusBooked, 164 mkt: mktInfo, 165 }, 166 want: false, 167 }, 168 { 169 name: "cancel bad status (canceled)", 170 args: args{ 171 ord: newCancelOrder(targetOrderID, AssetDCR, AssetBTC, 0), 172 status: order.OrderStatusBooked, 173 mkt: mktInfo, 174 }, 175 want: false, 176 }, 177 { 178 name: "cancel bad status (booked)", 179 args: args{ 180 ord: newCancelOrder(targetOrderID, AssetDCR, AssetBTC, 0), 181 status: order.OrderStatusBooked, 182 mkt: mktInfo, 183 }, 184 want: false, 185 }, 186 { 187 name: "cancel bad type (limit)", 188 args: args{ 189 ord: cancelOrderBadType, 190 status: order.OrderStatusEpoch, 191 mkt: mktInfo, 192 }, 193 want: false, 194 }, 195 } 196 for _, tt := range tests { 197 t.Run(tt.name, func(t *testing.T) { 198 if got := ValidateOrder(tt.args.ord, tt.args.status, tt.args.mkt); got != tt.want { 199 t.Errorf("ValidateOrder() = %v, want %v", got, tt.want) 200 } 201 }) 202 } 203 }