summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test_trade_queue.py89
1 files changed, 88 insertions, 1 deletions
diff --git a/test_trade_queue.py b/test_trade_queue.py
index 0aaae65..5e0e434 100644
--- a/test_trade_queue.py
+++ b/test_trade_queue.py
@@ -240,7 +240,7 @@ class TestFIFOQueueMatchTrades(unittest.TestCase):
Trade(Decimal(-5), Decimal(-75), "2025-04-18 12:00:00")
)
- with self.assertRaises(ValueError):
+ with self.assertRaises((ValueError, AssertionError)):
self.fifo_queue.match_trades()
def test_partial_match_multiple_buy_trades(self):
@@ -293,6 +293,93 @@ class TestFIFOQueueMatchTrades(unittest.TestCase):
self.fifo_queue.match_trades()
+class TestFIFOQueueMultipleSellTrades(unittest.TestCase):
+ def setUp(self):
+ """Set up a new FIFOQueue for each test case."""
+ self.fifo_queue = FIFOQueue()
+
+ def test_all_sell_trades_with_exact_matching_buy_trades(self):
+ """Test if all sell trades are matched with buy trades."""
+ # Add buy trades
+ self.fifo_queue.add_trade(Trade(Decimal(5), Decimal(50), "2025-04-19 10:00:00"))
+ self.fifo_queue.add_trade(Trade(Decimal(3), Decimal(36), "2025-04-19 11:00:00"))
+ self.fifo_queue.add_trade(Trade(Decimal(4), Decimal(48), "2025-04-19 12:00:00"))
+
+ # Add sell trades
+ self.fifo_queue.add_trade(
+ Trade(-Decimal(5), -Decimal(75), "2025-04-19 13:00:00")
+ )
+ self.fifo_queue.add_trade(
+ Trade(-Decimal(3), -Decimal(60), "2025-04-19 14:00:00")
+ )
+ self.fifo_queue.add_trade(
+ Trade(-Decimal(4), -Decimal(80), "2025-04-19 15:00:00")
+ )
+
+ matches = self.fifo_queue.match_trades()
+
+ # Check that all sell trades are matched
+ self.assertEqual(len(matches), 3)
+ # Buy trade
+ self.assertEqual(matches[0][0].amount, Decimal(5))
+ # Sell trade
+ self.assertEqual(matches[0][1].amount, Decimal(5))
+ # Buy trade
+ self.assertEqual(matches[1][0].amount, Decimal(3))
+ # Sell trade
+ self.assertEqual(matches[1][1].amount, Decimal(3))
+ # Buy trade
+ self.assertEqual(matches[2][0].amount, Decimal(4))
+ # Sell trade
+ self.assertEqual(matches[2][1].amount, Decimal(4))
+
+ def test_partial_matching_for_all_sell_trades(self):
+ """Test if all sell trades are partially matched with buy trades."""
+ # Add 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(40), "2025-04-19 11:00:00"))
+
+ # Add sell trades
+ self.fifo_queue.add_trade(
+ Trade(-Decimal(5), -Decimal(75), "2025-04-19 12:00:00")
+ )
+ self.fifo_queue.add_trade(
+ Trade(-Decimal(2), -Decimal(30), "2025-04-19 13:00:00")
+ )
+
+ matches = self.fifo_queue.match_trades()
+
+ self.assertEqual(len(matches), 3)
+ # First buy trade (fully used)
+ self.assertEqual(matches[0][0].amount, Decimal(3))
+ # Portion of first sell trade
+ self.assertEqual(matches[0][1].amount, Decimal(3))
+ # Portion of second buy trade
+ self.assertEqual(matches[1][0].amount, Decimal(2))
+ # Remaining first sell trade
+ self.assertEqual(matches[1][1].amount, Decimal(2))
+ # Portion of remaining buy trade
+ self.assertEqual(matches[2][0].amount, Decimal(2))
+ # Remaining sell trade
+ self.assertEqual(matches[2][1].amount, Decimal(2))
+
+ self.assertEqual(self.fifo_queue.get_remaining_amount(), 0)
+
+ def test_insufficient_buy_trades_for_all_sell_trades(self):
+ """Test if an error is raised when there are not enough buy trades to match all sell trades."""
+ # Add buy trades
+ self.fifo_queue.add_trade(Trade(Decimal(6), Decimal(30), "2025-04-19 10:00:00"))
+
+ # Add sell trades
+ self.fifo_queue.add_trade(
+ Trade(-Decimal(5), -Decimal(75), "2025-04-19 12:00:00")
+ )
+ self.fifo_queue.add_trade(
+ Trade(-Decimal(2), -Decimal(30), "2025-04-19 13:00:00")
+ )
+
+ with self.assertRaises(ValueError):
+ self.fifo_queue.match_trades()
if __name__ == "__main__":