diff options
Diffstat (limited to 'test_trade_queue.py')
-rw-r--r-- | test_trade_queue.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/test_trade_queue.py b/test_trade_queue.py new file mode 100644 index 0000000..958b830 --- /dev/null +++ b/test_trade_queue.py @@ -0,0 +1,67 @@ +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() |