diff options
| -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()  | 
