diff --git a/aimmo-game/service.py b/aimmo-game/service.py index 61f350780..11e1f2653 100644 --- a/aimmo-game/service.py +++ b/aimmo-game/service.py @@ -14,7 +14,6 @@ from simulation import map_generator from simulation.avatar.avatar_manager import AvatarManager from simulation.worker_managers import WORKER_MANAGERS -from simulation.communicator import Communicator from simulation.game_runner import GameRunner eventlet.sleep() @@ -61,8 +60,6 @@ def player_data(player_id): def register_world_update_on_connect(self): @socketio_server.on('connect') def world_update_on_connect(sid, environ): - self._sid_to_avatar_id[sid] = None - query = environ['QUERY_STRING'] self._find_avatar_id_from_query(sid, query) self.send_updates() @@ -101,9 +98,12 @@ def _find_avatar_id_from_query(self, session_id, query_string): LOGGER.error("Avatar ID could not be casted into an integer") except KeyError: LOGGER.error("No avatar ID found. User may not be authorised ") + LOGGER.error("query_string: " + query_string) def _send_logs(self, player_id_to_workers): def should_send_logs(logs): + LOGGER.info("should_send_logs: " + str(logs)) + return logs is not None and logs != '' for sid, player_id in self._sid_to_avatar_id.iteritems(): diff --git a/aimmo-game/simulation/game_runner.py b/aimmo-game/simulation/game_runner.py index 0b3085797..a5d5e5b03 100644 --- a/aimmo-game/simulation/game_runner.py +++ b/aimmo-game/simulation/game_runner.py @@ -61,9 +61,12 @@ def update_simulation(self, player_id_to_serialised_actions): self.simulation_runner.run_single_turn(player_id_to_serialised_actions) self.end_turn_callback() + def update(self): + self.update_workers() + self.update_simulation(self.worker_manager.get_player_id_to_serialised_actions()) + self.worker_manager.clear_logs() + def run(self): while True: - self.update_workers() - self.update_simulation(self.worker_manager.get_player_id_to_serialised_actions()) - self.worker_manager.clear_logs() + self.update() time.sleep(TURN_TIME) diff --git a/aimmo-game/simulation/simulation_runner.py b/aimmo-game/simulation/simulation_runner.py index 40a55fe28..a92def393 100644 --- a/aimmo-game/simulation/simulation_runner.py +++ b/aimmo-game/simulation/simulation_runner.py @@ -15,7 +15,7 @@ class SimulationRunner(object): """ daemon = True - def __init__(self, communicator, game_state,): + def __init__(self, game_state, communicator): self.game_state = game_state self.communicator = communicator @@ -60,7 +60,7 @@ def run_turn(self, player_id_to_serialised_actions): avatars = self.game_state.avatar_manager.active_avatars for avatar in avatars: - self._run_turn_for_avatar(avatar, player_id_to_serialised_actions[avatar.id]) + self._run_turn_for_avatar(avatar, player_id_to_serialised_actions[avatar.player_id]) location_to_clear = avatar.action.target_location avatar.action.process(self.game_state.world_map) self.game_state.world_map.clear_cell_actions(location_to_clear) diff --git a/aimmo-game/tests/functional/mock_world.py b/aimmo-game/tests/functional/mock_world.py index 5d6afa237..1c1e3da11 100644 --- a/aimmo-game/tests/functional/mock_world.py +++ b/aimmo-game/tests/functional/mock_world.py @@ -1,8 +1,7 @@ import random from simulation import map_generator -from simulation.turn_manager import SequentialTurnManager -from simulation.logs import Logs +from simulation.simulation_runner import SequentialSimulationRunner from tests.test_simulation.mock_communicator import MockCommunicator from tests.test_simulation.dummy_avatar import DummyAvatarManager, MoveEastDummy @@ -21,19 +20,14 @@ class MockWorld(object): By default, the first avatar added to the world will be a MoveEastDummy. """ - def __init__(self, settings=SETTINGS, dummies_list=None, map_generator_class=map_generator.Main, logs=None): + def __init__(self, settings=SETTINGS, dummies_list=None, map_generator_class=map_generator.Main, + simulation_runner_class=SequentialSimulationRunner): random.seed(0) if dummies_list is None: dummies_list = [MoveEastDummy] - if logs is None: - logs = Logs() - self.generator = map_generator_class(settings) self.avatar_manager = DummyAvatarManager(dummies_list) self.game_state = self.generator.get_game_state(self.avatar_manager) - self.turn_manager = SequentialTurnManager(game_state=self.game_state, - end_turn_callback=lambda: None, - communicator=MockCommunicator(), - logs=logs, - have_avatars_code_updated={}) + self.simulation_runner = simulation_runner_class(game_state=self.game_state, + communicator=MockCommunicator()) diff --git a/aimmo-game/tests/functional/test_damage_pickups_and_effects.py b/aimmo-game/tests/functional/test_damage_pickups_and_effects.py index 27468a298..601643481 100644 --- a/aimmo-game/tests/functional/test_damage_pickups_and_effects.py +++ b/aimmo-game/tests/functional/test_damage_pickups_and_effects.py @@ -15,7 +15,7 @@ def setUp(self): avatar manager, game state, turn manager and a map generator. """ self.game = MockWorld() - self.game.game_state.add_avatar(1, None, Location(0, 0)) + self.game.game_state.add_avatar(1, Location(0, 0)) _avatar_spawn_cell = self.game.game_state.world_map.get_cell(Location(0, 0)) self.initial_attack_strength = _avatar_spawn_cell.avatar.attack_strength self.cell = self.game.game_state.world_map.get_cell(Location(1, 0)) @@ -24,7 +24,7 @@ def test_damage_boost_pickup_can_be_picked_up_default(self): pickup_created = DamageBoostPickup(self.cell) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(len(self.game.avatar_manager.get_avatar(1).effects), 1) @@ -37,7 +37,7 @@ def test_damage_boost_pickup_can_be_picked_up_custom_integer(self, boost_value): pickup_created = DamageBoostPickup(self.cell, boost_value) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(len(self.game.avatar_manager.get_avatar(1).effects), 1) @@ -51,7 +51,7 @@ def test_damage_boost_pickup_can_be_picked_up_custom_floats(self, boost_value): pickup_created = DamageBoostPickup(self.cell, boost_value) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(len(self.game.avatar_manager.get_avatar(1).effects), 1) @@ -65,7 +65,7 @@ def test_damage_boost_increases_attack_strength_with_default_integer(self): pickup_created = DamageBoostPickup(self.cell) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertTrue(self.cell.avatar.attack_strength, self.initial_attack_strength + DAMAGE_BOOST_DEFAULT) @@ -78,6 +78,6 @@ def test_damage_boost_increases_attack_strength_with_custom_integers(self, boost pickup_created = DamageBoostPickup(self.cell, boost_value) self.cell.pickup = pickup_created - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertTrue(self.cell.avatar.attack_strength, self.initial_attack_strength + boost_value) diff --git a/aimmo-game/tests/functional/test_effect_expiry.py b/aimmo-game/tests/functional/test_effect_expiry.py index 5fa095723..9c9ecd314 100644 --- a/aimmo-game/tests/functional/test_effect_expiry.py +++ b/aimmo-game/tests/functional/test_effect_expiry.py @@ -25,7 +25,7 @@ def setUp(self): } self.game = MockWorld(SETTINGS) - self.game.game_state.add_avatar(1, None, Location(0, 0)) + self.game.game_state.add_avatar(1, Location(0, 0)) self.avatar = self.game.avatar_manager.get_avatar(1) self.cell = self.game.game_state.world_map.get_cell(Location(1, 0)) @@ -40,7 +40,9 @@ def test_single_damage_boost_pickup_expiry(self): # Avatar moves EAST to (1,0) where pickup is located, then repeats it 5 times. for i in range(6): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[0], pickup_created.EFFECT)) self.assertEqual(list(self.avatar.effects)[0]._time_remaining, 5) @@ -48,7 +50,9 @@ def test_single_damage_boost_pickup_expiry(self): # Run 5 more turns and expect the effect to expire. for i in range(5): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 0) self.assertEqual(self.avatar.attack_strength, 1) @@ -64,7 +68,7 @@ def test_single_invulnerability_pickup_pickup_expiry(self): # Avatar moves EAST to (1,0) where pickup is located, then repeats it 5 times. for i in range(6): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertTrue(isinstance(list(self.avatar.effects)[0], pickup_created.EFFECT)) self.assertEqual(list(self.avatar.effects)[0]._time_remaining, 5) @@ -72,7 +76,7 @@ def test_single_invulnerability_pickup_pickup_expiry(self): # Run 5 more turns and expect the effect to expire. for i in range(5): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(len(self.avatar.effects), 0) self.assertEqual(self.avatar.resistance, 0) @@ -93,7 +97,9 @@ def test_multiple_damage_boost_pickup_expiry(self): self.assertEqual(self.avatar.attack_strength, 1) # Avatar moves EAST to (1,0) where pickup one is located. - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[0], pickup_created_one.EFFECT)) self.assertEqual(len(self.avatar.effects), 1) @@ -102,7 +108,9 @@ def test_multiple_damage_boost_pickup_expiry(self): # Move twice to the second pickup. for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[1], pickup_created_two.EFFECT)) self.assertEqual(len(self.avatar.effects), 2) @@ -110,7 +118,9 @@ def test_multiple_damage_boost_pickup_expiry(self): # Eight turns later, we expect the first effect to expire. for i in range(8): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 1) self.assertEqual(list(self.avatar.effects)[0]._time_remaining, 2) @@ -118,7 +128,9 @@ def test_multiple_damage_boost_pickup_expiry(self): # Two turns later, the second pickup expires too. for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 0) self.assertEqual(self.avatar.attack_strength, 1) @@ -139,7 +151,9 @@ def test_multiple_invulnerability_boost_pickup_expiry(self): self.assertEqual(self.avatar.resistance, 0) # Avatar moves EAST to (1,0) where pickup one is located. - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[0], pickup_created_one.EFFECT)) self.assertEqual(len(self.avatar.effects), 1) @@ -148,7 +162,9 @@ def test_multiple_invulnerability_boost_pickup_expiry(self): # Move twice to the second pickup. for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertTrue(isinstance(list(self.avatar.effects)[1], pickup_created_two.EFFECT)) self.assertEqual(len(self.avatar.effects), 2) @@ -156,7 +172,9 @@ def test_multiple_invulnerability_boost_pickup_expiry(self): # Eight turns later, we expect the first effect to expire. for i in range(8): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 1) self.assertEqual(list(self.avatar.effects)[0]._time_remaining, 2) @@ -164,7 +182,9 @@ def test_multiple_invulnerability_boost_pickup_expiry(self): # Two turns later, the second pickup expires too. for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) self.assertEqual(len(self.avatar.effects), 0) self.assertEqual(self.avatar.resistance, 0) diff --git a/aimmo-game/tests/functional/test_health_pickups_and_effects.py b/aimmo-game/tests/functional/test_health_pickups_and_effects.py index 5f745c678..76ccdc66e 100644 --- a/aimmo-game/tests/functional/test_health_pickups_and_effects.py +++ b/aimmo-game/tests/functional/test_health_pickups_and_effects.py @@ -19,7 +19,7 @@ def setUp(self): avatar manager, game state, turn manager and a map generator. """ self.game = MockWorld() - self.game.game_state.add_avatar(1, None, Location(0, 0)) + self.game.game_state.add_avatar(1, Location(0, 0)) self.cell = self.game.game_state.world_map.get_cell(Location(1, 0)) self.initial_health = self.game.avatar_manager.get_avatar(1).health @@ -29,7 +29,7 @@ def test_health_pickups_and_effects_apply_default(self): """ self.cell.pickup = HealthPickup(self.cell) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(self.cell.avatar.health, self.initial_health + @@ -43,7 +43,7 @@ def test_health_pickups_and_effects_apply_custom_integers(self, restore_value): self.setUp() self.cell.pickup = HealthPickup(self.cell, restore_value) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) if self.initial_health + restore_value > HEALTH_RESTORE_MAX: @@ -61,7 +61,7 @@ def test_health_pickups_and_effects_apply_custom_floats(self, restore_value): self.setUp() self.cell.pickup = HealthPickup(self.cell, restore_value) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) if self.initial_health + restore_value > HEALTH_RESTORE_MAX: @@ -81,7 +81,7 @@ def test_health_effect_is_capped_at_HEALTH_RESTORE_MAX(self, restore_value): self.setUp() self.cell.pickup = HealthPickup(self.cell, restore_value) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(self.cell.avatar.health, AVATAR_HEALTH_MAX) diff --git a/aimmo-game/tests/functional/test_invulnerability_pickups_and_effects.py b/aimmo-game/tests/functional/test_invulnerability_pickups_and_effects.py index 92f9a42c2..32747dfe2 100644 --- a/aimmo-game/tests/functional/test_invulnerability_pickups_and_effects.py +++ b/aimmo-game/tests/functional/test_invulnerability_pickups_and_effects.py @@ -13,7 +13,7 @@ def setUp(self): avatar manager, game state, turn manager and a map generator. """ self.game = MockWorld() - self.game.game_state.add_avatar(1, None, Location(0, 0)) + self.game.game_state.add_avatar(1, Location(0, 0)) self.cell = self.game.game_state.world_map.get_cell(Location(1, 0)) def test_invulnerability_pickups_increase_resistance_of_avatar(self): @@ -25,7 +25,7 @@ def test_invulnerability_pickups_increase_resistance_of_avatar(self): self.cell.pickup = InvulnerabilityPickup(self.cell) self.assertEqual(self.game.avatar_manager.get_avatar(1).resistance, 0) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(self.cell.avatar.resistance, 1000) @@ -37,13 +37,13 @@ def test_invulnerability_pickups_can_increase_resistance_to_2000(self): then picks up the pickup, and moves to 2,0 to do the same. """ self.cell.pickup = InvulnerabilityPickup(self.cell) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) self.assertEqual(self.cell.avatar.resistance, 1000) self.cell = self.game.game_state.world_map.get_cell(Location(2, 0)) self.cell.pickup = InvulnerabilityPickup(self.cell) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.cell.avatar.resistance, 2000) self.assertEqual(self.cell.avatar, self.game.avatar_manager.get_avatar(1)) diff --git a/aimmo-game/tests/functional/test_movements_in_map.py b/aimmo-game/tests/functional/test_movements_in_map.py index 0745bc1ce..43f9eed9b 100644 --- a/aimmo-game/tests/functional/test_movements_in_map.py +++ b/aimmo-game/tests/functional/test_movements_in_map.py @@ -3,6 +3,7 @@ from mock_world import MockWorld from simulation.location import Location from simulation import map_generator +from simulation.simulation_runner import ConcurrentSimulationRunner from tests.test_simulation.dummy_avatar import ( MoveEastDummy, MoveWestDummy, MoveNorthDummy, MoveSouthDummy, WaitDummy, DeadDummy ) @@ -22,8 +23,8 @@ def set_up_environment(self, dummy_list=None, location=Location(0, 0), Utility method for testing. """ self.game = MockWorld(TestMovementsInMap.SETTINGS, dummy_list, - map_generator_class) - self.game.game_state.add_avatar(1, None, location) + map_generator_class, ConcurrentSimulationRunner) + self.game.game_state.add_avatar(player_id=1, location=location) self.avatar = self.game.avatar_manager.get_avatar(1) def set_up_and_make_movements_in_a_single_direction(self, dummy_list, @@ -36,7 +37,7 @@ def set_up_and_make_movements_in_a_single_direction(self, dummy_list, self.assertEqual(self.avatar.location, spawn) for i in range(number_of_movements): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) def test_movement_five_times_in_all_directions(self): """ @@ -105,7 +106,7 @@ def test_avatar_cannot_move_into_obstacle(self): self.assertTrue(self.avatar.location, Location(0, 0)) for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertTrue(self.avatar.location, Location(1, 0)) @@ -115,14 +116,16 @@ def test_avatars_cannot_go_into_each_other(self): """ # Even number of cells between two avatars. self.set_up_environment([MoveEastDummy, MoveWestDummy]) - self.game.game_state.add_avatar(2, None, Location(3, 0)) + self.game.game_state.add_avatar(2, Location(3, 0)) avatar_two = self.game.avatar_manager.get_avatar(2) self.assertEqual(self.avatar.location, Location(0, 0)) self.assertEqual(avatar_two.location, Location(3, 0)) for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) # Avatar 1 & Avatar 2 only managed to move once. self.assertEqual(self.avatar.location, Location(1, 0)) @@ -130,68 +133,33 @@ def test_avatars_cannot_go_into_each_other(self): # Odd number of cells between two avatars. self.set_up_environment([MoveEastDummy, MoveWestDummy]) - self.game.game_state.add_avatar(2, None, Location(4, 0)) + self.game.game_state.add_avatar(2, Location(4, 0)) avatar_two = self.game.avatar_manager.get_avatar(2) self.assertEqual(self.avatar.location, Location(0, 0)) self.assertEqual(avatar_two.location, Location(4, 0)) for i in range(2): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn( + self.game.avatar_manager.get_player_id_to_serialised_action() + ) - # Avatar 1 managed to move twice, while Avatar 2 managed to only move once. - self.assertEqual(self.avatar.location, Location(2, 0)) + # Avatar 1 & Avatar 2 managed to only move only once. + self.assertEqual(self.avatar.location, Location(1, 0)) self.assertEqual(avatar_two.location, Location(3, 0)) # Live avatar can't move into a square occupied by a 'dead' (no worker) avatar self.set_up_environment([DeadDummy, MoveWestDummy]) - self.game.game_state.add_avatar(2, None, Location(1, 0)) + self.game.game_state.add_avatar(2, Location(1, 0)) avatar_two = self.game.avatar_manager.get_avatar(2) self.assertEqual(self.avatar.location, Location(0, 0)) self.assertEqual(avatar_two.location, Location(1, 0)) - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.avatar.location, Location(0, 0)) self.assertEqual(avatar_two.location, Location(1, 0)) - def test_sequential_avatars_tailing_each_other(self): - """ - Two avatars placed beside each other horizontally. They want to move east, but - SequentialTurnManager gives priority to ID1. It gets blocked by ID2 so only two - moves. - """ - self.set_up_environment([MoveEastDummy, MoveEastDummy]) - self.game.game_state.add_avatar(2, None, Location(1, 0)) - avatar_two = self.game.avatar_manager.get_avatar(2) - - self.assertEqual(self.avatar.location, Location(0, 0)) - self.assertEqual(avatar_two.location, Location(1, 0)) - - for i in range(1): - self.game.turn_manager._run_single_turn() - - self.assertEqual(self.avatar.location, Location(0, 0)) - self.assertEqual(avatar_two.location, Location(2, 0)) - - def test_level_one_appropriate_behaviour(self): - """ - Tests the appropriate behaviour of Level 1. The test should reflect everything - that is written in the manual - test plan. - """ - self.set_up_environment(dummy_list=[MoveEastDummy], location=Location(-2, 0), - map_generator_class=map_generator.Level1) - score_cell = self.game.game_state.world_map.get_cell(Location(2, 0)) - self.assertTrue(score_cell.generates_score) - self.game.game_state.main_avatar_id = 1 - - for i in range(5): - self.game.turn_manager._run_single_turn() - - self.assertEqual(self.avatar.location, Location(2, 0)) - self.assertTrue(self.game.generator.check_complete(self.game.game_state)) - def test_wait_action_on_a_single_avatar(self): """ Ensures a returned WaitAction will keep the avatar in its initial location. @@ -200,6 +168,6 @@ def test_wait_action_on_a_single_avatar(self): self.assertEqual(self.avatar.location, Location(0, 0)) for i in range(5): - self.game.turn_manager._run_single_turn() + self.game.simulation_runner.run_single_turn(self.game.avatar_manager.get_player_id_to_serialised_action()) self.assertEqual(self.avatar.location, Location(0, 0)) diff --git a/aimmo-game/tests/test_service.py b/aimmo-game/tests/test_service.py index 9641420ed..f63df1475 100644 --- a/aimmo-game/tests/test_service.py +++ b/aimmo-game/tests/test_service.py @@ -16,7 +16,7 @@ class DummyAvatarManager(AvatarManager): @classmethod def setUpClass(cls): """ Register the api endpoints """ - cls.game_api = service.GameAPI(worker_manager=None, game_state=None, logs=None, have_avatars_code_updated=None) + cls.game_api = service.GameAPI(worker_manager=None, game_state=None) def setUp(self): """ diff --git a/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py b/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py index 396782b50..06f8a538f 100644 --- a/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py +++ b/aimmo-game/tests/test_simulation/avatar/test_avatar_wrapper.py @@ -6,7 +6,7 @@ from simulation.avatar import avatar_wrapper from simulation.location import Location - +from simulation.worker import Worker class MockEffect(object): def __init__(self, avatar): @@ -60,21 +60,18 @@ class TestAvatarWrapper(TestCase): def setUp(self): global actions_created actions_created = [] - self.avatar = avatar_wrapper.AvatarWrapper(None, None, 'http://test', None) + self.worker = Worker(worker_url='http://test') + self.avatar = avatar_wrapper.AvatarWrapper(player_id=None, + initial_location=None, + avatar_appearance=None) def take_turn(self, request_mock=None): if request_mock is None: request_mock = ActionRequest() with HTTMock(request_mock): - worker_data = self.avatar.fetch_data(None) + worker_data = self.worker.fetch_data(None) self.avatar.decide_action(worker_data) - def test_action_has_created_correctly(self): - self.take_turn() - self.assertGreater(len(actions_created), 0, 'No action applied') - self.assertEqual(len(actions_created), 1, 'Too many actions applied') - self.assertEqual(actions_created[0].avatar, self.avatar, 'Action applied on wrong avatar') - def test_bad_action_data_given(self): request_mock = InvalidJSONRequest self.take_turn(request_mock) diff --git a/aimmo-game/tests/test_simulation/dummy_avatar.py b/aimmo-game/tests/test_simulation/dummy_avatar.py index 6910e5168..e6f4b7b67 100644 --- a/aimmo-game/tests/test_simulation/dummy_avatar.py +++ b/aimmo-game/tests/test_simulation/dummy_avatar.py @@ -12,7 +12,9 @@ class DummyAvatar(AvatarWrapper): def __init__(self, player_id=1, initial_location=(0, 0)): # TODO: extract avatar state and state-altering methods into a new class. # The new class is to be shared between DummyAvatarRunner and AvatarRunner - super(DummyAvatar, self).__init__(player_id, initial_location, None, None) + super(DummyAvatar, self).__init__(player_id, + initial_location, + avatar_appearance=None) self.times_died = 0 self.attack_strength = 1 self.effects = set() @@ -115,7 +117,7 @@ def __init__(self, dummy_list=None): dummy_list = [] self.dummy_list = dummy_list - def add_avatar(self, player_id, worker_url, location): + def add_avatar(self, player_id, location=(0, 0)): try: dummy = self.dummy_list.pop(0) except IndexError: @@ -125,3 +127,9 @@ def add_avatar(self, player_id, worker_url, location): def add_avatar_directly(self, avatar): self.avatars_by_id[avatar.player_id] = avatar + + def get_player_id_to_serialised_action(self): + for dummy in self.avatars_by_id.values(): + dummy.decide_action(None) + + return {player_id: self.avatars_by_id[player_id]._action for player_id in self.avatars_by_id} diff --git a/aimmo-game/tests/test_simulation/fake_game_runner.py b/aimmo-game/tests/test_simulation/fake_game_runner.py deleted file mode 100644 index 1cdda0798..000000000 --- a/aimmo-game/tests/test_simulation/fake_game_runner.py +++ /dev/null @@ -1,54 +0,0 @@ -import random -import logging - -from simulation.turn_manager import ConcurrentTurnManager -from simulation.map_generator import Main -from simulation.logs import Logs -from simulation.avatar.avatar_manager import AvatarManager -from simulation.game_runner import GameRunner -from .concrete_worker_manager import ConcreteWorkerManager -from .mock_communicator import MockCommunicator - -LOGGER = logging.getLogger(__name__) - - -class FakeGameRunner(object): - def __init__(self, settings=None, player_manager=None): - # Default argument is now immutable - if settings is None: - settings = {'START_WIDTH': 3, 'START_HEIGHT': 3, 'OBSTACLE_RATIO': 0} - - self.settings = settings - self.logs = Logs() - self.map_generator = Main(settings) - if not player_manager: - self.player_manager = AvatarManager() - else: - self.player_manager = player_manager - self.mock_communicator = MockCommunicator() - - game_state = self.map_generator.get_game_state(self.player_manager) - worker_manager = ConcreteWorkerManager() - self.game_runner = GameRunner(worker_manager=worker_manager, - game_state=game_state, - communicator=self.mock_communicator) - self.turn_manager = ConcurrentTurnManager(game_state=self.game_runner.game_state, - end_turn_callback=lambda: None, - communicator=self.mock_communicator, - logs=self.logs, - have_avatars_code_updated={}) - random.seed(0) - - def run_single_turn(self): - self.game_runner.update() - self.turn_manager._run_single_turn() - - def get_logs(self, avatar_id): - return self.logs.get_user_logs(avatar_id) - - def get_avatar(self, avatar_id): - return self.game_runner.game_state.avatar_manager.get_avatar(avatar_id) - - def change_avatar_code(self, avatar_id, code): - avatar = (user for user in self.mock_communicator.data["main"]["users"] if user["id"] == avatar_id).next() - avatar["code"] = code diff --git a/aimmo-game/tests/test_simulation/test_avatar_location.py b/aimmo-game/tests/test_simulation/test_avatar_location.py deleted file mode 100644 index 68c7df746..000000000 --- a/aimmo-game/tests/test_simulation/test_avatar_location.py +++ /dev/null @@ -1,22 +0,0 @@ -import unittest -from .fake_game_runner import FakeGameRunner - - -class TestAvatarLocation(unittest.TestCase): - - def test_avatar_location_stays_same_after_code_change(self): - game_runner = FakeGameRunner() - new_code = "class Avatar(object):\n" \ - " def handle_turn(self, world_view, events):\n" \ - " from simulation.action import WaitAction\n" \ - " print(\"New Code\")\n" \ - " return WaitAction()\n" - - game_runner.run_single_turn() - avatar_location_before_code_change = game_runner.get_avatar(1).location - - game_runner.change_avatar_code(1, new_code) - game_runner.run_single_turn() - avatar_location_after_code_change = game_runner.get_avatar(1).location - - self.assertEqual(avatar_location_before_code_change, avatar_location_after_code_change) diff --git a/aimmo-game/tests/test_simulation/test_game_runner.py b/aimmo-game/tests/test_simulation/test_game_runner.py index 64665d62b..483df2ad6 100644 --- a/aimmo-game/tests/test_simulation/test_game_runner.py +++ b/aimmo-game/tests/test_simulation/test_game_runner.py @@ -41,20 +41,21 @@ def __call__(self, url, request): class TestGameRunner(TestCase): def setUp(self): - self.mock_communicator = MockCommunicator() game_state = GameState(InfiniteMap(), AvatarManager()) - self.game_runner = GameRunner(communicator=self.mock_communicator, - worker_manager=ConcreteWorkerManager(), - game_state=game_state) + self.game_runner = GameRunner(worker_manager=ConcreteWorkerManager(), + game_state=game_state, + end_turn_callback=lambda: None, + django_api_url='http://test') + self.game_runner.communicator = MockCommunicator() def test_correct_url(self): - self.mock_communicator.get_game_metadata = mock.MagicMock() + self.game_runner.communicator.get_game_metadata = mock.MagicMock() self.game_runner.update() # noinspection PyUnresolvedReferences - self.mock_communicator.get_game_metadata.assert_called_once() + self.game_runner.communicator.get_game_metadata.assert_called_once() def test_workers_and_avatars_added(self): - self.mock_communicator.data = RequestMock(3).value + self.game_runner.communicator.data = RequestMock(3).value self.game_runner.update() self.assertEqual(len(self.game_runner.worker_manager.final_workers), 3) for i in range(3): @@ -62,11 +63,12 @@ def test_workers_and_avatars_added(self): self.assertIn(i, self.game_runner.worker_manager.final_workers) self.assertEqual(self.game_runner.worker_manager.get_code(i), 'code for %s' % i) + # TODO: Is this still a game runner test? def test_changed_code(self): - self.mock_communicator.data = RequestMock(4).value + self.game_runner.communicator.data = RequestMock(4).value self.game_runner.update() - self.mock_communicator.change_code(0, 'changed 0') - self.mock_communicator.change_code(2, 'changed 2') + self.game_runner.communicator.change_code(0, 'changed 0') + self.game_runner.communicator.change_code(2, 'changed 2') self.game_runner.update() for i in range(4): @@ -81,9 +83,9 @@ def test_changed_code(self): self.assertEqual(self.game_runner.worker_manager.get_code(i), 'changed %s' % i) def test_remove_avatars(self): - self.mock_communicator.data = RequestMock(3).value + self.game_runner.communicator.data = RequestMock(3).value self.game_runner.update() - del self.mock_communicator.data['main']['users'][1] + del self.game_runner.communicator.data['main']['users'][1] self.game_runner.update() for i in range(3): diff --git a/aimmo-game/tests/test_simulation/test_game_state.py b/aimmo-game/tests/test_simulation/test_game_state.py index bcc42e9d5..4b63fb759 100644 --- a/aimmo-game/tests/test_simulation/test_game_state.py +++ b/aimmo-game/tests/test_simulation/test_game_state.py @@ -53,7 +53,7 @@ def game_state_with_two_avatars(self, world_map=None, avatar_manager=None): def test_add_avatar(self): state = GameState(AvatarMap(None), DummyAvatarManager()) - state.add_avatar(7, "") + state.add_avatar(7) self.assertIn(7, state.avatar_manager.avatars_by_id) avatar = state.avatar_manager.avatars_by_id[7] self.assertEqual(avatar.location.x, 10) @@ -68,12 +68,12 @@ def test_updates_map(self): def test_updates_map_with_correct_num_avatars(self): map = InfiniteMap() manager = DummyAvatarManager() - manager.add_avatar(1, '', None) + manager.add_avatar(1) state = GameState(map, manager) state.update_environment() self.assertEqual(map.num_avatars, 1) - manager.add_avatar(2, '', None) - manager.add_avatar(3, '', None) + manager.add_avatar(2) + manager.add_avatar(3) state.update_environment() self.assertEqual(map.num_avatars, 3) diff --git a/aimmo-game/tests/test_simulation/test_logs.py b/aimmo-game/tests/test_simulation/test_logs.py deleted file mode 100644 index dfd9a25c0..000000000 --- a/aimmo-game/tests/test_simulation/test_logs.py +++ /dev/null @@ -1,39 +0,0 @@ -import mock -from unittest import TestCase -from .fake_game_runner import FakeGameRunner -from .dummy_avatar import DummyAvatarManager -from simulation.logs import Logs - - -class TestLogs(TestCase): - - def test_log_provider_setting_logs(self): - logs = Logs() - self.assertEqual(len(logs._logs), 0) - - logs.set_user_logs(user_id=1, logs="test logs") - self.assertEqual(len(logs._logs), 1) - self.assertIn(1, logs._logs) - self.assertEqual(logs._logs[1], "test logs") - - def test_log_provider_getting_logs(self): - logs = Logs() - logs.set_user_logs(user_id=1, logs="test logs") - - success_logs = logs.get_user_logs(1) - failed_logs = logs.get_user_logs(50) - - self.assertEqual(success_logs, "test logs") - self.assertIsNone(failed_logs) - - def test_turn_manager_calls_set_user_logs(self): - dummy_avatar_manager = DummyAvatarManager() - fake_game_runner = FakeGameRunner(player_manager=dummy_avatar_manager) - fake_game_runner.logs.set_user_logs = mock.MagicMock() - - fake_game_runner.run_single_turn() - - first_call = mock.call(logs='Testing', user_id=1) - second_call = mock.call(logs='Testing', user_id=2) - - fake_game_runner.logs.set_user_logs.assert_has_calls([first_call, second_call]) diff --git a/aimmo-game/tests/test_simulation/test_map_generator.py b/aimmo-game/tests/test_simulation/test_map_generator.py index fdc68c1ff..636f6c17e 100644 --- a/aimmo-game/tests/test_simulation/test_map_generator.py +++ b/aimmo-game/tests/test_simulation/test_map_generator.py @@ -135,13 +135,13 @@ def test_incomplete_without_avatars(self): def test_incomplete_at_score_0(self): game_state = self.get_game_state() - game_state.avatar_manager.add_avatar(1, '', None) + game_state.avatar_manager.add_avatar(1) game_state.main_avatar_id = 1 self.assertFalse(game_state.is_complete()) def test_completes_at_score_1(self): game_state = self.get_game_state() - game_state.avatar_manager.add_avatar(1, '', None) + game_state.avatar_manager.add_avatar(1) game_state.avatar_manager.avatars_by_id[1].score = 1 game_state.main_avatar_id = 1 self.assertTrue(game_state.is_complete()) @@ -149,5 +149,5 @@ def test_completes_at_score_1(self): def test_static_spawn(self): game_state = self.get_game_state() for i in range(5): - game_state.add_avatar(i, '') + game_state.add_avatar(i) self.assertEqual(game_state.avatar_manager.avatars_by_id[i].location, Location(-2, 0)) diff --git a/aimmo-game/tests/test_simulation/test_turn_manager.py b/aimmo-game/tests/test_simulation/test_simulation_runner.py similarity index 81% rename from aimmo-game/tests/test_simulation/test_turn_manager.py rename to aimmo-game/tests/test_simulation/test_simulation_runner.py index f9601a17c..b2ef223e8 100644 --- a/aimmo-game/tests/test_simulation/test_turn_manager.py +++ b/aimmo-game/tests/test_simulation/test_simulation_runner.py @@ -5,8 +5,7 @@ from simulation.avatar.avatar_appearance import AvatarAppearance from simulation.game_state import GameState from simulation.location import Location -from simulation.turn_manager import ConcurrentTurnManager -from simulation.logs import Logs +from simulation.simulation_runner import ConcurrentSimulationRunner from .dummy_avatar import (DummyAvatarManager, MoveEastDummy, MoveNorthDummy, MoveSouthDummy, MoveWestDummy, WaitDummy, DeadDummy) @@ -27,7 +26,7 @@ def get_state_for(self, avatar): return self -class TestTurnManager(unittest.TestCase): +class TestSimulationRunner(unittest.TestCase): """ Key: > : Avatar moving eastward @@ -40,17 +39,14 @@ class TestTurnManager(unittest.TestCase): def construct_default_avatar_appearance(self): return AvatarAppearance("#000", "#ddd", "#777", "#fff") - def construct_turn_manager(self, avatars, locations): + def construct_simulation_runner(self, avatars, locations): self.avatar_manager = DummyAvatarManager(avatars) + self.avatar_manager.avatars_by_id = dict(enumerate(avatars)) self.game_state = MockGameState(InfiniteMap(), self.avatar_manager) - self.turn_manager = ConcurrentTurnManager(game_state=self.game_state, - end_turn_callback=lambda: None, - communicator=MockCommunicator(), - logs=Logs(), - have_avatars_code_updated={}) + self.simulation_runner = ConcurrentSimulationRunner(game_state=self.game_state, + communicator=MockCommunicator()) for index, location in enumerate(locations): - self.game_state.add_avatar(index, "", location) - return self.turn_manager + self.game_state.add_avatar(index, location) def assert_at(self, avatar, location): self.assertEqual(avatar.location, location) @@ -61,7 +57,7 @@ def get_avatar(self, player_id): return self.avatar_manager.get_avatar(player_id) def run_turn(self): - self.turn_manager.run_turn() + self.simulation_runner.run_turn(self.avatar_manager.avatars_by_id) def test_run_turn(self): """ @@ -69,7 +65,7 @@ def test_run_turn(self): (1) Expect: _ o """ - self.construct_turn_manager([MoveEastDummy], [ORIGIN]) + self.construct_simulation_runner([MoveEastDummy], [ORIGIN]) avatar = self.get_avatar(0) self.assert_at(avatar, ORIGIN) @@ -82,7 +78,7 @@ def test_run_several_turns(self): (5) Expect: _ _ _ _ _ o """ - self.construct_turn_manager([MoveEastDummy], [ORIGIN]) + self.construct_simulation_runner([MoveEastDummy], [ORIGIN]) avatar = self.get_avatar(0) self.assertEqual(avatar.location, ORIGIN) @@ -97,7 +93,7 @@ def test_run_several_turns_and_avatars(self): Expect: _ _ _ _ _ o _ _ _ _ _ o """ - self.construct_turn_manager([MoveEastDummy, MoveEastDummy], + self.construct_simulation_runner([MoveEastDummy, MoveEastDummy], [ORIGIN, ABOVE_ORIGIN]) avatar0 = self.get_avatar(0) avatar1 = self.get_avatar(1) @@ -114,7 +110,7 @@ def test_move_chain_succeeds(self): Expect: _ o o o o o """ - self.construct_turn_manager([MoveEastDummy for _ in range(5)], + self.construct_simulation_runner([MoveEastDummy for _ in range(5)], [Location(x, 0) for x in range(5)]) avatars = [self.get_avatar(i) for i in range(5)] @@ -128,7 +124,7 @@ def test_move_chain_fails_occupied(self): Expect: x x x _ """ - self.construct_turn_manager([MoveEastDummy, MoveEastDummy, WaitDummy], + self.construct_simulation_runner([MoveEastDummy, MoveEastDummy, WaitDummy], [Location(x, 0) for x in range(3)]) avatars = [self.get_avatar(i) for i in range(3)] @@ -143,7 +139,7 @@ def test_move_chain_fails_occupied_by_dead_avatar(self): Expect: x x ! _ """ - self.construct_turn_manager([MoveEastDummy, MoveEastDummy, DeadDummy], [Location(x, 0) for x in range(3)]) + self.construct_simulation_runner([MoveEastDummy, MoveEastDummy, DeadDummy], [Location(x, 0) for x in range(3)]) avatars = [self.get_avatar(i) for i in range(3)] [self.assert_at(avatars[x], Location(x, 0)) for x in range(3)] @@ -156,7 +152,7 @@ def test_move_fails_collision(self): Expect: x _ x """ - self.construct_turn_manager([MoveEastDummy, MoveWestDummy], [Location(0, 0), Location(2, 0)]) + self.construct_simulation_runner([MoveEastDummy, MoveWestDummy], [Location(0, 0), Location(2, 0)]) avatars = [self.get_avatar(i) for i in range(2)] self.assert_at(avatars[0], Location(0, 0)) @@ -174,7 +170,7 @@ def test_move_chain_fails_collision(self): Expect: x x x _ x """ locations = [Location(0, 0), Location(1, 0), Location(2, 0), Location(4, 0)] - self.construct_turn_manager( + self.construct_simulation_runner( [MoveEastDummy, MoveEastDummy, MoveEastDummy, MoveWestDummy], locations) avatars = [self.get_avatar(i) for i in range(4)] @@ -192,7 +188,7 @@ def test_move_chain_fails_cycle(self): x x """ locations = [Location(0, 1), Location(1, 1), Location(1, 0), Location(0, 0)] - self.construct_turn_manager( + self.construct_simulation_runner( [MoveEastDummy, MoveSouthDummy, MoveWestDummy, MoveNorthDummy], locations) avatars = [self.get_avatar(i) for i in range(4)] @@ -214,7 +210,7 @@ def test_move_chain_fails_spiral(self): Location(2, 1), Location(2, 0), Location(1, 0)] - self.construct_turn_manager( + self.construct_simulation_runner( [MoveEastDummy, MoveEastDummy, MoveSouthDummy, MoveWestDummy, MoveNorthDummy], locations) avatars = [self.get_avatar(i) for i in range(5)] diff --git a/aimmo-game/tests/test_socketio.py b/aimmo-game/tests/test_socketio.py index 371e102ec..cfd7fd34e 100644 --- a/aimmo-game/tests/test_socketio.py +++ b/aimmo-game/tests/test_socketio.py @@ -5,6 +5,7 @@ import service from simulation.logs import Logs +from simulation.worker_managers.local_worker_manager import LocalWorkerManager class MockGameState(): @@ -23,10 +24,7 @@ def wrapper(*args, **kwargs): class TestSocketio(TestCase): def setUp(self): - self.environ = {} - self.mocked_logs = Logs() - self.have_avatars_code_updated = {} - self.environ['QUERY_STRING'] = 'avatar_id=1&EIO=3&transport=polling&t=MJhoMgb' + self.environ = {'QUERY_STRING': 'avatar_id=1&EIO=3&transport=polling&t=MJhoMgb'} self.game_api = self.create_game_api() self.mocked_mappings = self.game_api._sid_to_avatar_id self.sid = ''.join(random.choice(string.ascii_uppercase + @@ -36,15 +34,15 @@ def setUp(self): @mock.patch('service.flask_app') def create_game_api(self, flask_app): - return service.GameAPI(game_state=MockGameState(), - worker_manager=None, - logs=self.mocked_logs, - have_avatars_code_updated=self.have_avatars_code_updated) + return service.GameAPI(worker_manager=LocalWorkerManager(), + game_state=MockGameState()) @mock.patch('service.flask_app') @mock.patch('service.socketio_server', new_callable=MockedSocketIOServer) def test_socketio_emit_called(self, mocked_socketio, flask_app): + self.game_api.worker_manager.add_new_worker(1) self.game_api.register_world_update_on_connect()(self.sid, self.environ) + self.assertTrue(mocked_socketio.return_value.emit.assert_called_once) @mock.patch('service.flask_app') @@ -52,6 +50,7 @@ def test_socketio_emit_called(self, mocked_socketio, flask_app): def test_matched_session_id_to_avatar_id_mapping(self, mocked_socketio, flask_app): self.assertEqual(len(self.mocked_mappings), 0) + self.game_api.worker_manager.add_new_worker(1) self.game_api.register_world_update_on_connect()(self.sid, self.environ) self.assertEqual(len(self.mocked_mappings), 1) @@ -65,17 +64,19 @@ def test_no_match_session_id_to_avatar_id_mapping(self, mocked_socketio, flask_a self.assertEqual(len(self.mocked_mappings), 0) + self.game_api.worker_manager.add_new_worker(1) self.game_api.register_world_update_on_connect()(self.sid, self.environ) - self.assertEqual(len(self.mocked_mappings), 1) - self.assertTrue(self.sid in self.mocked_mappings) - self.assertIsNone(self.mocked_mappings[self.sid]) + self.assertEqual(len(self.mocked_mappings), 0) + self.assertFalse(self.sid in self.mocked_mappings) @mock.patch('service.flask_app') @mock.patch('service.socketio_server', new_callable=MockedSocketIOServer) def test_send_updates_for_one_user(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 - self.mocked_logs.set_user_logs(self.mocked_mappings[self.sid], 'Logs one') + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + worker = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker.log = 'Logs one' self.game_api.send_updates() @@ -89,6 +90,7 @@ def test_send_updates_for_one_user(self, mocked_socketio, flask_app): def test_no_logs_not_emitted(self, mocked_socketio, flask_app): """ If there are no logs for an avatar, no logs should be emitted. """ self.mocked_mappings[self.sid] = 1 + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) self.game_api.send_updates() mocked_socketio.emit.assert_called_once_with('game-state', {'foo': 'bar'}, room=self.sid) @@ -98,9 +100,10 @@ def test_no_logs_not_emitted(self, mocked_socketio, flask_app): def test_empty_logs_not_emitted(self, mocked_socketio, flask_app): """ If the logs are an empty sting, no logs should be emitted. """ self.mocked_mappings[self.sid] = 1 - self.have_avatars_code_updated[self.mocked_mappings[self.sid]] = False - self.mocked_logs.set_user_logs(self.mocked_mappings[self.sid], '') + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + worker = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker.logs = '' self.game_api.send_updates() mocked_socketio.emit.assert_called_once_with('game-state', {'foo': 'bar'}, room=self.sid) @@ -111,8 +114,12 @@ def test_send_updates_for_multiple_users(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 self.mocked_mappings['differentsid'] = 2 - self.mocked_logs.set_user_logs(self.mocked_mappings[self.sid], 'Logs one') - self.mocked_logs.set_user_logs(self.mocked_mappings['differentsid'], 'Logs two') + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + self.game_api.worker_manager.add_new_worker(self.mocked_mappings['differentsid']) + worker_one = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker_two = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings['differentsid']] + worker_one.log = 'Logs one' + worker_two.log = 'Logs two' self.game_api.send_updates() @@ -130,7 +137,9 @@ def test_send_updates_for_multiple_users(self, mocked_socketio, flask_app): @mock.patch('service.socketio_server', new_callable=MockedSocketIOServer) def test_send_code_changed_flag(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 - self.have_avatars_code_updated[self.mocked_mappings[self.sid]] = True + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + worker = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker.has_code_updated = True self.game_api.send_updates() user_game_state_call = mock.call('game-state', {'foo': 'bar'}, room=self.sid) @@ -142,7 +151,9 @@ def test_send_code_changed_flag(self, mocked_socketio, flask_app): @mock.patch('service.socketio_server', new_callable=MockedSocketIOServer) def test_send_false_flag_not_sent(self, mocked_socketio, flask_app): self.mocked_mappings[self.sid] = 1 - self.have_avatars_code_updated[self.mocked_mappings[self.sid]] = False + self.game_api.worker_manager.add_new_worker(self.mocked_mappings[self.sid]) + worker = self.game_api.worker_manager.player_id_to_worker[self.mocked_mappings[self.sid]] + worker.has_code_updated = False self.game_api.send_updates() mocked_socketio.emit.assert_called_once_with('game-state', {'foo': 'bar'}, room=self.sid)