CSC148-Winter-2023-A0 / gym_sample_tests.py
gym_sample_tests.py
Raw
"""Assignment 0: Sample Tests
=== CSC148, Winter 2023 ===
Department of Computer Science,
University of Toronto

=== Module description ===
This module contains sample tests for Assignment 0.

Warning: This is an extremely incomplete set of tests! Add your own tests
to be confident that your code is correct.

Note: this file is to only help you; you will not submit it when you hand in
the assignment.

This code is provided solely for the personal and private use of students taking
CSC148 at the University of Toronto. Copying for purposes other than this use
is expressly prohibited.  All forms of distribution of this code, whether as
given or with any changes, are expressly prohibited.

Authors: Mario Badr, Jonathan Calver, Tom Ginsberg, Diane Horton,
Sophia Huynh, Christine Murad, Misha Schwartz, Jaisie Sin, and Jacqueline Smith.

All of the files in this directory and all subdirectories are:
Copyright (c) 2022 Mario Badr, Jonathan Calver, Tom Ginsberg, Diane Horton,
Sophia Huynh, Christine Murad, Misha Schwartz, Jaisie Sin, and Jacqueline Smith.
"""
import pytest
from gym import Instructor, Gym, WorkoutClass, datetime


class TestInstructor:
    """Test cases for the Instructor class"""

    def test_name(self) -> None:
        instructor = Instructor(1, 'Diane')
        assert instructor.name == 'Diane'

    def test_get_id(self) -> None:
        instructor = Instructor(1, 'Diane')
        assert instructor.get_id() == 1

    def test_get_certificates_empty(self) -> None:
        instructor = Instructor(1, 'Diane')
        assert instructor.get_certificates() == []

    def test_get_certificates_no_mutation(self) -> None:
        instructor = Instructor(1, 'Diane')
        certificates = instructor.get_certificates()
        assert certificates == []

        certificates.append("Cardio 1")
        assert instructor.get_certificates() == []

    def test_add_certificate_single(self) -> None:
        instructor = Instructor(1, 'Diane')
        cert = 'Cardio 1'
        instructor.add_certificate(cert)
        assert instructor.get_certificates() == ['Cardio 1']

    def test_add_certificate_duplicates(self) -> None:
        instructor = Instructor(1, 'Diane')
        cert = 'Cardio 1'
        instructor.add_certificate(cert)
        instructor.add_certificate(cert)
        assert instructor.get_certificates() == ['Cardio 1']

    def test_add_certificate_multiple(self) -> None:
        instructor = Instructor(1, 'Diane')
        instructor.add_certificate('Cardio 1')
        instructor.add_certificate('Aerobics 2')
        instructor.add_certificate('Dance 1')
        assert instructor.get_certificates() == \
               ['Cardio 1', 'Aerobics 2', 'Dance 1']


