summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruvok2025-04-17 10:31:12 +0200
committeruvok2025-04-17 10:31:12 +0200
commitbe47d5d3f5b57385fb13f2313fd61ce08423b8fa (patch)
tree2c0c304f124703df8d1cb353398af1fd9fe7c04e
parent8bd47f31bb497b2f8a39f048d4e8cc8a0123d6f1 (diff)
Remove using queue directly
-rw-r--r--test_trade_queue.py23
-rw-r--r--trade_queue.py15
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}")