mirror of
https://github.com/luxfi/dex.git
synced 2026-09-24 00:26:31 +00:00
- Remove orderbook_extra_test.go (duplicate tests) - Remove orderbook_untested_test.go (duplicate tests) - Remove orderbook_coverage_test.go (duplicate tests) - Rename orderbook_extended_simple_test.go to orderbook_extended_test.go - Rename orderbook_additional_test.go to funding_test.go (more accurate name) Final test structure: - orderbook_test.go: core basic tests - orderbook_advanced_test.go: advanced order types, heap tests - orderbook_core_test.go: matching, edge cases, performance - orderbook_extended_test.go: ExtendedOrderBook tests - orderbook_server_test.go: server component tests - funding_test.go: funding, margin, risk engine tests All tests pass after consolidation.
309 lines
7.4 KiB
Go
309 lines
7.4 KiB
Go
package lx
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
// Test extended orderbook functions with 0% coverage - simple version to avoid deadlocks
|
|
func TestExtendedOrderBookSimple(t *testing.T) {
|
|
t.Run("NewExtendedOrderBook", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
assert.NotNil(t, book)
|
|
assert.Equal(t, "BTC-USDT", book.Symbol)
|
|
assert.NotNil(t, book.OrderBook)
|
|
assert.NotNil(t, book.subscribers)
|
|
assert.NotNil(t, book.stopBuyOrders)
|
|
assert.NotNil(t, book.stopSellOrders)
|
|
assert.NotNil(t, book.icebergOrders)
|
|
})
|
|
|
|
t.Run("Subscribe", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("ETH-USDT")
|
|
ch := make(chan MarketDataUpdate, 10)
|
|
|
|
book.Subscribe(ch)
|
|
|
|
// Verify subscription was added
|
|
assert.Equal(t, 1, len(book.subscribers))
|
|
})
|
|
|
|
t.Run("Unsubscribe", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("ETH-USDT")
|
|
ch := make(chan MarketDataUpdate, 10)
|
|
|
|
// First subscribe
|
|
book.Subscribe(ch)
|
|
assert.Equal(t, 1, len(book.subscribers))
|
|
|
|
// Then unsubscribe
|
|
book.Unsubscribe(ch)
|
|
assert.Equal(t, 0, len(book.subscribers))
|
|
})
|
|
|
|
t.Run("publishUpdate", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
ch := make(chan MarketDataUpdate, 10)
|
|
book.Subscribe(ch)
|
|
|
|
update := MarketDataUpdate{
|
|
Type: "order_added",
|
|
Symbol: "BTC-USDT",
|
|
Timestamp: time.Now(),
|
|
}
|
|
|
|
// This should not block and should publish to subscribers
|
|
book.publishUpdate(update)
|
|
|
|
// Check that update was received
|
|
select {
|
|
case receivedUpdate := <-ch:
|
|
assert.Equal(t, "order_added", receivedUpdate.Type)
|
|
assert.Equal(t, "BTC-USDT", receivedUpdate.Symbol)
|
|
case <-time.After(100 * time.Millisecond):
|
|
t.Fatal("Update was not received within timeout")
|
|
}
|
|
})
|
|
|
|
t.Run("validateOrder", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
// Test valid order
|
|
validOrder := &Order{
|
|
ID: 1,
|
|
Type: Limit,
|
|
Side: Buy,
|
|
Size: 1.0,
|
|
Price: 50000,
|
|
User: "user1",
|
|
Timestamp: time.Now(),
|
|
}
|
|
|
|
err := book.validateOrder(validOrder)
|
|
assert.NoError(t, err)
|
|
|
|
// Test invalid order with zero size
|
|
invalidOrder := &Order{
|
|
ID: 2,
|
|
Type: Limit,
|
|
Side: Buy,
|
|
Size: 0,
|
|
Price: 50000,
|
|
User: "user2",
|
|
Timestamp: time.Now(),
|
|
}
|
|
|
|
err = book.validateOrder(invalidOrder)
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "order size must be positive")
|
|
})
|
|
|
|
t.Run("wouldSelfTrade", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
// Test order that would not self-trade (no existing orders)
|
|
nonSelfTradeOrder := &Order{
|
|
ID: 3,
|
|
Type: Limit,
|
|
Side: Sell,
|
|
Size: 0.5,
|
|
Price: 50000,
|
|
User: "user2",
|
|
Timestamp: time.Now(),
|
|
}
|
|
|
|
result := book.wouldSelfTrade(nonSelfTradeOrder)
|
|
assert.False(t, result)
|
|
})
|
|
|
|
t.Run("wouldCrossSpread", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
// Test order - this is simplified implementation so will return false
|
|
crossingOrder := &Order{
|
|
ID: 3,
|
|
Type: Limit,
|
|
Side: Buy,
|
|
Size: 0.5,
|
|
Price: 52000, // Higher than best ask
|
|
User: "user3",
|
|
Timestamp: time.Now(),
|
|
}
|
|
|
|
result := book.wouldCrossSpread(crossingOrder)
|
|
// Note: The actual implementation always returns false (simplified)
|
|
assert.False(t, result)
|
|
})
|
|
|
|
t.Run("addStopOrder", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
stopOrder := &Order{
|
|
ID: 1,
|
|
Type: StopLimit,
|
|
Side: Sell,
|
|
Size: 1.0,
|
|
Price: 49000,
|
|
StopPrice: 49500,
|
|
User: "user1",
|
|
Timestamp: time.Now(),
|
|
}
|
|
|
|
_, err := book.addStopOrder(stopOrder)
|
|
assert.NoError(t, err)
|
|
|
|
// Verify stop order was added to appropriate side
|
|
if stopOrder.Side == Sell {
|
|
assert.Equal(t, 1, len(book.stopSellOrders))
|
|
assert.Contains(t, book.stopSellOrders, stopOrder.ID)
|
|
} else {
|
|
assert.Equal(t, 1, len(book.stopBuyOrders))
|
|
assert.Contains(t, book.stopBuyOrders, stopOrder.ID)
|
|
}
|
|
})
|
|
|
|
t.Run("addIcebergOrder", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
icebergOrder := &Order{
|
|
ID: 1,
|
|
Type: Iceberg,
|
|
Side: Buy,
|
|
Size: 10.0,
|
|
Price: 50000,
|
|
DisplaySize: 2.0,
|
|
User: "user1",
|
|
Timestamp: time.Now(),
|
|
}
|
|
|
|
_, err := book.addIcebergOrder(icebergOrder)
|
|
assert.NoError(t, err)
|
|
|
|
// Verify iceberg order was added
|
|
assert.Equal(t, 1, len(book.icebergOrders))
|
|
assert.Contains(t, book.icebergOrders, icebergOrder.ID)
|
|
})
|
|
|
|
t.Run("CheckStopOrders", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
// Add a stop order
|
|
stopOrder := &Order{
|
|
ID: 1,
|
|
Type: StopLimit,
|
|
Side: Sell,
|
|
Size: 1.0,
|
|
Price: 49000,
|
|
StopPrice: 49500,
|
|
User: "user1",
|
|
Timestamp: time.Now(),
|
|
}
|
|
book.addStopOrder(stopOrder)
|
|
|
|
// Check stop orders with a price that should trigger
|
|
currentPrice := 49400.0
|
|
book.CheckStopOrders(currentPrice)
|
|
|
|
// Basic verification that method executed
|
|
assert.NotNil(t, book.stopSellOrders)
|
|
})
|
|
|
|
t.Run("GetDepth", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
depth := book.GetDepth(5)
|
|
assert.NotNil(t, depth)
|
|
assert.True(t, len(depth.Bids) >= 0)
|
|
assert.True(t, len(depth.Asks) >= 0)
|
|
})
|
|
|
|
t.Run("GetSnapshot", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
snapshot := book.GetSnapshot()
|
|
assert.NotNil(t, snapshot)
|
|
assert.Equal(t, "BTC-USDT", snapshot.Symbol)
|
|
assert.NotNil(t, snapshot.Bids)
|
|
assert.NotNil(t, snapshot.Asks)
|
|
})
|
|
|
|
t.Run("Reset", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
// Add a stop order first
|
|
stopOrder := &Order{
|
|
ID: 1,
|
|
Type: StopLimit,
|
|
Side: Sell,
|
|
Size: 1.0,
|
|
Price: 49000,
|
|
StopPrice: 49500,
|
|
User: "user1",
|
|
Timestamp: time.Now(),
|
|
}
|
|
book.addStopOrder(stopOrder)
|
|
|
|
// Clear the book using Reset
|
|
book.Reset()
|
|
|
|
// Verify all orders were cleared
|
|
assert.Equal(t, 0, len(book.stopBuyOrders))
|
|
assert.Equal(t, 0, len(book.stopSellOrders))
|
|
assert.Equal(t, 0, len(book.icebergOrders))
|
|
})
|
|
|
|
t.Run("GetStatistics", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
stats := book.GetStatistics()
|
|
assert.NotNil(t, stats)
|
|
assert.Equal(t, "BTC-USDT", stats["symbol"])
|
|
assert.NotNil(t, stats["total_orders"])
|
|
assert.NotNil(t, stats["stop_orders"])
|
|
assert.NotNil(t, stats["iceberg_orders"])
|
|
})
|
|
|
|
t.Run("GetBestPrices", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
bestBid, bestAsk := book.GetBestPrices()
|
|
// Simplified implementation returns 0.0
|
|
assert.Equal(t, 0.0, bestBid)
|
|
assert.Equal(t, 0.0, bestAsk)
|
|
})
|
|
|
|
t.Run("GetSpread", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
spread := book.GetSpread()
|
|
assert.Equal(t, 0.0, spread) // Simplified implementation
|
|
})
|
|
|
|
t.Run("GetMidPrice", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
midPrice := book.GetMidPrice()
|
|
assert.Equal(t, 0.0, midPrice) // Simplified implementation
|
|
})
|
|
|
|
t.Run("GetVWAP", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
vwap, err := book.GetVWAP(Buy, 3.0)
|
|
// Simplified implementation returns error
|
|
assert.Error(t, err)
|
|
assert.Equal(t, 0.0, vwap)
|
|
})
|
|
|
|
t.Run("GetMarketImpact", func(t *testing.T) {
|
|
book := NewExtendedOrderBook("BTC-USDT")
|
|
|
|
impact, err := book.GetMarketImpact(Buy, 100.0)
|
|
// Will return error due to GetVWAP error
|
|
assert.Error(t, err)
|
|
assert.Equal(t, 0.0, impact)
|
|
})
|
|
}
|