Exemple #1
0
    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')