summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test_trade_queue.py84
1 files changed, 83 insertions, 1 deletions
diff --git a/test_trade_queue.py b/test_trade_queue.py
index 46e8c0d..9ce0410 100644
--- a/test_trade_queue.py
+++ b/test_trade_queue.py
@@ -3,6 +3,7 @@ import unittest
from datetime import datetime
from exceptions import TradeNotFound
+from trade import Trade
from trade_queue import FIFOQueue
@@ -149,7 +150,7 @@ class TestFIFOQueueRemove(unittest.TestCase):
self.fifo_queue.add(Decimal("10"), Decimal("100"), "2025-04-01 11:11:00")
lt = self.fifo_queue.get_copy()
self.assertTrue(
- all(lt[i].timestamp <= lt[i+1].timestamp for i in range(len(lt) - 1))
+ all(lt[i].timestamp <= lt[i + 1].timestamp for i in range(len(lt) - 1))
)
def test_remove_successful(self):
@@ -188,5 +189,86 @@ class TestFIFOQueueRemove(unittest.TestCase):
self.assertEqual(len(self.fifo_queue), 4)
+class TestFIFOQueueMatchTrades(unittest.TestCase):
+
+ def setUp(self):
+ """Set up a new FIFOQueue for each test case."""
+ self.fifo_queue = FIFOQueue()
+
+ def test_full_match_single_buy_trade(self):
+ """Test if a single buy trade fully matches a sell trade."""
+ self.fifo_queue.add_trade(Trade(Decimal(5), Decimal(50), "2025-04-19 10:00:00"))
+ self.fifo_queue.add_trade(
+ Trade(Decimal(-5), Decimal(-75), "2025-04-19 12:00:00")
+ )
+
+ matches = self.fifo_queue.match_trades()
+
+ self.assertEqual(len(matches), 1)
+ self.assertEqual(matches[0][0].amount, Decimal(5)) # Buy trade amount
+ self.assertEqual(matches[0][1].amount, Decimal(5)) # Sell trade amount
+
+ def test_error_single_buy_trade_invalid_order(self):
+ """Test if a trade match fails if sell date is before buy date."""
+ self.fifo_queue.add_trade(Trade(Decimal(5), Decimal(50), "2025-04-19 10:00:00"))
+ self.fifo_queue.add_trade(
+ Trade(Decimal(-5), Decimal(-75), "2025-04-18 12:00:00")
+ )
+
+ with self.assertRaises(ValueError):
+ self.fifo_queue.match_trades()
+
+ def test_partial_match_multiple_buy_trades(self):
+ """Test if a sell trade partially matches multiple buy trades."""
+ self.fifo_queue.add_trade(Trade(Decimal(3), Decimal(30), "2025-04-19 10:00:00"))
+ self.fifo_queue.add_trade(Trade(Decimal(4), Decimal(48), "2025-04-19 11:00:00"))
+ self.fifo_queue.add_trade(
+ Trade(Decimal(-5), Decimal(-65), "2025-04-19 12:00:00")
+ )
+
+ matches = self.fifo_queue.match_trades()
+
+ self.assertEqual(len(matches), 2)
+ # First buy trade (fully matched)
+ self.assertEqual(matches[0][0].amount, Decimal(3))
+ # Portion of sell trade
+ self.assertEqual(matches[0][1].amount, Decimal(3))
+ # Portion of second buy trade
+ self.assertEqual(matches[1][0].amount, Decimal(2))
+ # Remaining sell trade
+ self.assertEqual(matches[1][1].amount, Decimal(2))
+ # check remaining amount in queue
+ self.assertEqual(self.fifo_queue.get_remaining_amount(), Decimal(2))
+
+ def test_sell_trade_exceeds_buy_trades(self):
+ """Test if an error is raised when a sell trade exceeds available buy trades."""
+ self.fifo_queue.add_trade(Trade(Decimal(3), Decimal(30), "2025-04-19 10:00:00"))
+ self.fifo_queue.add_trade(
+ Trade(Decimal(-5), Decimal(-75), "2025-04-19 12:00:00")
+ )
+
+ with self.assertRaises(ValueError):
+ self.fifo_queue.match_trades()
+
+ def test_no_sell_trade(self):
+ """Test behavior when there are no sell trades."""
+ self.fifo_queue.add_trade(Trade(Decimal(5), Decimal(50), "2025-04-19 10:00:00"))
+
+ matches = self.fifo_queue.match_trades()
+ # No matches since no sell trade exists
+ self.assertEqual(len(matches), 0)
+
+ def test_no_buy_trades(self):
+ """Test behavior when there are no buy trades."""
+ self.fifo_queue.add_trade(
+ Trade(Decimal(-5), Decimal(-75), "2025-04-19 12:00:00")
+ )
+
+ with self.assertRaises(ValueError):
+ self.fifo_queue.match_trades()
+
+
+
+
if __name__ == "__main__":
unittest.main()