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)
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)
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)
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)