Exemplo n.º 1
0
class TestBuilding:
    """Test the Building class and its internal methods"""
    def setup(self):
        settings = {
            'bot_name': 'unittest',
            'email': '*****@*****.**',
            'registration_id': 'test_123'
        }
        self.building = Building('training_1', settings)
        self.building.floors = 10

        state = {
            'elevators': [
                {
                    'id': 0,
                    'floor': 0
                },
                {
                    'id': 1,
                    'floor': 0
                }
            ],
            'floors': 10
        }

        self.building.build_elevators(state)

    def test_build_elevators(self):
        """Tests that we build all the elevator objects"""
        # This is testing that the setup method worked
        assert_equals(len(self.building.elevators), 2)

    def test_process_elevators(self):
        """Processes the new elevator states"""
        state = {
            'elevators': [
                {
                    'id': 0,
                    'floor': 2
                },
                {
                    'id': 1,
                    'floor': 4
                }
            ]
        }
        self.building.process_elevators(state)
        assert_equals(self.building.elevators[0].location, 2)
        assert_equals(self.building.elevators[1].location, 4)

    def test_process_requests(self):
        """Processes the new elevator requests"""
        state = {
            'requests': [
                {
                    "direction": -1,
                    "floor": 3
                }
            ],
            'floors': 10
        }

        self.building.process_requests(state)
        [e.get_command() for e in self.building.elevators]
        elevator = self.building.elevators[0]
        assert_equals(elevator.next_direction, -1)

        state = {
            'requests': [
                {
                    "direction": -1,
                    "floor": 3
                },
                {
                    "direction": 1,
                    "floor": 5
                }
            ],
            'floors': 10
        }

        self.building.process_requests(state)
        [e.get_command() for e in self.building.elevators]
        elevator1 = self.building.elevators[0]
        elevator2 = self.building.elevators[1]
        assert_equals(elevator1.cur_direction, 1)
        assert_equals(elevator1.next_direction, -1)
        assert_equals(elevator2.cur_direction, 1)
        assert_equals(elevator2.next_direction, 1)

    def test_add_acked(self):
        """Adds a request to the acked list"""
        state = {
            'requests': [
                {
                    "direction": -1,
                    "floor": 3
                }
            ],
            'floors': 10
        }
        self.building.process_requests(state)
        expected = Request(3, -1)
        assert_equals(expected, self.building.acked[0])

    def test_remove_acked(self):
        """Removes a finished request from the acked list"""
        state = {
            'requests': [
                {
                    "direction": -1,
                    "floor": 3
                }
            ],
            'floors': 10
        }
        self.building.process_requests(state)
        assert_equals(len(self.building.acked), 1)

        state = {
            'elevators': [
                {
                    'id': 0,
                    'floor': 3
                }
            ]
        }
        self.building.process_elevators(state)
        self.building.generate_commands()
        assert_equals(len(self.building.acked), 0)

    def test_find_cheapest_elevator_equal(self):
        request = Request(floor=9, direction=-1)
        result = self.building.find_cheapest_elevator(request, 10)
        assert_equals(result, self.building.elevators[0])

    def test_find_cheapest_elevator_closer(self):
        state = {'elevators': [{'id': 1, 'floor': 5}], 'floors': 10}
        self.building.process_elevators(state)

        request = Request(floor=9, direction=-1)
        result = self.building.find_cheapest_elevator(request, 10)
        assert_equals(result, self.building.elevators[1])

    def test_manage_idle_elevators(self):
        self.building.elevators[0].wait_count = 3
        self.building.elevators[0].playing = True
        self.building.elevators[1].wait_count = 3
        self.building.elevators[1].playing = True
        commands = self.building.generate_commands()
        self.building.manage_idle_elevators(commands)
        for command in commands:
            assert_equals(command.direction, 1)
            assert_equals(command.speed, 1)

        state = {'requests': [{'floor': 5, 'direction': -1}]}
        self.building.process_requests(state)
        commands = self.building.generate_commands()
        for command in commands:
            assert_equals(command.direction, 1)
            assert_equals(command.speed, 1)

    def test_manage_idle_elevators_more(self):
        state = {'elevators': [{'id': 0, 'floor': 6}]}
        self.building.process_elevators(state)
        self.building.elevators[0].wait_count = 3
        self.building.elevators[0].playing = True
        self.building.elevators[1].wait_count = 3
        self.building.elevators[1].playing = True

        state = {'requests': [{'floor': 5, 'direction': -1}]}
        self.building.process_requests(state)
        commands = self.building.generate_commands()
        assert_equals(commands[0].direction, -1)
        assert_equals(commands[0].speed, 1)
        assert_equals(commands[1].direction, 1)
        assert_equals(commands[1].speed, 1)