diff --git a/README.md b/README.md index 60b0584..3e055a4 100644 --- a/README.md +++ b/README.md @@ -6,18 +6,20 @@ - If the number of registered students is between 10 and 50 in the Engineering Faculty, the course will be held in building B. - For the Art and Science Faculty, if the number of registered students is less than 10, the course will be held in building B. - If the number of registered students is between 10 and 50, the course will be held in building C. - - If the number of registered students is greater than 50 for both faculties, the course will be held in building D. + - If the number of registered students is greater than 50 for both faculties, the course will be held in building D. + - If the sum of the students are over 50 then the bigger group has to move to building D. ### The same in a table -| enginner_students | art_science_students | Building result | -|-------------------|----------------------|-----------------| -| <10 | | A | -| between 10-50 | | B | -| | <10 | B | -| | between 10-50 | C | -| >50 | >50 | D | +| engineer_students | art_science_students | Building result | +|-------------------|----------------------|-------------------------------| +| <10 | | engineer: A | +| between 10-50 | | engineer: B | +| | <10 | art_science: B | +| | between 10-50 | art_science: C | +| >50 | >50 | both: D | +| x | y | x+y>50 -> bigger group: D (equality -> art_science: D) | ## The goal is -- Tested this program -- Created bugs for this implementations that are difficult to see - - *bad functions +- Test this program +- Create bugs for this implementations that are difficult to see + - Implemented these in *bad functions - Minimize tests which can detect these bugs \ No newline at end of file diff --git a/allocation.py b/allocation.py index 4dd3240..0412a6a 100644 --- a/allocation.py +++ b/allocation.py @@ -28,24 +28,42 @@ def get_art_and_science_students_number(default_value): else: return default_value +def is_sum_over_50(engineering_students, art_science_students): + return engineering_students + art_science_students > 50 + +def get_bigger_number(engineering_students, art_science_students): + # in case of equality return art_science_students, because of the requirement + if engineering_students > art_science_students: + return "engineers" + else: + return "art_science" def allocate_1(engineering_students, art_science_students): engineer_course = Building.Default art_science_course = Building.Default - if engineering_students < 10: - engineer_course = Building.A - elif 10 <= engineering_students <= 50: - engineer_course = Building.B - elif engineering_students > 50: - engineer_course = Building.D - - if art_science_students < 10: - art_science_course = Building.B - elif 10 <= art_science_students <= 50: - art_science_course = Building.C - elif art_science_students > 50: - art_science_course = Building.D + if is_sum_over_50(engineering_students, art_science_students): + bigger_group = get_bigger_number(engineering_students, art_science_students) + if bigger_group == "engineers": + engineer_course = Building.D + if bigger_group == "art_science": + art_science_course = Building.D + + if engineer_course != Building.D: + if engineering_students < 10: + engineer_course = Building.A + elif 10 <= engineering_students <= 50: + engineer_course = Building.B + elif engineering_students > 50: + engineer_course = Building.D + + if art_science_course != Building.D: + if art_science_students < 10: + art_science_course = Building.B + elif 10 <= art_science_students <= 50: + art_science_course = Building.C + elif art_science_students > 50: + art_science_course = Building.D return (engineer_course, art_science_course) @@ -54,106 +72,160 @@ def allocate_1_bad(engineering_students, art_science_students): engineer_course = Building.Default art_science_course = Building.Default - if engineering_students < 10: - engineer_course = Building.A - if 10 <= engineering_students <= 50: - engineer_course = Building.B - if engineering_students >= 50: - engineer_course = Building.D - - if art_science_students < 10: - art_science_course = Building.B - if 10 <= art_science_students <= 50: - art_science_course = Building.C - if art_science_students >= 50: - art_science_course = Building.D + if is_sum_over_50(engineering_students, art_science_students): + bigger_group = get_bigger_number(engineering_students, art_science_students) + if bigger_group == "engineers": + engineer_course = Building.D + if bigger_group == "art_science": + art_science_course = Building.D + + if engineer_course == Building.D: + if engineering_students < 10: + engineer_course = Building.A + elif 10 <= engineering_students <= 50: + engineer_course = Building.B + elif engineering_students > 50: + engineer_course = Building.D + + if art_science_course != Building.D: + if art_science_students < 10: + art_science_course = Building.B + elif 10 <= art_science_students <= 50: + art_science_course = Building.C + elif art_science_students > 50: + art_science_course = Building.D return (engineer_course, art_science_course) def allocate_2(engineering_students, art_science_students): - engineering_students_map = { - engineering_students < 10: Building.A, - 10 <= engineering_students <= 50: Building.B, - engineering_students > 50: Building.D, - } + engineer_course = Building.Default + art_science_course = Building.Default - engineer_course = Building.Default - for condition, building in engineering_students_map.items(): - if condition: - engineer_course = building - break + if is_sum_over_50(engineering_students, art_science_students): + bigger_group = get_bigger_number(engineering_students, art_science_students) + if bigger_group == "engineers": + engineer_course = Building.D + if bigger_group == "art_science": + art_science_course = Building.D + + if engineer_course != Building.D: + engineering_students_map = { + engineering_students < 10: Building.A, + 10 <= engineering_students <= 50: Building.B, + engineering_students > 50: Building.D, + } + + for condition, building in engineering_students_map.items(): + if condition: + engineer_course = building + break - art_science_students_map = { - art_science_students < 10: Building.B, - 10 <= art_science_students <= 50: Building.C, - art_science_students > 50: Building.D, - } + if art_science_course != Building.D: + art_science_students_map = { + art_science_students < 10: Building.B, + 10 <= art_science_students <= 50: Building.C, + art_science_students > 50: Building.D, + } - art_science_course = Building.Default - for condition, building in art_science_students_map.items(): - if condition: - art_science_course = building - break + for condition, building in art_science_students_map.items(): + if condition: + art_science_course = building + break return (engineer_course, art_science_course) def allocate_2_bad(engineering_students, art_science_students): - engineering_students_map = { - engineering_students < 10: Building.A, - 10 < engineering_students <= 50: Building.B, - engineering_students > 50: Building.D, - } + engineer_course = Building.Default + art_science_course = Building.Default - engineer_course = Building.Default - for condition, building in engineering_students_map.items(): - if condition: - engineer_course = building + if is_sum_over_50(engineering_students, art_science_students): + bigger_group = get_bigger_number(art_science_students, engineering_students) + if bigger_group == "engineers": + engineer_course = Building.D + if bigger_group == "art_science": + art_science_course = Building.D + + if engineer_course != Building.D: + engineering_students_map = { + engineering_students < 10: Building.A, + 10 <= engineering_students <= 50: Building.B, + engineering_students > 50: Building.D, + } + + for condition, building in engineering_students_map.items(): + if condition: + engineer_course = building + break - art_science_students_map = { - art_science_students < 10: Building.B, - 10 < art_science_students <= 50: Building.C, - art_science_students > 50: Building.D, - } + if art_science_course != Building.D: + art_science_students_map = { + art_science_students < 10: Building.B, + 10 <= art_science_students <= 50: Building.C, + art_science_students > 50: Building.D, + } - art_science_course = Building.Default - for condition, building in art_science_students_map.items(): - if condition: - art_science_course = building + for condition, building in art_science_students_map.items(): + if condition: + art_science_course = building + break return (engineer_course, art_science_course) def allocate_3(engineering_students, art_science_students): - engineer_course = ( - Building.A if engineering_students < 10 - else Building.B if 10 <= engineering_students <= 50 - else Building.D - ) - - art_science_course = ( - Building.B if art_science_students < 10 - else Building.C if 10 <= art_science_students <= 50 - else Building.D - ) + engineer_course = Building.Default + art_science_course = Building.Default + + if is_sum_over_50(engineering_students, art_science_students): + bigger_group = get_bigger_number(engineering_students, art_science_students) + if bigger_group == "engineers": + engineer_course = Building.D + if bigger_group == "art_science": + art_science_course = Building.D + + if engineer_course != Building.D: + engineer_course = ( + Building.A if engineering_students < 10 + else Building.B if 10 <= engineering_students <= 50 + else Building.D + ) + + if art_science_course != Building.D: + art_science_course = ( + Building.B if art_science_students < 10 + else Building.C if 10 <= art_science_students <= 50 + else Building.D + ) return (engineer_course, art_science_course) def allocate_3_bad(engineering_students, art_science_students): - engineer_course = ( - Building.A if engineering_students < 10 - else Building.B if 10 <= engineering_students < 50 - else Building.D - ) - - art_science_course = ( - Building.B if art_science_students < 10 - else Building.C if 10 <= art_science_students < 50 - else Building.D - ) + engineer_course = Building.Default + art_science_course = Building.Default + if is_sum_over_50(engineering_students, art_science_students): + bigger_group = get_bigger_number(engineering_students, art_science_students) + if bigger_group == "engineers": + engineer_course = Building.D + if bigger_group == "art_science": + art_science_course = Building.D + + if engineer_course != Building.D: + engineer_course = ( + Building.A if engineering_students < 10 + else Building.B if 10 < engineering_students <= 50 + else Building.D + ) + + if art_science_course != Building.D: + art_science_course = ( + Building.B if art_science_students < 10 + else Building.C if 10 < art_science_students <= 50 + else Building.D + ) return (engineer_course, art_science_course) @@ -164,17 +236,28 @@ def get_building(condition_map): return building return Building.Default - engineer_course = get_building([ - (engineering_students < 10, Building.A), - (10 <= engineering_students <= 50, Building.B), - (engineering_students > 50, Building.D), - ]) - - art_science_course = get_building([ - (art_science_students < 10, Building.B), - (10 <= art_science_students <= 50, Building.C), - (art_science_students > 50, Building.D), - ]) + engineer_course = Building.Default + art_science_course = Building.Default + if is_sum_over_50(engineering_students, art_science_students): + bigger_group = get_bigger_number(engineering_students, art_science_students) + if bigger_group == "engineers": + engineer_course = Building.D + if bigger_group == "art_science": + art_science_course = Building.D + + if engineer_course != Building.D: + engineer_course = get_building([ + (engineering_students < 10, Building.A), + (10 <= engineering_students <= 50, Building.B), + (engineering_students > 50, Building.D), + ]) + + if art_science_course != Building.D: + art_science_course = get_building([ + (art_science_students < 10, Building.B), + (10 <= art_science_students <= 50, Building.C), + (art_science_students > 50, Building.D), + ]) return (engineer_course, art_science_course) @@ -186,17 +269,28 @@ def get_building(condition_map): return building return Building.Default - engineer_course = get_building([ - (engineering_students < 10, Building.A), - (10 >= engineering_students <= 50, Building.B), - (engineering_students > 50, Building.D), - ]) - - art_science_course = get_building([ - (art_science_students < 10, Building.B), - (10 >= art_science_students <= 50, Building.C), - (art_science_students > 50, Building.D), - ]) + engineer_course = Building.Default + art_science_course = Building.Default + if is_sum_over_50(engineering_students, art_science_students): + bigger_group = get_bigger_number(engineering_students, art_science_students) + if bigger_group == "engineers": + engineer_course = Building.D + if bigger_group == "art_science": + art_science_course = Building.D + + if engineer_course != Building.D: + engineer_course = get_building([ + (engineering_students < 10, Building.A), + (10 <= engineering_students <= 50, Building.B), + (engineering_students > 50, Building.D), + ]) + + if engineer_course != Building.D: + art_science_course = get_building([ + (art_science_students < 10, Building.B), + (10 <= art_science_students <= 50, Building.C), + (art_science_students > 50, Building.D), + ]) return (engineer_course, art_science_course) @@ -214,5 +308,9 @@ def get_building(condition_map): print("ENGINEERING_STUDENTS: ", ENGINEERING_STUDENTS) print("ART_AND_SCIENCE_STUDENTS: ", ART_AND_SCIENCE_STUDENTS) -print(allocate_1(ENGINEERING_STUDENTS, ART_AND_SCIENCE_STUDENTS)) + +print("allocate_1: ",allocate_1(ENGINEERING_STUDENTS, ART_AND_SCIENCE_STUDENTS)) +print("allocate_2: ",allocate_2(ENGINEERING_STUDENTS, ART_AND_SCIENCE_STUDENTS)) +print("allocate_3: ",allocate_3(ENGINEERING_STUDENTS, ART_AND_SCIENCE_STUDENTS)) +print("allocate_4: ",allocate_4(ENGINEERING_STUDENTS, ART_AND_SCIENCE_STUDENTS)) ''' \ No newline at end of file diff --git a/test.py b/test.py index 775d511..052fa34 100644 --- a/test.py +++ b/test.py @@ -9,7 +9,7 @@ class TestAllocations(unittest.TestCase): def test_less_than_10_engineering_and_art_science(self): self.assertEqual(allocate_1(8, 2), (Building.A, Building.B)) - self.assertEqual(allocate_1_bad(8, 2), (Building.A, Building.B)) + self.assertEqual(allocate_1_bad(8, 2), (Building.A, Building.B)) # fails self.assertEqual(allocate_2(8, 2), (Building.A, Building.B)) self.assertEqual(allocate_2_bad(8, 2), (Building.A, Building.B)) self.assertEqual(allocate_3(8, 2), (Building.A, Building.B)) @@ -17,19 +17,19 @@ def test_less_than_10_engineering_and_art_science(self): self.assertEqual(allocate_4(8, 2), (Building.A, Building.B)) self.assertEqual(allocate_4_bad(8, 2), (Building.A, Building.B)) - def test_between_10_and_50_engineering_and_art_science(self): - self.assertEqual(allocate_1(20, 35), (Building.B, Building.C)) - self.assertEqual(allocate_1_bad(20, 35), (Building.B, Building.C)) - self.assertEqual(allocate_2(20, 35), (Building.B, Building.C)) - self.assertEqual(allocate_2_bad(20, 35), (Building.B, Building.C)) - self.assertEqual(allocate_3(20, 35), (Building.B, Building.C)) - self.assertEqual(allocate_3_bad(20, 35), (Building.B, Building.C)) - self.assertEqual(allocate_4(20, 35), (Building.B, Building.C)) - self.assertEqual(allocate_4_bad(20, 35), (Building.B, Building.C)) # fails + def test_between_10_and_50_engineering_and_art_science_and_sum_less_50(self): + self.assertEqual(allocate_1(20, 25), (Building.B, Building.C)) + self.assertEqual(allocate_1_bad(20, 25), (Building.B, Building.C)) # fails + self.assertEqual(allocate_2(20, 25), (Building.B, Building.C)) + self.assertEqual(allocate_2_bad(20, 25), (Building.B, Building.C)) + self.assertEqual(allocate_3(20, 25), (Building.B, Building.C)) + self.assertEqual(allocate_3_bad(20, 25), (Building.B, Building.C)) + self.assertEqual(allocate_4(20, 25), (Building.B, Building.C)) + self.assertEqual(allocate_4_bad(20, 25), (Building.B, Building.C)) # fails def test_more_than_50_engineering_and_art_science(self): self.assertEqual(allocate_1(60, 75), (Building.D, Building.D)) - self.assertEqual(allocate_1_bad(60, 75), (Building.D, Building.D)) + self.assertEqual(allocate_1_bad(60, 75), (Building.D, Building.D)) # fails self.assertEqual(allocate_2(60, 75), (Building.D, Building.D)) self.assertEqual(allocate_2_bad(60, 75), (Building.D, Building.D)) self.assertEqual(allocate_3(60, 75), (Building.D, Building.D)) @@ -39,34 +39,86 @@ def test_more_than_50_engineering_and_art_science(self): def test_10_engineering_and_10_art_science(self): self.assertEqual(allocate_1(10, 10), (Building.B, Building.C)) - self.assertEqual(allocate_1_bad(10, 10), (Building.B, Building.C)) + self.assertEqual(allocate_1_bad(10, 10), (Building.B, Building.C)) # fails self.assertEqual(allocate_2(10, 10), (Building.B, Building.C)) - self.assertEqual(allocate_2_bad(10, 10), (Building.B, Building.C)) # fails + self.assertEqual(allocate_2_bad(10, 10), (Building.B, Building.C)) self.assertEqual(allocate_3(10, 10), (Building.B, Building.C)) - self.assertEqual(allocate_3_bad(10, 10), (Building.B, Building.C)) + self.assertEqual(allocate_3_bad(10, 10), (Building.B, Building.C)) # fails self.assertEqual(allocate_4(10, 10), (Building.B, Building.C)) self.assertEqual(allocate_4_bad(10, 10), (Building.B, Building.C)) - def test_50_engineering_and_50_art_science(self): - self.assertEqual(allocate_1(50, 50), (Building.B, Building.C)) - self.assertEqual(allocate_1_bad(50, 50), (Building.B, Building.C)) # fails - self.assertEqual(allocate_2(50, 50), (Building.B, Building.C)) - self.assertEqual(allocate_2_bad(50, 50), (Building.B, Building.C)) - self.assertEqual(allocate_3(50, 50), (Building.B, Building.C)) - self.assertEqual(allocate_3_bad(50, 50), (Building.B, Building.C)) # fails - self.assertEqual(allocate_4(50, 50), (Building.B, Building.C)) - self.assertEqual(allocate_4_bad(50, 50), (Building.B, Building.C)) # fails + def test_50_engineering_and_50_art_science_sum_50_above_and_equality(self): + self.assertEqual(allocate_1(50, 50), (Building.B, Building.D)) + self.assertEqual(allocate_1_bad(50, 50), (Building.B, Building.D)) # fails + self.assertEqual(allocate_2(50, 50), (Building.B, Building.D)) + self.assertEqual(allocate_2_bad(50, 50), (Building.B, Building.D)) + self.assertEqual(allocate_3(50, 50), (Building.B, Building.D)) + self.assertEqual(allocate_3_bad(50, 50), (Building.B, Building.D)) + self.assertEqual(allocate_4(50, 50), (Building.B, Building.D)) + self.assertEqual(allocate_4_bad(50, 50), (Building.B, Building.D)) # fails def test_less_than_10_engineering_and_more_than_50_art_science(self): self.assertEqual(allocate_1(9, 51), (Building.A, Building.D)) - self.assertEqual(allocate_1_bad(9, 51), (Building.A, Building.D)) + self.assertEqual(allocate_1_bad(9, 51), (Building.A, Building.D)) # fails self.assertEqual(allocate_2(9, 51), (Building.A, Building.D)) - self.assertEqual(allocate_2_bad(9, 51), (Building.A, Building.D)) + self.assertEqual(allocate_2_bad(9, 51), (Building.A, Building.D)) # fails self.assertEqual(allocate_3(9, 51), (Building.A, Building.D)) self.assertEqual(allocate_3_bad(9, 51), (Building.A, Building.D)) self.assertEqual(allocate_4(9, 51), (Building.A, Building.D)) self.assertEqual(allocate_4_bad(9, 51), (Building.A, Building.D)) + def test_engineering_and_art_science_sum_50(self): + self.assertEqual(allocate_1(50, 0), (Building.B, Building.B)) + self.assertEqual(allocate_1(0, 50), (Building.A, Building.C)) + self.assertEqual(allocate_1(25, 25), (Building.B, Building.C)) + self.assertEqual(allocate_1_bad(50, 0), (Building.B, Building.B)) # fails + self.assertEqual(allocate_1_bad(0, 50), (Building.A, Building.C)) # fails + self.assertEqual(allocate_1_bad(25, 25), (Building.B, Building.C)) # fails + self.assertEqual(allocate_2(50, 0), (Building.B, Building.B)) + self.assertEqual(allocate_2(0, 50), (Building.A, Building.C)) + self.assertEqual(allocate_2(25, 25), (Building.B, Building.C)) + self.assertEqual(allocate_3(50, 0), (Building.B, Building.B)) + self.assertEqual(allocate_3(0, 50), (Building.A, Building.C)) + self.assertEqual(allocate_3(25, 25), (Building.B, Building.C)) + self.assertEqual(allocate_4(50, 0), (Building.B, Building.B)) + self.assertEqual(allocate_4(0, 50), (Building.A, Building.C)) + self.assertEqual(allocate_4(25, 25), (Building.B, Building.C)) + + def test_engineering_and_art_science_sum_over_50_engineering_bigger(self): + self.assertEqual(allocate_1(50, 1), (Building.D, Building.B)) + self.assertEqual(allocate_1(50, 10), (Building.D, Building.C)) + self.assertEqual(allocate_1(52, 51), (Building.D, Building.D)) + self.assertEqual(allocate_1_bad(50, 1), (Building.D, Building.B)) # fails + self.assertEqual(allocate_1_bad(50, 10), (Building.D, Building.C)) # fails + self.assertEqual(allocate_1_bad(52, 51), (Building.D, Building.D)) + self.assertEqual(allocate_2(50, 1), (Building.D, Building.B)) + self.assertEqual(allocate_2(50, 10), (Building.D, Building.C)) + self.assertEqual(allocate_2(52, 51), (Building.D, Building.D)) + self.assertEqual(allocate_3(50, 1), (Building.D, Building.B)) + self.assertEqual(allocate_3(50, 10), (Building.D, Building.C)) + self.assertEqual(allocate_3(52, 51), (Building.D, Building.D)) + self.assertEqual(allocate_4(50, 1), (Building.D, Building.B)) + self.assertEqual(allocate_4(50, 10), (Building.D, Building.C)) + self.assertEqual(allocate_4(52, 51), (Building.D, Building.D)) + + def test_engineering_and_art_science_sum_over_50_art_science_bigger(self): + self.assertEqual(allocate_1(1, 50), (Building.A, Building.D)) + self.assertEqual(allocate_1(10, 50), (Building.B, Building.D)) + self.assertEqual(allocate_1(51, 52), (Building.D, Building.D)) + self.assertEqual(allocate_1_bad(1, 50), (Building.A, Building.D)) # fails + self.assertEqual(allocate_1_bad(10, 50), (Building.B, Building.D)) # fails + self.assertEqual(allocate_1_bad(51, 52), (Building.D, Building.D)) # fails + self.assertEqual(allocate_2(1, 50), (Building.A, Building.D)) + self.assertEqual(allocate_2(10, 50), (Building.B, Building.D)) + self.assertEqual(allocate_2(51, 52), (Building.D, Building.D)) + self.assertEqual(allocate_3(1, 50), (Building.A, Building.D)) + self.assertEqual(allocate_3(10, 50), (Building.B, Building.D)) + self.assertEqual(allocate_3(51, 52), (Building.D, Building.D)) + self.assertEqual(allocate_4(1, 50), (Building.A, Building.D)) + self.assertEqual(allocate_4(10, 50), (Building.B, Building.D)) + self.assertEqual(allocate_4(51, 52), (Building.D, Building.D)) + + if __name__ == '__main__': unittest.main() \ No newline at end of file