summaryrefslogtreecommitdiff
path: root/test_trade_queue.py
blob: 958b83074ae564c986a4cc358a4e2e588e3c2438 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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()