diff options
| -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__":  | 
