diff options
author | uvok | 2025-04-19 15:35:57 +0200 |
---|---|---|
committer | uvok | 2025-04-19 15:35:57 +0200 |
commit | 92e1734bf6b6ccbea5e157a5a4c0dc43261d003e (patch) | |
tree | 2ed8af7642b658b69c088ce830f7249ebba07400 | |
parent | 5cacae7a89eb54d0597e09340f0dd529d2329265 (diff) |
Add match tests
-rw-r--r-- | test_trade_queue.py | 84 |
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() |