diff --git a/logic/__tests__/__init__.py b/logic/__tests__/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/logic/__tests__/knights_queue_test.py b/logic/__tests__/knights_queue_test.py new file mode 100644 index 0000000..0772a2c --- /dev/null +++ b/logic/__tests__/knights_queue_test.py @@ -0,0 +1,54 @@ +import unittest + +from logic.knights_queue import KnightsQueue +from models.knight import Knight + + +class KnightsQueueTest(unittest.TestCase): + def test_should_raise_when_team_has_dead_knights(self): + with self.assertRaises(Exception): + knight1 = Knight(None) + knight1.health = 0 + knight2 = Knight(None) + knight2.health = -1 + knight3 = Knight(None) + knight3.health = -2 + knight4 = Knight(None) + knight4.health = 20 + + knights_queue = KnightsQueue([knight1, knight2, knight3], [knight4]) + + knights_queue.dequeue_knight() + knights_queue.dequeue_knight() + + def test_should_return_knight_from_any_team_and_add_to_queue_again(self): + knight1 = Knight(None) + knight1.health = 10 + knight2 = Knight(None) + knight2.health = 20 + knights_queue = KnightsQueue([knight1], [knight2]) + + result1 = knights_queue.dequeue_knight() + result2 = knights_queue.dequeue_knight() + result3 = knights_queue.dequeue_knight() + + self.assertIsNotNone(result1) + self.assertIsNotNone(result2) + self.assertIsNotNone(result3) + self.assertTrue(result1.health == result3.health) + + def test_should_raise_when_only_one_team_alive(self): + with self.assertRaises(Exception): + knight = Knight(None) + knight.health = 21 + knights_queue = KnightsQueue([knight], []) + knights_queue.dequeue_knight() + + def test_should_raise_when_no_team_alive(self): + with self.assertRaises(Exception): + knights_queue = KnightsQueue([], []) + knights_queue.dequeue_knight() + + +if __name__ == '__main__': + unittest.main() diff --git a/logic/__tests__/resources/textures/knight.png b/logic/__tests__/resources/textures/knight.png new file mode 100644 index 0000000..0024f64 Binary files /dev/null and b/logic/__tests__/resources/textures/knight.png differ diff --git a/logic/knights_queue.py b/logic/knights_queue.py new file mode 100644 index 0000000..42960eb --- /dev/null +++ b/logic/knights_queue.py @@ -0,0 +1,25 @@ +import random +from collections import deque + + +class KnightsQueue: + def __init__(self, blue_team, red_team): + self.queues = deque(blue_team), deque(red_team) + self.team_idx_turn = random.randint(0, 1) + + def dequeue_knight(self): + if self.both_teams_alive(): + knight = self.queues[self.team_idx_turn].popleft() + if knight.health <= 0: + self.dequeue_knight() + else: + self.queues[self.team_idx_turn].append(knight) + self.next_round() + return knight + raise Exception('Game has just ended') + + def both_teams_alive(self): + return len(self.queues[0]) > 0 and len(self.queues[1]) > 0 + + def next_round(self): + self.team_idx_turn = (self.team_idx_turn + 1) % 2