class TestGym:
    """Test cases for the Gym class"""

    def test_name_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        assert ac.name == 'Athletic Centre'

    def test_add_instructor_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        diane = Instructor(1, 'Diane')
        assert ac.add_instructor(diane) is True

    def test_add_workout_class_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        kickboxing = WorkoutClass('Kickboxing', ['Strength Training'])
        assert ac.add_workout_class(kickboxing) is True

    def test_add_room_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        assert ac.add_room('Dance Studio', 50) is True

    def test_schedule_workout_class_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        jacqueline = Instructor(1, 'Jacqueline Smith')

        assert ac.add_instructor(jacqueline) is True

        assert jacqueline.add_certificate('Cardio 1') is True

        diane = Instructor(2, 'Diane Horton')
        assert ac.add_instructor(diane) is True
        assert ac.add_room('Dance Studio', 18) is True
        assert ac.add_room('lower gym', 50) is True

        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        assert ac.add_workout_class(boot_camp) is True

        tap = WorkoutClass('Intro Tap', [])
        assert ac.add_workout_class(tap) is True
        sep_9_2022_12_00 = datetime(2022, 9, 9, 12, 0)
        assert ac.schedule_workout_class(sep_9_2022_12_00, 'lower gym',
                                         boot_camp.name,
                                         jacqueline.get_id()) is True
        assert ac.schedule_workout_class(sep_9_2022_12_00, 'Dance Studio',
                                         tap.name, diane.get_id()) is True

    def test_schedule_workout_class(self) -> None:
        ac = Gym('Athletic Centre')
        diane1 = Instructor(1, 'Diane')
        assert diane1.add_certificate('Cardio 1') is True
        diane2 = Instructor(2, 'Diane')
        david = Instructor(3, 'David')
        assert david.add_certificate('Strength Training') is True
        assert ac.add_instructor(diane1) is True
        assert ac.add_instructor(diane2) is True
        assert ac.add_instructor(david) is True
        assert ac.add_room('Dance Studio', 50) is True
        assert ac.add_room('Room A', 20) is True
        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        assert ac.add_workout_class(boot_camp) is True
        kickboxing = WorkoutClass('KickBoxing', ['Strength Training'])
        assert ac.add_workout_class(kickboxing) is True
        t1 = datetime(2022, 9, 9, 12, 0)
        assert ac.schedule_workout_class(t1, 'Dance Studio', boot_camp.name, 1)\
               is True
        assert ac.schedule_workout_class(t1, 'Room A', kickboxing.name, 3) \
               is True

    def test_register_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        diane = Instructor(1, 'Diane')
        assert diane.add_certificate('Cardio 1') is True
        assert ac.add_instructor(diane) is True
        assert ac.add_room('Dance Studio', 50) is True
        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        assert ac.add_workout_class(boot_camp) is True
        sep_9_2022_12_00 = datetime(2022, 9, 9, 12, 0)
        assert ac.schedule_workout_class(sep_9_2022_12_00,
                                         'Dance Studio',
                                         boot_camp.name,
                                         diane.get_id()) is True
        assert ac.register(sep_9_2022_12_00, 'Philip', 'Boot Camp') is True
        assert ac.register(sep_9_2022_12_00, 'Philip', 'Boot Camp') is False

    def test_register_room_full(self) -> None:
        ac = Gym('Athletic Centre')
        diane = Instructor(1, 'Diane')
        assert diane.add_certificate('Cardio 1') is True
        assert ac.add_instructor(diane) is True
        assert ac.add_room('Dance Studio', 2) is True
        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        assert ac.add_workout_class(boot_camp) is True
        sep_9_2022_12_00 = datetime(2022, 9, 9, 12, 0)
        assert ac.schedule_workout_class(sep_9_2022_12_00,
                                         'Dance Studio',
                                         boot_camp.name,
                                         diane.get_id()) is True
        assert ac.register(sep_9_2022_12_00, 'Philip', 'Boot Camp') is True
        assert ac.register(sep_9_2022_12_00, 'Caitlin', 'Boot Camp') is True
        assert ac.register(sep_9_2022_12_00, 'Barbara', 'Boot Camp') is False

    def test_register_multiple_rooms(self) -> None:
        ac = Gym('Athletic Centre')
        diane = Instructor(1, 'Diane')
        katherine = Instructor(2, 'Katherine')
        assert diane.add_certificate('Cardio 1') is True
        assert katherine.add_certificate('Cardio 1') is True
        assert ac.add_instructor(diane) is True
        assert ac.add_instructor(katherine) is True
        assert ac.add_room('Dance Studio', 2) is True
        assert ac.add_room('Upper Gym', 50) is True
        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        assert ac.add_workout_class(boot_camp) is True
        sep_9_2022_12_00 = datetime(2022, 9, 9, 12, 0)
        assert ac.schedule_workout_class(sep_9_2022_12_00,
                                         'Dance Studio',
                                         boot_camp.name,
                                         diane.get_id()) is True
        assert ac.schedule_workout_class(sep_9_2022_12_00,
                                         'Upper Gym',
                                         boot_camp.name,
                                         katherine.get_id()) is True
        assert ac.register(sep_9_2022_12_00, 'Philip', 'Boot Camp') is True
        assert ac.register(sep_9_2022_12_00, 'Caitlin', 'Boot Camp') is True
        assert ac.register(sep_9_2022_12_00, 'Barbara', 'Boot Camp') is True

    def test_instructor_hours_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        diane = Instructor(1, 'Diane')
        david = Instructor(2, 'David')
        assert diane.add_certificate('Cardio 1') is True
        assert ac.add_instructor(diane) is True
        assert ac.add_instructor(david) is True
        assert ac.add_room('Dance Studio', 50) is True
        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        assert ac.add_workout_class(boot_camp) is True
        t1 = datetime(2019, 9, 9, 12, 0)
        assert ac.schedule_workout_class(t1, 'Dance Studio',
                                         boot_camp.name, 1) is True
        t2 = datetime(2019, 9, 10, 12, 0)
        assert ac.instructor_hours(t1, t2) == {1: 1, 2: 0}
        assert ac.schedule_workout_class(t2, 'Dance Studio',
                                         boot_camp.name, 1) is True
        assert ac.instructor_hours(t1, t2) == {1: 2, 2: 0}

    def test_instructor_hours_not_consecutive(self) -> None:
        ac = Gym('Athletic Centre')
        diane = Instructor(1, 'Diane')
        david = Instructor(2, 'David')
        assert diane.add_certificate('Cardio 1') is True
        assert david.add_certificate('Dance 1')
        assert ac.add_instructor(diane) is True
        assert ac.add_instructor(david) is True
        assert ac.add_room('Dance Studio', 50) is True
        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        dance_class = WorkoutClass('Dance Class', ['Dance 1'])
        assert ac.add_workout_class(boot_camp) is True
        assert ac.add_workout_class(dance_class) is True
        t1 = datetime(2019, 9, 9, 12, 0)
        assert ac.schedule_workout_class(t1, 'Dance Studio',
                                         boot_camp.name, 1) is True
        t2 = datetime(2019, 9, 10, 12, 0)
        t3 = datetime(2019, 9, 11, 12, 0)
        assert ac.instructor_hours(t1, t3) == {1: 1, 2: 0}
        assert ac.schedule_workout_class(t2, 'Dance Studio',
                                         dance_class.name, 2) is True
        assert ac.instructor_hours(t1, t3) == {1: 1, 2: 1}

    def test_payroll_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        diane = Instructor(1, 'Diane')
        david = Instructor(2, 'David')
        assert diane.add_certificate('Cardio 1') is True
        assert ac.add_instructor(david) is True
        assert ac.add_instructor(diane) is True
        assert ac.add_room('Dance Studio', 50) is True
        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        assert ac.add_workout_class(boot_camp) is True
        t1 = datetime(2019, 9, 9, 12, 0)
        assert ac.schedule_workout_class(t1, 'Dance Studio',
                                         boot_camp.name, 1) is True
        t2 = datetime(2019, 9, 10, 12, 0)
        assert ac.payroll(t1, t2, 25.0) == \
               [(1, 'Diane', 1, 26.5), (2, 'David', 0, 0.0)]

    def test_is_instructor_name_unique_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        first_hire = Instructor(1, 'Diane')
        assert ac.add_instructor(first_hire) is True
        assert ac._is_instructor_name_unique(first_hire) is True
        second_hire = Instructor(2, 'Diane')
        assert ac.add_instructor(second_hire) is True
        assert ac._is_instructor_name_unique(first_hire) is False
        assert ac._is_instructor_name_unique(second_hire) is False
        third_hire = Instructor(3, 'Tom')
        assert ac._is_instructor_name_unique(third_hire) is True

    def test_offerings_at_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        diane1 = Instructor(1, 'Diane')
        assert diane1.add_certificate('Cardio 1') is True
        diane2 = Instructor(2, 'Diane')
        david = Instructor(3, 'David')
        assert david.add_certificate('Strength Training') is True
        assert ac.add_instructor(diane1) is True
        assert ac.add_instructor(diane2) is True
        assert ac.add_instructor(david) is True
        assert ac.add_room('Dance Studio', 50) is True
        assert ac.add_room('Room A', 20) is True
        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        assert ac.add_workout_class(boot_camp) is True
        kickboxing = WorkoutClass('KickBoxing', ['Strength Training'])
        assert ac.add_workout_class(kickboxing) is True
        t1 = datetime(2022, 9, 9, 12, 0)
        assert ac.schedule_workout_class(t1, 'Dance Studio',
                                         boot_camp.name, 1) is True
        assert ac.schedule_workout_class(t1, 'Room A',
                                         kickboxing.name, 3) is True
        assert ac.offerings_at(t1) == [
            {'Date': 'Friday, 2022-09-09', 'Time': '12:00',
             'Class': 'Boot Camp', 'Room': 'Dance Studio',
             'Registered': 0, 'Available': 50, 'Instructor': 'Diane (1)'},
            {'Date': 'Friday, 2022-09-09', 'Time': '12:00',
             'Class': 'KickBoxing', 'Room': 'Room A', 'Registered': 0,
             'Available': 20, 'Instructor': 'David'}
        ]

    def test_to_schedule_list_doctest(self) -> None:
        ac = Gym('Athletic Centre')
        diane1 = Instructor(1, 'Diane')
        assert diane1.add_certificate('Cardio 1') is True
        diane2 = Instructor(2, 'Diane')
        david = Instructor(3, 'David')
        assert david.add_certificate('Strength Training') is True
        assert ac.add_instructor(diane1) is True
        assert ac.add_instructor(diane2) is True
        assert ac.add_instructor(david) is True
        assert ac.add_room('Studio 1', 20) is True
        boot_camp = WorkoutClass('Boot Camp', ['Cardio 1'])
        assert ac.add_workout_class(boot_camp) is True
        kickboxing = WorkoutClass('KickBoxing', ['Strength Training'])
        assert ac.add_workout_class(kickboxing) is True
        t1 = datetime(2022, 9, 9, 12, 0)
        assert ac.schedule_workout_class(t1, 'Studio 1', boot_camp.name, 1) is \
               True
        t2 = datetime(2022, 9, 8, 13, 0)
        assert ac.schedule_workout_class(t2, 'Studio 1', kickboxing.name, 3) is \
               True
        assert ac.to_schedule_list() == [
            {'Date': 'Thursday, 2022-09-08', 'Time': '13:00',
             'Class': 'KickBoxing', 'Room': 'Studio 1',
             'Registered': 0, 'Available': 20, 'Instructor': 'David'},
            {'Date': 'Friday, 2022-09-09', 'Time': '12:00',
             'Class': 'Boot Camp', 'Room': 'Studio 1', 'Registered': 0,
             'Available': 20, 'Instructor': 'Diane (1)'}
        ]


if __name__ == '__main__':
    pytest.main(['gym_sample_tests.py'])