Files

141 lines
7.1 KiB
Python

import inspect
import unittest
import pytest
from generators import (
generate_seat_letters,
generate_seats,
assign_seats,
generate_codes
)
class PlaneTicketsTest(unittest.TestCase):
@pytest.mark.task(taskno=1)
def test_task1_returns_generator(self):
"""Test if generate_seat_letters() returns a generator type."""
number = 5
error_message = (f'Called generate_seat_letters({number}). '
f'The function returned a {type(generate_seat_letters(number))} type, '
f"but the tests expected the function to return a <class 'generator'> type.")
self.assertTrue(inspect.isgenerator(generate_seat_letters(number)), msg=error_message)
@pytest.mark.task(taskno=1)
def test_generate_seat_letters(self):
test_data = [1, 2, 3, 4, 5]
result_data = [["A"],
["A", "B"],
["A", "B", "C"],
["A", "B", "C", "D"],
["A", "B", "C", "D", "A"]]
for variant, (number, expected) in enumerate(zip(test_data, result_data), start=1):
with self.subTest(f"variation #{variant}", number=number, expected=expected):
actual_result = list(generate_seat_letters(number))
error_message = (f'Called generate_seat_letters({number}). '
f'The function returned {actual_result}, but the tests '
f'expected {expected} when generating {number} seat(s).')
self.assertEqual(actual_result, expected, msg=error_message)
@pytest.mark.task(taskno=2)
def test_task2_returns_generator(self):
"""Test if generate_seats() returns a generator type."""
number = 7
error_message = (f'Called generate_seats({number}). '
f'The function returned a {type(generate_seats(number))} type, '
f"but the tests expected the function to return a <class 'generator'> type.")
self.assertTrue(inspect.isgenerator(generate_seats(number)), msg=error_message)
@pytest.mark.task(taskno=2)
def test_generate_seats(self):
test_data = [1, 2, 3, 4, 5]
result_data = [["1A"],
["1A", "1B"],
["1A", "1B", "1C"],
["1A", "1B", "1C", "1D"],
["1A", "1B", "1C", "1D", "2A"]]
for variant, (number, expected) in enumerate(zip(test_data, result_data), start=1):
with self.subTest(f"variation #{variant}", number=number, expected=expected):
actual_result = list(generate_seats(number))
error_message = (f'Called generate_seats({number}). '
f'The function returned {actual_result}, but the tests '
f'expected {expected} when generating {number} seat(s).')
self.assertEqual(actual_result, expected, msg=error_message)
@pytest.mark.task(taskno=2)
def test_generate_seats_skips_row_13(self):
test_data = [14 * 4]
result_data = [["1A", "1B", "1C", "1D", "2A", "2B", "2C", "2D",
"3A", "3B", "3C", "3D", "4A", "4B", "4C", "4D",
"5A", "5B", "5C", "5D", "6A", "6B", "6C", "6D",
"7A", "7B", "7C", "7D", "8A", "8B", "8C", "8D",
"9A", "9B", "9C", "9D", "10A", "10B", "10C", "10D",
"11A", "11B", "11C", "11D", "12A", "12B", "12C", "12D",
"14A", "14B", "14C", "14D", "15A", "15B", "15C", "15D"]]
for variant, (number, expected) in enumerate(zip(test_data, result_data), start=1):
with self.subTest(f"variation #{variant}", number=number, expected=expected):
actual_result = list(generate_seats(number))
error_message = (f'Called generate_seats({number}). '
f'The function returned {actual_result}, but the tests '
f'expected: {expected}, when generating {number} seat(s).')
self.assertEqual(actual_result, expected, msg=error_message)
@pytest.mark.task(taskno=3)
def test_assign_seats(self):
test_data = [["Passenger1", "Passenger2", "Passenger3", "Passenger4", "Passenger5"],
["TicketNo=5644", "TicketNo=2273", "TicketNo=493", "TicketNo=5411", "TicketNo=824"]]
result_data = [{"Passenger1": "1A", "Passenger2": "1B",
"Passenger3": "1C", "Passenger4": "1D", "Passenger5": "2A"},
{"TicketNo=5644": "1A", "TicketNo=2273": "1B",
"TicketNo=493": "1C", "TicketNo=5411": "1D", "TicketNo=824": "2A"}]
for variant, (passengers, expected) in enumerate(zip(test_data, result_data), start=1):
with self.subTest(f"variation #{variant}", passengers=passengers, expected=expected):
actual_result = assign_seats(passengers)
error_message = (f'Called assign_seats({passengers}). '
f'The function returned {actual_result}, but the tests '
f'expected {expected}, when assigning seats.')
self.assertEqual(actual_result, expected, msg=error_message)
@pytest.mark.task(taskno=4)
def test_task4_returns_generator(self):
"""Test if generate_codes() returns a generator type."""
seat_numbers, flight_id = "11B", "HA80085"
error_message = (f'Called generate_codes({seat_numbers}, {flight_id}). '
f'The function returned a {type(generate_codes(seat_numbers, flight_id))} type, '
f"but the tests expected the function to return a <class 'generator'> type.")
self.assertTrue(inspect.isgenerator(generate_codes(seat_numbers, flight_id)), msg=error_message)
@pytest.mark.task(taskno=4)
def test_generate_codes(self):
test_data = [(["12A", "38B", "69C", "102B"],"KL1022"),
(["22C", "88B", "33A", "44B"], "DL1002")]
result_data = [['12AKL1022000', '38BKL1022000', '69CKL1022000', '102BKL102200'],
['22CDL1002000', '88BDL1002000', '33ADL1002000', '44BDL1002000']]
for variant, ((seat_numbers, flight_id), expected) in enumerate(zip(test_data, result_data), start=1):
with self.subTest(f"variation #{variant}", seat_numbbers=seat_numbers,
flight_id=flight_id, expected=expected):
actual_result = list(generate_codes(seat_numbers, flight_id))
error_message = (f'Called generate_codes({seat_numbers}, {flight_id}). '
f'The function returned {actual_result}, but the tests '
f'expected {expected} when generating ticket numbers.')
# Note: DO NOT call the function here again, in case the student is using list.pop()
# to process the input. If another call is done with that condition,
# the test will fail with a terrible error message.
self.assertEqual(actual_result, expected, msg=error_message)