def test_getting_data(self): robot = Robot("13329.12900.12213", "123", name="HappyBot") robot.set_energy(124) robot.set_honor(7) robot.set_life(3) robot.set_has_water(True) plant = Plant() plant.set_age(64) plant.set_water_level(98) database = MemcachedDatabase() database.add_robot(robot, (6, 11)) square = database.get_square((5, 11), for_update=True) square.set_plant(plant) database.commit() expected_result = { "5,11": { "surface_type": MapSquareTypes.SOIL, "plant": { "water_level": 98, "matured": True, "age": 64 }, "robot": None }, "6,11": { "surface_type": MapSquareTypes.SOIL, "plant": None, "robot": { "name": "HappyBot", "has_water": True, "energy": 124, "life": 3, "honor": 7 } }, "6,2": { "surface_type": MapSquareTypes.ROCK, "robot": None, "plant": None } } communicator = Communicator() result = communicator.execute_command("NhdEr32Qcmp0Iue3", "map_data", expected_result.keys()) self.assertCountEqual(result, expected_result) for expected_key, expected_value in expected_result.items(): self.assertDictEqual(result[expected_key], expected_value)
def test_robot_simulation(self): '''This test simulates a full game scenario.''' database = MemcachedDatabase() world = World() configs = Configs() print() print("Simulating a robot playing the game. This may take a while.") # Creating a world for the robot to live in. # The world map is: # # 000000 # 000222 # 000144 # 000144 row01 = [ MapSquare(MapSquareTypes.SOIL, (0, 30)), MapSquare(MapSquareTypes.SOIL, (1, 30)), MapSquare(MapSquareTypes.SOIL, (2, 30)), MapSquare(MapSquareTypes.SOIL, (3, 30)), MapSquare(MapSquareTypes.SOIL, (4, 30)), MapSquare(MapSquareTypes.SOIL, (5, 30)) ] row02 = [ MapSquare(MapSquareTypes.SOIL, (0, 31)), MapSquare(MapSquareTypes.SOIL, (1, 31)), MapSquare(MapSquareTypes.SOIL, (2, 31)), MapSquare(MapSquareTypes.ROCK, (3, 31)), MapSquare(MapSquareTypes.ROCK, (4, 31)), MapSquare(MapSquareTypes.ROCK, (5, 31)) ] row03 = [ MapSquare(MapSquareTypes.SOIL, (0, 32)), MapSquare(MapSquareTypes.SOIL, (1, 32)), MapSquare(MapSquareTypes.SOIL, (2, 32)), MapSquare(MapSquareTypes.SAND, (3, 32)), MapSquare(MapSquareTypes.WATER, (4, 32)), MapSquare(MapSquareTypes.WATER, (5, 32)) ] row04 = [ MapSquare(MapSquareTypes.SOIL, (0, 33)), MapSquare(MapSquareTypes.SOIL, (1, 33)), MapSquare(MapSquareTypes.SOIL, (2, 33)), MapSquare(MapSquareTypes.SAND, (3, 33)), MapSquare(MapSquareTypes.WATER, (4, 33)), MapSquare(MapSquareTypes.WATER, (5, 33)) ] database.add_square_row(row01) database.add_square_row(row02) database.add_square_row(row03) database.add_square_row(row04) # Creating parent of our robot. parent_robot = Robot("parent_robot_1982.345", "123", name="Parent") parent_robot.set_honor(configs.get_robots_birth_required_honor() + 1) world.add_robot(parent_robot, (2, 31)) database.commit() # Giving birth to our hero. result = self.post_request({ 'command': 'give_birth', 'password': '******', 'args': ["parent_robot_1982.345"] }) self.assertEqual(result['status'], 200, result) born_password = result['result'] # Robot requests a born. result = self.post_request({ 'command': 'born', 'password': born_password, 'args': [parent_robot.get_id()] }) self.assertEqual(result['status'], 200) robot_id = result['result']['robot_id'] password = result['result']['password'] # Getting status. result = self.post_request({ 'command': 'status', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) self.assertTrue(result['result']['alive']) self.assertFalse(result['result']['has_water']) self.assertEqual(result['result']['location'], "2,30") # Moving somewhere to plan a corp. # Note that parent robot is on the south. So, we have to turn around it. result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'W'] }) self.assertEqual(result['status'], 200, result) result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'S'] }) self.assertEqual(result['status'], 200, result) result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'S'] }) self.assertEqual(result['status'], 200, result) result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'E'] }) self.assertEqual(result['status'], 200, result) # We are at the location. Checking if its correct. result = self.post_request({ 'command': 'status', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) self.assertEqual(result['result']['location'], "2,32") # Planting a corp here. result = self.post_request({ 'command': 'plant', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) # Checking if it is planted. result = self.post_request({ 'command': 'sense', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) self.assertEqual(result['result']['2,32']['surface_type'], MapSquareTypes.SOIL) self.assertIsNotNone(result['result']['2,32']['plant']) # Going to pick water. result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'E'] }) self.assertEqual(result['status'], 200, result) result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'E'] }) self.assertEqual(result['status'], 200, result) result = self.post_request({ 'command': 'pick_water', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) result = self.post_request({ 'command': 'status', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) self.assertTrue(result['result']['has_water']) # Getting back to the plant location. result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'W'] }) self.assertEqual(result['status'], 200, result) result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'W'] }) self.assertEqual(result['status'], 200, result) # Watering result = self.post_request({ 'command': 'water', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) # Checking result = self.post_request({ 'command': 'sense', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) # It lost some water already. self.assertGreater(result['result']['2,32']['plant']['water_level'], 70) # Plant should be matured by now. Eating! result = self.post_request({ 'command': 'status', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) previous_energy = result['result']['energy'] result = self.post_request({ 'command': 'eat', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) result = self.post_request({ 'command': 'status', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 200, result) self.assertGreater(result['result']['energy'], previous_energy) # Now, trying some bad moves! # Trying to plant on a sand. result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'E'] }) self.assertEqual(result['status'], 200, result) result = self.post_request({ 'command': 'plant', 'password': password, 'args': [robot_id] }) self.assertEqual(result['status'], 500, result) self.assertEqual(result['error_code'], 'CannotPlantHereError') # Trying to move to a rock. result = self.post_request({ 'command': 'move', 'password': password, 'args': [robot_id, 'N'] }) self.assertEqual(result['status'], 500, result) self.assertEqual(result['error_code'], 'LocationIsBlockedError')
def test_robot_simulation(self): '''This test simulates a full game scenario.''' database = MemcachedDatabase() world = World() configs = Configs() print() print("Simulating a robot playing the game. This may take a while.") # Creating a world for the robot to live in. # The world map is: # # 000000 # 000222 # 000144 # 000144 row01 = [MapSquare(MapSquareTypes.SOIL, (0, 30)), MapSquare(MapSquareTypes.SOIL, (1, 30)), MapSquare(MapSquareTypes.SOIL, (2, 30)), MapSquare(MapSquareTypes.SOIL, (3, 30)), MapSquare(MapSquareTypes.SOIL, (4, 30)), MapSquare(MapSquareTypes.SOIL, (5, 30))] row02 = [MapSquare(MapSquareTypes.SOIL, (0, 31)), MapSquare(MapSquareTypes.SOIL, (1, 31)), MapSquare(MapSquareTypes.SOIL, (2, 31)), MapSquare(MapSquareTypes.ROCK, (3, 31)), MapSquare(MapSquareTypes.ROCK, (4, 31)), MapSquare(MapSquareTypes.ROCK, (5, 31))] row03 = [MapSquare(MapSquareTypes.SOIL, (0, 32)), MapSquare(MapSquareTypes.SOIL, (1, 32)), MapSquare(MapSquareTypes.SOIL, (2, 32)), MapSquare(MapSquareTypes.SAND, (3, 32)), MapSquare(MapSquareTypes.WATER, (4, 32)), MapSquare(MapSquareTypes.WATER, (5, 32))] row04 = [MapSquare(MapSquareTypes.SOIL, (0, 33)), MapSquare(MapSquareTypes.SOIL, (1, 33)), MapSquare(MapSquareTypes.SOIL, (2, 33)), MapSquare(MapSquareTypes.SAND, (3, 33)), MapSquare(MapSquareTypes.WATER, (4, 33)), MapSquare(MapSquareTypes.WATER, (5, 33))] database.add_square_row(row01) database.add_square_row(row02) database.add_square_row(row03) database.add_square_row(row04) # Creating parent of our robot. parent_robot = Robot("parent_robot_1982.345", "123", name="Parent") parent_robot.set_honor(configs.get_robots_birth_required_honor() + 1) world.add_robot(parent_robot, (2, 31)) database.commit() # Giving birth to our hero. result = self.post_request({'command': 'give_birth', 'password': '******', 'args': ["parent_robot_1982.345"]}) self.assertEqual(result['status'], 200, result) born_password = result['result'] # Robot requests a born. result = self.post_request({'command': 'born', 'password': born_password, 'args': [parent_robot.get_id()]}) self.assertEqual(result['status'], 200) robot_id = result['result']['robot_id'] password = result['result']['password'] # Getting status. result = self.post_request({'command': 'status', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) self.assertTrue(result['result']['alive']) self.assertFalse(result['result']['has_water']) self.assertEqual(result['result']['location'], "2,30") # Moving somewhere to plan a corp. # Note that parent robot is on the south. So, we have to turn around it. result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'W']}) self.assertEqual(result['status'], 200, result) result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'S']}) self.assertEqual(result['status'], 200, result) result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'S']}) self.assertEqual(result['status'], 200, result) result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'E']}) self.assertEqual(result['status'], 200, result) # We are at the location. Checking if its correct. result = self.post_request({'command': 'status', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) self.assertEqual(result['result']['location'], "2,32") # Planting a corp here. result = self.post_request({'command': 'plant', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) # Checking if it is planted. result = self.post_request({'command': 'sense', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) self.assertEqual(result['result']['2,32']['surface_type'], MapSquareTypes.SOIL) self.assertIsNotNone(result['result']['2,32']['plant']) # Going to pick water. result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'E']}) self.assertEqual(result['status'], 200, result) result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'E']}) self.assertEqual(result['status'], 200, result) result = self.post_request({'command': 'pick_water', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) result = self.post_request({'command': 'status', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) self.assertTrue(result['result']['has_water']) # Getting back to the plant location. result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'W']}) self.assertEqual(result['status'], 200, result) result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'W']}) self.assertEqual(result['status'], 200, result) # Watering result = self.post_request({'command': 'water', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) # Checking result = self.post_request({'command': 'sense', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) # It lost some water already. self.assertGreater(result['result']['2,32']['plant']['water_level'], 70) # Plant should be matured by now. Eating! result = self.post_request({'command': 'status', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) previous_energy = result['result']['energy'] result = self.post_request({'command': 'eat', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) result = self.post_request({'command': 'status', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 200, result) self.assertGreater(result['result']['energy'], previous_energy) # Now, trying some bad moves! # Trying to plant on a sand. result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'E']}) self.assertEqual(result['status'], 200, result) result = self.post_request({'command': 'plant', 'password': password, 'args': [robot_id]}) self.assertEqual(result['status'], 500, result) self.assertEqual(result['error_code'], 'CannotPlantHereError') # Trying to move to a rock. result = self.post_request({'command': 'move', 'password': password, 'args': [robot_id, 'N']}) self.assertEqual(result['status'], 500, result) self.assertEqual(result['error_code'], 'LocationIsBlockedError')