diff options
author | uvok | 2025-04-19 16:04:11 +0200 |
---|---|---|
committer | uvok | 2025-04-19 16:04:11 +0200 |
commit | e502987d3aba7b96c137344596bebf2cdc3f7b18 (patch) | |
tree | 4983a9c74f56b54ea487aa1dac3ee4dfacbf7290 /test_trade_queue.py | |
parent | 972bb3f4af23346d31cd7f37e4081b46247c304d (diff) |
Add multi-remove tests
Diffstat (limited to 'test_trade_queue.py')
-rw-r--r-- | test_trade_queue.py | 89 |
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__": |