def test__get_meetings_handles_unavailability(self):
        """ Tests that _get_meetings filters sections with meetings conflicting
            with the given unavailable_times
        """
        # Arrange
        course = CourseFilter("CSCE", "310")
        term = "201931"
        include_full = True
        unavailable_times = (UnavailableTime(time(8), time(8, 30), 4),)
        meetings = [
            # Meetings for CSCE 310-501
            Meeting(id=10, meeting_days=[True] * 7, start_time=time(11, 30),
                    end_time=time(12, 20), meeting_type='LEC', section=self.sections[0]),
            Meeting(id=11, meeting_days=[True] * 7, start_time=time(9),
                    end_time=time(9, 50), meeting_type='LEC', section=self.sections[0]),
            # Meetings for CSCE 310-502
            Meeting(id=20, meeting_days=[True] * 7, start_time=time(11, 30),
                    end_time=time(12, 20), meeting_type='LEC', section=self.sections[1]),
            Meeting(id=21, meeting_days=[True] * 7, start_time=time(8),
                    end_time=time(8, 50), meeting_type='LAB', section=self.sections[1]),
        ]
        Meeting.objects.bulk_create(meetings)
        # Section 502 should be filtered because of the unavailable time
        valid_sections = set((1,))
        meetings_for_sections = {1: meetings[0:2]}
        # Act
        meetings = _get_meetings(course, term, include_full, unavailable_times)

        # Assert
        self.assert_meetings_match_expected(meetings, valid_sections,
                                            meetings_for_sections)
Beispiel #2
0
def _parse_unavailable_time(avail) -> UnavailableTime:
    """ Parses an availability input and convert it to an UnavailableTime object
        to be used in create_schedules
    """

    start_time = convert_meeting_time(avail["startTime"])
    end_time = convert_meeting_time(avail["endTime"])
    day = avail["day"]

    return UnavailableTime(start_time, end_time, day)
    def handle(self, *args, **options):
        # Setup data to create schedule from
        course_names = [("COMM", "203"), ("CSCE", "121"), ("CSCE", "411"),
                        ("MATH", "151"), ("CSCE", "181")]
        courses = [
            CourseFilter(subject, course_num)
            for subject, course_num in course_names
        ]
        courses[3] = CourseFilter("ACCT", "229", honors=True)
        term = "201911"
        unavailable_times = [
            UnavailableTime(datetime.time(8), datetime.time(8, 50), 2),
            UnavailableTime(datetime.time(8), datetime.time(8, 50), 3)
        ]

        start = time()
        schedules = create_schedules(courses, term, unavailable_times)
        end = time()
        print(f"Took {end - start:.4f} seconds to create schedules")
        print(schedules)
    def test_create_schedules_uses_unavailable_times(self):
        """ Tests that create_schedule filters out the provided unavailable_times. """
        # There are 4 possible schedules to generate, 1 is valid given the
        # unavailable times
        # Arrange
        courses = (
            CourseFilter("CSCE", "310"),
            CourseFilter("CSCE", "121",
                         honors=BasicFilter.NO_PREFERENCE,
                         web=BasicFilter.NO_PREFERENCE)
        )
        term = "201931"
        include_full = True
        unavailable_times = [UnavailableTime(time(9, 1), time(9, 2), 4)]
        meetings = [
            # Meetings for CSCE 310-501
            Meeting(id=10, meeting_days=[True] * 7, start_time=time(11, 30),
                    end_time=time(12, 20), meeting_type='LEC', section=self.sections[0]),
            Meeting(id=11, meeting_days=[True] * 7, start_time=time(9),
                    end_time=time(9, 50), meeting_type='LEC', section=self.sections[0]),
            # Meetings for CSCE 310-502
            Meeting(id=20, meeting_days=[True] * 7, start_time=time(11, 30),
                    end_time=time(12, 20), meeting_type='LEC', section=self.sections[1]),
            Meeting(id=21, meeting_days=[True] * 7, start_time=time(8),
                    end_time=time(8, 50), meeting_type='LAB', section=self.sections[1]),
            # Meetings for CSCE 121-501
            Meeting(id=40, meeting_days=[True] * 7, start_time=time(11, 30),
                    end_time=time(12, 20), meeting_type='LEC', section=self.sections[3]),
            Meeting(id=41, meeting_days=[True] * 7, start_time=time(9, 10),
                    end_time=time(10), meeting_type='LAB', section=self.sections[3]),
            # Meetings for CSCE 121-502
            Meeting(id=50, meeting_days=[True] * 7, start_time=time(12, 30),
                    end_time=time(1, 20), meeting_type='LEC', section=self.sections[4]),
            Meeting(id=51, meeting_days=[True] * 7, start_time=time(10),
                    end_time=time(10, 50), meeting_type='LAB', section=self.sections[4]),
        ]
        Meeting.objects.bulk_create(meetings)
        expected_schedules = set(((2, 5),))

        # Act
        schedules = set(create_schedules(courses, term, unavailable_times, include_full,
                                         num_schedules=10))

        # Act
        print('calculator')
        print(schedules)
        print(expected_schedules)
        self.assertEqual(schedules, expected_schedules)
Beispiel #5
0
    def test_parse_unavailable_time_is_correct(self):
        """ Tests that _parse_unavailable_times works on a typical input """

        # Arrange
        availability = {
            "startTime": "0800",
            "endTime": "1000",
            "day": 0,
        }

        expected = UnavailableTime(time(8, 00), time(10, 00), 0)

        # Act
        result = _parse_unavailable_time(availability)

        # Assert
        self.assertEqual(result, expected)
Beispiel #6
0
    def test_create_schedules_throws_when_no_sections_match_availability(self):
        """ Tests that create_schedules throws an appropriate error message when no
            sections match the selected availabilities.
        """
        # Arrange
        subject = 'CSCE'
        course_num = '221'
        courses = (CourseFilter(subject, course_num, include_full=True), )
        term = '201931'
        unavailable_times = [UnavailableTime(time(0, 0), time(23, 59), 0)]
        Meeting(id=80,
                meeting_days=[True, *[False] * 6],
                start_time=time(0, 0),
                end_time=time(23, 59),
                meeting_type='LEC',
                section=self.sections[7]).save()
        expected_error = _NO_SECTIONS_MATCH_AVAILABILITIES.format(
            subject=subject, course_num=course_num)

        # Act + Assert
        with self.assertRaisesMessage(NoSchedulesError, expected_error):
            create_schedules(courses, term, unavailable_times)