예제 #1
0
def run():
    """
    Bootstraps the application.
    """
    dispatcher = Dispatcher()

    input_file_path = sys.argv[1] if len(sys.argv) > 1 else None
    if input_file_path:
        try:
            with open(input_file_path, "r") as f:
                for cmd in f:
                    response = dispatcher.dispatch(cmd)
        except FileNotFoundError:
            logger.error("No such file: {}".format(input_file_path))

    else:
        cmd = None
        while True:
            cmd = input()
            if cmd:
                if cmd == 'exit':
                    break
                else:
                    response = dispatcher.dispatch(cmd)
예제 #2
0
class TestParkingLot(unittest.TestCase):
    def setUp(self):
        self.dispatcher = Dispatcher()

    def tearDown(self):
        self.dispatcher = None

    def test_1_parse_cmd(self):
        cmd = "CMD_{}".format(str(uuid4()))
        cmd_key, parsed_data = parse(cmd)
        self.assertIsNone(
            cmd_key,
            msg="{} is invalid command, command key must be null".format(cmd))
        self.assertIsNone(
            parsed_data,
            msg="{} is invalid command, command info must be null".format(cmd))

        cmd = "status"
        cmd_key, parsed_data = parse(cmd)
        self.assertIsNotNone(
            cmd_key,
            msg="{} is valid command, command key must not be null".format(
                cmd))
        self.assertIsNotNone(
            parsed_data,
            msg="{} is valid command, command info must not be null".format(
                cmd))

    def test_2_check_if_parking_lot_available(self):
        cmd = "status"
        response = self.dispatcher.dispatch(cmd)
        if not response.success:
            self.assertEqual(response.error,
                             ErrorConstant.NO_PARKING_LOT_FOUND)

    def test_3_create(self):
        size = 7
        response = self.create_parking_lot(size=size)
        self.assertEqual(size, int(response.data.get('size', 0)))

    def test_4_park(self):
        c_response = self.create_parking_lot(size=5)
        self.assertTrue(c_response.success)

        for i in range(0, 7):
            # PARKING_LOT_OVERFLOW
            p_response = self.dispatcher.dispatch(
                "park DL-3C-909{} GREY".format(i))
            if not p_response.success:
                self.assertIn(p_response.error,
                              (ErrorConstant.PARKING_LOT_OVERFLOW,
                               ErrorConstant.NO_PARKING_LOT_FOUND,
                               ErrorConstant.SLOT_OCCUPIED,
                               ErrorConstant.VEHICLE_IS_ALREADY_PARKED))

        c_response = self.create_parking_lot(size=5)
        self.assertTrue(c_response.success)
        for i in range(0, 5):
            # VEHICLE_IS_ALREADY_PARKED
            p_response = self.dispatcher.dispatch("park DL-3C-9010 GREY")
            if not p_response.success:
                self.assertIn(p_response.error,
                              (ErrorConstant.PARKING_LOT_OVERFLOW,
                               ErrorConstant.NO_PARKING_LOT_FOUND,
                               ErrorConstant.SLOT_OCCUPIED,
                               ErrorConstant.VEHICLE_IS_ALREADY_PARKED))

    def test_5_leave(self):
        c_response = self.create_parking_lot(size=5)
        self.assertTrue(c_response.success)

        reg_nums = ["DL-3C-9070", "DL-3C-9071"]
        for reg_num in reg_nums:
            self.dispatcher.dispatch("park {} GREY".format(reg_num))

        for slot_num in range(1, 7):
            l_res = self.dispatcher.dispatch("leave {}".format(slot_num))
            if not l_res.success:
                self.assertEqual(l_res.error,
                                 ErrorConstant.INVALID_SLOT,
                                 msg="Invalid slot")
            else:
                reg_num = l_res.data.get('reg_num', None)
                self.assertEqual(reg_num, reg_nums[slot_num - 1])

    def test_6_reg_nums_by_color(self):
        c_response = self.create_parking_lot(size=5)
        self.assertTrue(c_response.success)

        col_reg_nums_mapping = {
            'White': {'park DL-3C-9090', 'park DL-3C-9091', 'park DL-3C-9092'},
            'Black': {'park DL-3C-9080', 'park DL-3C-9081'}
        }
        for col, reg_nums in col_reg_nums_mapping.items():
            for reg_num in reg_nums:
                self.dispatcher.dispatch("park {} {}".format(reg_num, col))

        for col in ['White', 'Black', 'Grey']:
            response = self.dispatcher.dispatch(
                'registration_numbers_for_cars_with_colour {}'.format(col))
            fetched_reg_nums = set(response.data.get('reg_nums', []))
            if fetched_reg_nums and len(fetched_reg_nums) > 0:
                self.assertSetEqual(fetched_reg_nums,
                                    col_reg_nums_mapping.get(col, {}))

    def test_7_slot_nums_by_color(self):
        c_response = self.create_parking_lot(size=7)
        self.assertTrue(c_response.success)

        col_slot_nums_mapping = {'White': {'1', '2', '3'}, 'Black': {'4', '5'}}
        for col, slot_nums in col_slot_nums_mapping.items():
            for slot_num in slot_nums:
                self.dispatcher.dispatch("park DL-3C-909{} {}".format(
                    slot_num, col))

        for col in ['White', 'Black', 'Grey']:
            response = self.dispatcher.dispatch(
                'slot_numbers_for_cars_with_colour {}'.format(col))
            fetched_slot_nums = set(response.data.get('slot_nums', []))
            if fetched_slot_nums and len(fetched_slot_nums) > 0:
                self.assertSetEqual(fetched_slot_nums,
                                    col_slot_nums_mapping.get(col, {}))

    def test_8_slot_num_by_reg_num(self):
        c_response = self.create_parking_lot(size=7)
        self.assertTrue(c_response.success)

        reg_nums = ["DL-3C-9017", "DL-3C-9071", "DL-3C-9072", "DL-3C-9018"]
        for reg_num in reg_nums:
            self.dispatcher.dispatch("park {} GREY".format(reg_num))

        for reg_num in [
                "DL-3C-9017", "DL-3C-9071", "INVALID_REG_NUM1",
                "INVALID_REG_NUM2"
        ]:
            res = self.dispatcher.dispatch(
                'slot_number_for_registration_number {}'.format(reg_num))
            if not res.success:
                self.assertIsNone(res.data.get('slot_num', None))

    def create_parking_lot(self, size=5):
        cmd = "create_parking_lot {}".format(str(size))
        response = self.dispatcher.dispatch(cmd)
        return response