import unittest from datetime import datetime from trade_queue import FIFOQueue class TestFIFOQueue(unittest.TestCase): def setUp(self): """ Set up a FIFOQueue instance and some test trades. """ self.queue = FIFOQueue() self.queue.add(10.0, 100.0, "2025-04-14") self.queue.add(20.0, 200.0, "2025-04-15") self.queue.add(30.0, 300.0, "2025-04-16") def test_add(self): """ Test adding trades to the queue. """ self.assertEqual(len(self.queue.queue), 3) # There should be 3 trades in the queue self.assertEqual(self.queue.queue[0].amount, 10.0) # Check the first trade's amount self.assertEqual(self.queue.queue[1].date, "2025-04-15") # Check the second trade's date def test_remove_exact_amount(self): """ Test removing an exact amount from the queue. """ trades = self.queue.remove(10.0) self.assertEqual(len(trades), 1) # One trade should be returned self.assertEqual(trades[0].amount, 10.0) # Amount should match the request self.assertEqual(len(self.queue.queue), 2) # Two trades should remain in the queue def test_remove_partial_trade(self): """ Test removing an amount that partially consumes a trade. """ trades = self.queue.remove(5.0) self.assertEqual(len(trades), 1) # One partial trade should be returned self.assertEqual(trades[0].amount, 5.0) # Amount should match the request self.assertEqual(self.queue.queue[0].amount, 5.0) # Remaining trade amount should update def test_remove_multiple_trades(self): """ Test removing an amount that spans multiple trades. """ trades = self.queue.remove(25.0) self.assertEqual(len(trades), 2) # Two trades should be returned self.assertEqual(trades[0].amount, 10.0) # The first trade should be fully consumed self.assertEqual(trades[1].amount, 15.0) # The second trade should be partially consumed self.assertEqual(self.queue.queue[0].amount, 5.0) # Remaining trade in queue should update def test_remove_insufficient_amount(self): """ Test trying to remove more than is available in the queue. """ with self.assertRaises(ValueError): self.queue.remove(100.0) # This should raise an exception def test_remove_negative_amount(self): """ Test trying to remove a negative amount. """ with self.assertRaises(ValueError): self.queue.remove(-5.0) # This should raise an exception if __name__ == "__main__": unittest.main()