diff options
author | uvok | 2025-04-17 10:31:12 +0200 |
---|---|---|
committer | uvok | 2025-04-17 10:31:12 +0200 |
commit | be47d5d3f5b57385fb13f2313fd61ce08423b8fa (patch) | |
tree | 2c0c304f124703df8d1cb353398af1fd9fe7c04e | |
parent | 8bd47f31bb497b2f8a39f048d4e8cc8a0123d6f1 (diff) |
Remove using queue directly
-rw-r--r-- | test_trade_queue.py | 23 | ||||
-rw-r--r-- | trade_queue.py | 15 |
2 files changed, 23 insertions, 15 deletions
diff --git a/test_trade_queue.py b/test_trade_queue.py index 1bfa1ef..89c75e8 100644 --- a/test_trade_queue.py +++ b/test_trade_queue.py @@ -17,9 +17,10 @@ class TestFIFOQueue(unittest.TestCase): """ 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 + tq = self.queue.get_copy() + self.assertEqual(len(tq), 3) # There should be 3 trades in the queue + self.assertEqual(tq[0].amount, 10.0) # Check the first trade's amount + self.assertEqual(tq[1].date, "2025-04-15") # Check the second trade's date def test_remove_exact_amount(self): """ @@ -28,7 +29,8 @@ class TestFIFOQueue(unittest.TestCase): trades = self.queue.remove_coins(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 + tq = self.queue.get_copy() + self.assertEqual(len(tq), 2) # Two trades should remain in the queue def test_remove_partial_trade(self): """ @@ -37,7 +39,8 @@ class TestFIFOQueue(unittest.TestCase): trades = self.queue.remove_coins(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 + tq = self.queue.get_copy() + self.assertEqual(tq[0].amount, 5.0) # Remaining trade amount should update def test_remove_multiple_trades(self): """ @@ -47,7 +50,8 @@ class TestFIFOQueue(unittest.TestCase): 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 + tq = self.queue.get_copy() + self.assertEqual(tq[0].amount, 5.0) # Remaining trade in queue should update def test_remove_insufficient_amount(self): """ @@ -108,9 +112,10 @@ class TestFIFOQueue(unittest.TestCase): self.assertEqual(trades[0].amount, 4.0) # Check the removed amount self.assertEqual(trades[0].total_cost, 40.0) # Total cost should be proportional: (100 * 5 / 10) - self.assertEqual(self.queue._queue[0].price_per_coin, 10) # Original total cost remains unchanged - self.assertEqual(self.queue._queue[0].amount, 6.0) # Remaining amount in the first trade should be updated - self.assertEqual(self.queue._queue[0].total_cost, 60.0) # Original total cost remains unchanged + tq = self.queue.get_copy() + self.assertEqual(tq[0].price_per_coin, 10) # Original total cost remains unchanged + self.assertEqual(tq[0].amount, 6.0) # Remaining amount in the first trade should be updated + self.assertEqual(tq[0].total_cost, 60.0) # Original total cost remains unchanged if __name__ == "__main__": unittest.main() diff --git a/trade_queue.py b/trade_queue.py index 8890ec2..de5471d 100644 --- a/trade_queue.py +++ b/trade_queue.py @@ -15,20 +15,23 @@ class FIFOQueue: Will track trades. """ def __init__(self) -> None: - self._queue: Deque[Trade] = deque() + self.__queue: Deque[Trade] = deque() self._cached_total: Decimal = Decimal(0) self._cache_valid: bool = True logger.info("FIFOQueue initialized with empty queue.") def __len__(self) -> int: - return len(self._queue) + return len(self.__queue) + + def get_copy(self) -> List[Trade]: + return [t for t in self.__queue] def add(self, amount: float | Decimal, total_cost: float | Decimal, date: str) -> None: """ Add a trade to the queue. """ trade = Trade(amount, total_cost, date) - self._queue.append(trade) + self.__queue.append(trade) self._cache_valid = False logger.info(f"Added trade: {trade}.") @@ -55,7 +58,7 @@ class FIFOQueue: entries: List[Trade] = [] while remaining > 0: - trade = self._queue[0] + trade = self.__queue[0] logger.debug(f"Processing trade: {trade}") if trade.amount > remaining: @@ -67,7 +70,7 @@ class FIFOQueue: else: remaining -= trade.amount entries.append(trade) - self._queue.popleft() + self.__queue.popleft() logger.info(f"Removed full trade: {trade}. Remaining coins to remove: {remaining}") return entries @@ -78,7 +81,7 @@ class FIFOQueue: """ if not self._cache_valid: logger.debug("Cache invalid, recalculating remaining amount.") - self._cached_total = sum((trade.amount for trade in self._queue), Decimal(0)) + self._cached_total = sum((trade.amount for trade in self.__queue), Decimal(0)) self._cache_valid = True logger.info(f"Cache recalculated: {self._cached_total:.2f}") |