class Test_Dirt(unittest.TestCase): def setUp(self): cells = [[0, 0, 1]] ctypes = [('Floor',), ('Water',)] self.level = Level(MockDataFile(cells, ctypes)) self.dirt = self.level.add_sprite('Dirt', (1, 0)) self.player = self.level.add_sprite('Player', (0, 0)) def test_dirt_becomes_bridge_when_in_water(self): self.assertFalse(self.dirt.is_bridge) self.dirt.pos = 2, 0 self.level.update_level() self.assertTrue(self.dirt.is_bridge) def test_dirt_doesnt_become_bridge_when_bridge_already_in_water(self): self.level.add_sprite('Dirt', (2, 0)) self.level.update_level() self.dirt.pos = 2, 0 self.level.update_level() self.assertFalse(self.dirt.is_bridge) def test_dirt_no_longer_solid_once_player_has_walked_on_it(self): self.dirt.pos = 2, 0 self.level.update_level() self.assertTrue(self.dirt.is_solid) self.player.pos = 2, 0 self.level.update_level() self.assertFalse(self.dirt.is_solid)
class Test_Movable(unittest.TestCase): def setUp(self): cells = [[0, 0, 1, 0]] ctypes = [('Floor',), ('Fire',)] self.level = Level(MockDataFile(cells, ctypes)) self.player = self.level.add_sprite('Player', (0, 0)) self.movable = MockMovable(self.level, (1, 0)) self.level.sprites.add(self.movable) self.celltime = 1000 / self.player.speed # time to move 1 cell def test_movable_item_has_movable_attribute(self): self.assertTrue(self.movable.is_movable) def test_movable_item_moves_over_fire(self): self.player.attempt_move(1) self.level.update_level(self.celltime * 2) self.assertEqual(self.movable.pos, (3, 0)) def test_movable_item_doesnt_move_over_fire_if_blocked(self): self.level.add_sprite('Crate', (3, 0)) self.player.attempt_move(1) self.level.update_level(self.celltime * 2) self.assertEqual(self.movable.pos, (2, 0))
class Test_Player(unittest.TestCase): def setUp(self): cells = [[0, 0, 0, 1], [0, 2, 0, 0]] ctypes = [('Floor',), ('Wall',), ('SentryButton',)] self.level = Level(MockDataFile(cells, ctypes)) self.player = self.level.add_sprite('Player', (0, 1)) self.sentry = self.level.add_sprite('Sentry', (0, 0), 3) # time to move 1 cell self.playertime = 1000 / self.player.speed self.sentrytime = 1000 / self.sentry.speed def test_sentry_turns_when_button_triggered(self): self.player.attempt_move(1) self.level.update_level(self.playertime) self.assertEqual(self.sentry.rotate, 1) def test_sentry_moves_forward_when_possible(self): self.sentry.rotate = 1 self.level.update_level(self.sentrytime) self.assertEqual(self.sentry.pos, (1, 0)) self.level.update_level(self.sentrytime) self.assertEqual(self.sentry.pos, (2, 0)) self.level.update_level(self.sentrytime) self.assertEqual(self.sentry.pos, (2, 0)) # stopped by wall
class Test_Toggle(unittest.TestCase): def setUp(self): cells = [[0, 1, 0]] ctypes = [('Floor',), ('ToggleButton',)] self.level = Level(MockDataFile(cells, ctypes)) self.toggle = self.level.add_sprite('Toggle', (2, 0), True) def test_player_stepping_on_button_reverses_toggle(self): self.assertTrue(self.toggle.is_solid) player = self.level.add_sprite('Player', (0, 0)) player.attempt_move(1) self.level.update_level(1000 / player.speed) self.assertFalse(self.toggle.is_solid)
class Test_Rover(unittest.TestCase): def setUp(self): cells = [[0, 0, 0]] ctypes = [('Floor',)] self.level = Level(MockDataFile(cells, ctypes)) self.player = self.level.add_sprite('Player', (0, 0)) self.rover = self.level.add_sprite('Rover', (2, 0)) self.celltime = 1000 / self.player.speed # time to move 1 cell def test_rover_follows_player_after_player_moves_adjacent(self): self.player.start_move(1) self.level.update_level(self.celltime) self.assertIn(self.rover, self.player.followers) def test_rover_faces_toward_players_last_position(self): self.player.pos = 1, 0 self.player.followers.add(self.rover) self.player.start_move(3) self.level.update_level(self.celltime) self.assertEqual(self.rover.rotate, 3)
class Test_Laser(unittest.TestCase): def setUp(self): cells = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] ctypes = [('Floor',)] self.level = Level(MockDataFile(cells, ctypes)) self.laser = self.level.add_sprite('Laser', (0, 1), 1) def test_laser_creates_laserbeams(self): self.level.update_level() self.assertItemsEqual([beam.pos for beam in self.level.sprites['Laserbeam']], [(1, 1), (2, 1), (3, 1)]) def test_solid_object_blocks_laserbeams(self): self.level.add_sprite('Crate', (2, 1), 2) self.level.update_level() self.assertItemsEqual([beam.pos for beam in self.level.sprites['Laserbeam']], [(1, 1)]) def test_mirror_bounces_laserbeams(self): self.level.add_sprite('Mirror', (2, 1), 2) self.level.update_level() self.assertItemsEqual([beam.pos for beam in self.level.sprites['Laserbeam']], [(1, 1), (2, 1), (2, 2)]) def test_laserbeam_kills_destructible_sprites(self): player = self.level.add_sprite('Player', (1, 1)) rover = self.level.add_sprite('Rover', (2, 1)) robot = self.level.add_sprite('Robot', (3, 1)) self.level.update_level() self.assertNotIn(player, self.level.sprites) self.assertNotIn(rover, self.level.sprites) self.assertNotIn(robot, self.level.sprites)
class Test_Robot(unittest.TestCase): def setUp(self): cells = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] ctypes = [('Floor',)] self.level = Level(MockDataFile(cells, ctypes)) self.robot = self.level.add_sprite('Robot', (1, 1)) self.celltime = 1000 / self.robot.speed def test_robot_rotates_left_if_follow_dir_is_zero(self): self.robot.start_turn() self.assertEqual(self.robot.rotate, 3) def test_robot_rotates_right_if_follow_dir_is_one(self): self.robot.follow_dir = 1 self.robot.start_turn() self.assertEqual(self.robot.rotate, 1) def test_robot_move_dir_matches_rotate_dir(self): self.robot.start_turn() self.assertEqual(self.robot.move_dir, 3) def test_robot_moves_if_unobstructed(self): self.robot.start_turn() self.assertEqual(self.robot.to_move, 1) def test_robot_moves_straight_if_edge_in_follow_dir(self): self.robot.pos = (0, 1) self.robot.start_turn() self.assertEqual(self.robot.move_dir, 0) def test_robot_moves_straight_if_object_in_follow_dir(self): self.level.add_sprite('Crate', (0, 1)) self.robot.start_turn() self.assertEqual(self.robot.move_dir, 0) def test_robot_rotates_opposite_way_if_obstructed_in_follow_dir_and_ahead(self): self.level.add_sprite('Crate', (0, 1)) self.level.add_sprite('Crate', (1, 0)) self.robot.start_turn() self.assertEqual(self.robot.move_dir, 1) def test_robot_does_180_if_obstructed_ahead_and_on_both_sides(self): self.robot.pos = (0, 0) self.level.add_sprite('Crate', (1, 0)) self.robot.start_turn() self.assertEqual(self.robot.move_dir, 2) def test_robot_kills_player_on_entering_players_cell(self): player = self.level.add_sprite('Player', (0, 1)) self.level.update_level(1) self.assertNotIn(player, self.level.sprites)
class Test_Player(unittest.TestCase): def setUp(self): cells = [[1, 1, 1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] ctypes = [('Floor',), ('Wall',)] self.level = Level(MockDataFile(cells, ctypes)) self.player = self.level.add_sprite('Player', (0, 1)) self.crate = self.level.add_sprite('Crate', (1, 1)) self.celltime = 1000 / self.player.speed # time to move 1 cell def test_player_enters_cells_with_movables(self): self.player.attempt_move(1) self.assertEqual(self.player.to_move, 1) def test_player_pushes_movable_objects(self): self.player.attempt_move(1) self.assertIn(self.crate, self.player.pushing) def test_player_moves_pushed_objects(self): self.level.update_level(self.celltime, [('move', 1)]) self.assertEqual(self.crate.pos, (2, 1)) def test_player_doesnt_push_movable_with_solid_in_cell_behind(self): self.level.add_sprite('Robot', (2, 1.5)) self.player.attempt_move(1) self.assertEqual(self.player.to_move, 0) def test_player_doesnt_push_movable_with_level_edge_behind(self): self.level.add_sprite('Crate', (0, 0)) self.player.attempt_move(0) self.assertEqual(self.player.to_move, 0) def test_player_doesnt_push_without_passable_cell_behind_on_key_event(self): self.level.add_sprite('Crate', (0, 0)) self.level.update_level(self.celltime, [('move', 0)]) self.assertEqual(self.player.pos, (0, 1)) def test_followers_move_when_player_moves(self): self.player.followers.add(self.crate) self.player.attempt_move(2) self.assertEqual(self.crate.to_move, 1) def test_followers_move_toward_players_last_position(self): self.player.followers.add(self.crate) self.player.attempt_move(2) self.assertEqual(self.crate.move_dir, 3) def test_player_picks_up_items_when_arriving_in_their_cell(self): key = self.level.add_sprite('Key', (0, 2)) self.player.attempt_move(2) self.level.update_level(self.celltime) self.assertIn(key, self.player.carrying) def test_carried_items_move_with_player(self): key = self.level.add_sprite('Key', (0, 1)) self.player.carrying.add(key) self.player.attempt_move(2) self.level.update_level(self.celltime) self.assertEqual(key.pos, (0, 2)) def test_player_starts_moving_after_move_event(self): self.player.handle_action('move', 2) self.player.start_turn() self.assertEqual(self.player.to_move, 1) def test_player_moves_after_move_event(self): self.level.update_level(self.celltime, [('move', 2)]) self.assertEqual(self.player.pos, (0, 2)) def test_player_keeps_moving_until_key_released(self): self.level.update_level(self.celltime, [('move', 2)]) self.level.update_level(self.celltime) self.assertEqual(self.player.pos, (0, 3)) def test_player_stops_moving_when_key_released(self): self.level.update_level(self.celltime, [('move', 2)]) self.level.update_level(self.celltime) self.level.update_level(self.celltime, [('move', 2, False)]) self.assertEqual(self.player.pos, (0, 3)) def test_player_keeps_moving_in_1st_direction_when_2nd_key_pressed(self): self.level.update_level(self.celltime, [('move', 2)]) self.level.update_level(self.celltime, [('move', 1)]) self.assertEqual(self.player.pos, (0, 3)) def test_player_starts_moving_in_2nd_direction_when_1st_key_released(self): self.level.update_level(self.celltime, [('move', 2)]) self.level.update_level(self.celltime, [('move', 1)]) self.level.update_level(self.celltime, [('move', 2, False)]) self.assertEqual(self.player.pos, (1, 3))
class Test_Shooter(unittest.TestCase): def setUp(self): cells = [[0, 0, 0, 1, 0], [0, 0, 0, 0, 0]] ctypes = [("Floor",), ("Wall",)] self.level = Level(MockDataFile(cells, ctypes)) self.player = self.level.add_sprite("Player", (1, 0)) self.level.add_sprite("Shooter", (0, 0), 1) def test_shooter_kills_player_in_front(self): self.level.update_level() self.assertNotIn(self.player, self.level.sprites) def test_shooter_kills_rover_in_front(self): self.player.pos = (2, 0) rover = self.level.add_sprite("Rover", (1, 0)) self.level.update_level() self.assertNotIn(rover, self.level.sprites) def test_shooter_kills_player_farther_in_front(self): self.player.pos = (2, 0) self.level.update_level() self.assertNotIn(self.player, self.level.sprites) def test_shooter_doesnt_kill_player_beside(self): self.player.pos = (0, 1) self.level.update_level() self.assertIn(self.player, self.level.sprites) def test_shooter_doesnt_kill_player_behind_wall(self): self.player.pos = (4, 0) self.level.update_level() self.assertIn(self.player, self.level.sprites) def test_shooter_doesnt_kill_player_behind_crate(self): self.player.pos = (2, 0) self.level.add_sprite("Crate", (1, 0)) self.level.update_level() self.assertIn(self.player, self.level.sprites)