def questions() -> List[survey.Question]: q1 = survey.NumericQuestion(1, 'numeric 1', 5, 25) q2 = survey.MultipleChoiceQuestion(2, ' Multiple Question 2', ['a', 'b']) q3 = survey.CheckboxQuestion(3, ' Checkbox Question 3', ['X', 'Y']) q4 = survey.YesNoQuestion(4, 'YesNoQuestion 4') q5 = survey.NumericQuestion(1, 'numeric 5', 15, 250) q6 = survey.MultipleChoiceQuestion(2, ' Multiple Question 6', ['a', 'b']) q7 = survey.CheckboxQuestion(3, ' Checkbox Question 7', ['X', 'Y']) q8 = survey.YesNoQuestion(4, 'YesNoQuestion 8') return [q1, q2, q3, q4]
def questions() -> List[survey.Question]: return [ survey.MultipleChoiceQuestion(1, 'why?', ['a', 'b', 'c', 'd']), survey.NumericQuestion(2, 'what?', -2, 4), survey.YesNoQuestion(3, 'really?'), survey.CheckboxQuestion(4, 'how?', ['a', 'b', 'c', 'd']) ]
def test_make_grouping_greedy(self): new_course = course.Course('CSC148') q1 = survey.CheckboxQuestion(1, 'Hobbies?', ['Movie', 'Sing', 'Dance', 'Game']) new_survey = survey.Survey([q1]) students = [course.Student(1, 'Zoro'), course.Student(2, 'Aaron'), course.Student(3, 'Gertrude'), course.Student(4, 'Yvette'), course.Student(6, 'Steph'), course.Student(7, 'Draymond'), course.Student(8, 'Andrew')] new_course.enroll_students(students) new_grouper = grouper.GreedyGrouper(2) new_grouping = new_grouper.make_grouping(new_course, new_survey) groups = new_grouping.get_groups() temp_list = [] for i in range(0, len(groups)): people = groups[i].get_members() temp_list.extend(people) if i == (len(groups) - 1): assert len(groups[i]) <= 2 else: assert len(groups[i]) == 2 course_students = new_course.get_students() for student in course_students: assert student in temp_list assert len(temp_list) == 7
class TestCriterion: question1 = survey.CheckboxQuestion(1, "species?", ["human", 'bug', 'owl']) a11 = survey.Answer(["human", "bug"]) a12 = survey.Answer(["human"]) a13 = survey.Answer(["owl"]) answers1 = [a11, a12, a13] question2 = survey.NumericQuestion(4, "number of legs?", 1, 8) a21 = survey.Answer(1) a22 = survey.Answer(4) a23 = survey.Answer(8) answers2 = [a21, a22, a23] answers3 = [a21, a21, a21] def test_homogeneous(self) -> None: hom = criterion.HomogeneousCriterion() assert hom.score_answers(self.question1, self.answers1) \ == 0.16666666666666666 assert hom.score_answers(self.question2, self.answers2) \ == 0.3333333333333333 def test_heterogeneous(self) -> None: het = criterion.HeterogeneousCriterion() assert het.score_answers(self.question1, self.answers1) \ == 0.8333333333333334 assert het.score_answers(self.question2, self.answers2) \ == 0.6666666666666667 def test_lonely(self) -> None: sad = criterion.LonelyMemberCriterion() assert sad.score_answers(self.question2, self.answers2) == 0.0 assert sad.score_answers(self.question2, self.answers3) == 1.0
def test_set_criterion_and_get_crit(self, survey_with_YN_question): crit = criterion.HeterogeneousCriterion for q in survey_with_YN_question._ques: assert survey_with_YN_question.set_criterion(crit, q) q_not_in_survey = survey.CheckboxQuestion(10, "hello", ["a"]) assert survey_with_YN_question.set_criterion(crit, q_not_in_survey) == False for q in survey_with_YN_question._ques: assert survey_with_YN_question._get_criterion(q) == crit
def test_validate_answer(self) -> None: q = survey.CheckboxQuestion(44, "type?", ["chaotic", "evil", "neutral"]) a1 = survey.Answer(["chaotic", "evil"]) a2 = survey.Answer(["evil", "neutral"]) a3 = survey.Answer(["neutral", "good"]) assert q.validate_answer(a1) assert q.validate_answer(a2) assert not q.validate_answer(a3)
def test_similarity(self) -> None: q = survey.CheckboxQuestion(44, "type?", ["chaotic", "evil", "neutral"]) a1 = survey.Answer(["chaotic", "evil"]) a2 = survey.Answer(["evil", "neutral"]) a3 = survey.Answer(["neutral"]) assert q.get_similarity(a1, a2) == 0.3333333333333333 assert q.get_similarity(a2, a3) == 0.5 assert q.get_similarity(a1, a3) == 0.0
def test_get_similarity(self, questions, answers, students): q1 = survey.CheckboxQuestion(1, 'C', ['a', 'b', 'c', 'd', 'e', 'f']) a1 = survey.Answer(['a', 'b', 'c', 'd']) a2 = survey.Answer(['e', 'b', 'c', 'f']) a3 = survey.Answer(['a', 'b', 'c', 'd']) a4 = survey.Answer(['g']) assert q1.get_similarity(a1, a2) == 0.33 assert q1.get_similarity(a1, a3) == 1.0 assert q1.get_similarity(a1, a4) == 0.0
def test_set_weight_and_get_weight(self, survey_with_YN_question): for q in survey_with_YN_question._ques: assert survey_with_YN_question.set_weight(0.1, q) for q in survey_with_YN_question._ques: assert survey_with_YN_question._get_weight(q) == 0.1 q_not_in_survey = survey.CheckboxQuestion(10, "hello", ["a"]) assert survey_with_YN_question.set_weight(0.1, q_not_in_survey) == False assert survey_with_YN_question._get_criterion(q_not_in_survey) == \ survey_with_YN_question._default_criterion
def test_checkbox(self): m = survey.CheckboxQuestion(0, "just choose", ["A", "B", "C", "D", "E", "F"]) assert m.id == 0 assert m.text == 'just choose' assert 'just choose' in str(m) assert 'A' in str(m) assert 'B' in str(m) assert 'C' in str(m) assert m.get_similarity(FakeAnswer2(["A"]), FakeAnswer2(["A"])) == 1.0 assert m.get_similarity(FakeAnswer2(["A", "B"]), FakeAnswer2(["A", "B"])) == 1.0 assert fuck_within(m.get_similarity(FakeAnswer2(["A", "B"]), FakeAnswer2(["A", "B", "C"])), 0.6666666) assert fuck_within(m.get_similarity(FakeAnswer2(["A", "B", "C"]), FakeAnswer2(["A", "B"])), 0.6666666) assert fuck_within(m.get_similarity(FakeAnswer2(["C", "A", "B"]), FakeAnswer2(["A", "B"])), 0.6666666) assert m.get_similarity(FakeAnswer2(["A", "C", "D", "E"]), FakeAnswer2(["A", "B"])) == 0.2
def test_score_grouping(self, questions, students_with_answers): new_course = course.Course('CSC148') q1 = survey.CheckboxQuestion(1, 'Hobbies?', ['Movie', 'Sing', 'Dance', 'Game']) new_survey = survey.Survey([q1]) students = [course.Student(1, 'Zoro'), course.Student(2, 'Aaron'), course.Student(3, 'Gertrude'), course.Student(4, 'Yvette'), course.Student(6, 'Steph'), course.Student(7, 'Draymond'), course.Student(8, 'Andrew')] new_course.enroll_students(students_with_answers) new_grouper = grouper.AlphaGrouper(2) new_grouping = new_grouper.make_grouping(new_course, new_survey) s = survey.Survey(questions) score = s.score_grouping(new_grouping) assert score == 2.0
def test_super_complicated(self): students = [course.Student(i, "Shit" + str(i)) for i in range(8)] q1 = survey.YesNoQuestion(0, "To be, or not to be") q2 = survey.NumericQuestion(1, "How many times you f**k up", 0, 10000) q3 = survey.MultipleChoiceQuestion(2, "What's your favorite thing to do", ['A', 'B', 'C', 'D']) q4 = survey.CheckboxQuestion(3, "How many things you have done", ['A', 'B', 'C', 'D', 'E']) questions = [q1, q2, q3, q4] s = survey.Survey(questions) answers = [True, 1111, 'A', ['A', 'C'], False, 44, 'C', ['A', 'B', 'C'], True, 3, 'B', ['A', 'C', 'D'], True, 56, 'C', ['D', 'C'], False, 12, 'C', ['E'], True, 0, 'A', ['A'], False, 888, 'C', ['A', 'B', 'C', 'D'], True, 12, 'B', ['A', 'B', 'C', 'D', 'E']] i = 0 for stu in students: for q in questions: stu.set_answer(q, survey.Answer(answers[i])) i += 1 g = grouper.Grouping() g.add_group(grouper.Group([students[0], students[1], students[2]])) g.add_group(grouper.Group([students[3], students[4], students[5]])) g.add_group(grouper.Group([students[6], students[7]])) assert fuck_within(s.score_students(students), 0.5175303571428571) assert fuck_within(s.score_grouping(g), 0.43715925925925925) s.set_weight(2, q2) s.set_weight(5, q1) s.set_weight(6, q3) s.set_weight(3, q4) assert fuck_within(s.score_students(students), 1.7600607142857143) assert fuck_within(s.score_grouping(g), 1.2696888888888889) s.set_criterion(criterion.HeterogeneousCriterion(), q1) s.set_criterion(criterion.HeterogeneousCriterion(), q2) s.set_criterion(criterion.HeterogeneousCriterion(), q3) s.set_criterion(criterion.HeterogeneousCriterion(), q4) assert fuck_within(s.score_students(students), 2.2399392857142857) assert fuck_within(s.score_grouping(g), 2.7303111111111114)
def test_checkbox(self): q1 = survey.CheckboxQuestion(0, "just choose", ["A", "B", "C", "D", "E", "F"]) assert not q1.validate_answer(survey.Answer(1)) assert not q1.validate_answer(survey.Answer("E")) assert not q1.validate_answer(survey.Answer(True)) assert not q1.validate_answer(survey.Answer(False)) assert not q1.validate_answer(survey.Answer(4)) assert not q1.validate_answer(survey.Answer(["A", "B", "C", "G"])) assert q1.validate_answer(survey.Answer(["A"])) assert q1.validate_answer(survey.Answer(["B", "A"])) assert q1.validate_answer(survey.Answer(["A", "C", "B", "D", "E", "F"])) assert not survey.Answer(1).is_valid(q1) assert not survey.Answer("E").is_valid(q1) assert not survey.Answer(True).is_valid(q1) assert not survey.Answer(False).is_valid(q1) assert not survey.Answer(["A", "B", "C", "G"]).is_valid(q1) assert survey.Answer(["A"]).is_valid(q1) assert survey.Answer(["B", "A"]).is_valid(q1) assert survey.Answer(["A", "B", "C", "D", "E", "F"]).is_valid(q1) assert survey.Answer(["A", "C", "B", "D", "E", "F"]).is_valid(q1)
class TestSurvey: q1 = survey.MultipleChoiceQuestion(1, "species?", ["human"]) q5 = survey.YesNoQuestion(5, "are you human?") q3 = survey.CheckboxQuestion(3, "type?", ["fae"]) q4 = survey.NumericQuestion(4, "number of legs?", 1, 5) q2 = survey.Question(2, "are you human?") qs = [q1, q4, q3, q2, q3, q5] # list of questions questions = [q1, q4, q3, q5] def test_survey_properties(self) -> None: s = survey.Survey(self.qs) assert len(s) == 5 for q in self.qs: assert q in s def test_get_questions(self) -> None: s = survey.Survey(self.questions) descr = s.get_questions() assert self.q1 in descr assert self.q2 not in descr assert self.q3 in descr assert self.q4 in descr assert self.q5 in descr def test_set_weight(self) -> None: s = survey.Survey(self.questions) assert s.set_weight(2, self.q1) assert s.set_weight(5, self.q5) assert s.set_weight(-1, self.q3) assert not s.set_weight(2, self.q2) def test_set_criterion(self) -> None: s = survey.Survey(self.questions) assert s.set_criterion(criterion.LonelyMemberCriterion(), self.q1) assert s.set_criterion(criterion.HeterogeneousCriterion(), self.q5) assert not s.set_criterion(criterion.HomogeneousCriterion(), self.q2)
def test_survey_checkbox_question_validate_answer() -> None: question = survey.CheckboxQuestion(1, 'What do you want?', ['A', 'B', 'C']) assert question.validate_answer(survey.Answer(['B', 'C'])) assert not question.validate_answer(survey.Answer(['Z']))
def test_survey_checkbox_question__str__() -> None: question1 = survey.CheckboxQuestion(1, 'Who are you?', ['A', 'B', 'C']) assert '1' and 'Who are you?' and 'A' and 'B' and 'C' in str(question1)
def test_survey_answer_is_valid() -> None: question = survey.CheckboxQuestion(1, 'What do you want?', ['A', 'B', 'C']) answer1 = survey.Answer(['C', 'B']) answer2 = survey.Answer(5) assert answer1.is_valid(question) assert not answer2.is_valid(question)
def CheckQuestion(): return survey.CheckboxQuestion(1, "hello", ["a", "b"])
class TestGrouper: q1 = survey.MultipleChoiceQuestion(1, "species?", ["human", 'bug', 'owl']) q2 = survey.YesNoQuestion(2, "are you human?") q3 = survey.CheckboxQuestion(3, "type?", ["chaotic", "evil", "neutral"]) q4 = survey.NumericQuestion(4, "number of legs?", 1, 8) s = survey.Survey([q1, q2, q3, q4]) c = course.Course("Learning 101") def answer_questions(self) -> List[course.Student]: # students s1 = course.Student(2, "First") s1.set_answer(self.q1, survey.Answer("owl")) s1.set_answer(self.q2, survey.Answer(False)) s1.set_answer(self.q3, survey.Answer(["chaotic", "evil"])) s1.set_answer(self.q4, survey.Answer(1)) s2 = course.Student(25, "Second") s2.set_answer(self.q1, survey.Answer("bug")) s2.set_answer(self.q2, survey.Answer(False)) s2.set_answer(self.q3, survey.Answer(["chaotic", "evil", "neutral"])) s2.set_answer(self.q4, survey.Answer(8)) s3 = course.Student(34, "Third") s3.set_answer(self.q1, survey.Answer("human")) s3.set_answer(self.q2, survey.Answer(True)) s3.set_answer(self.q3, survey.Answer(["chaotic", "neutral"])) s3.set_answer(self.q4, survey.Answer(5)) s4 = course.Student(9, "Fourth") s4.set_answer(self.q1, survey.Answer("owl")) s4.set_answer(self.q2, survey.Answer(False)) s4.set_answer(self.q3, survey.Answer(["neutral"])) s4.set_answer(self.q4, survey.Answer(2)) s5 = course.Student(89, "Last") s5.set_answer(self.q1, survey.Answer("human")) s5.set_answer(self.q2, survey.Answer(True)) s5.set_answer(self.q3, survey.Answer(["evil"])) s5.set_answer(self.q4, survey.Answer(7)) s = [s1, s2, s3, s4, s5] return s def test_course_all_answered(self) -> None: self.c.enroll_students(self.answer_questions()) assert self.c.all_answered(self.s) def test_score_students(self) -> None: self.c.enroll_students(self.answer_questions()) assert self.s.score_students(self.answer_questions()) \ == 0.34761904761904766 assert self.s.score_students(self.answer_questions()[:3]) \ == 0.3055555555555555 assert self.s.score_students(self.answer_questions()[2:4]) \ == 0.26785714285714285 def test_alpha_grouper(self) -> None: self.c.enroll_students(self.answer_questions()) g = grouper.AlphaGrouper(3) gps = g.make_grouping(self.c, self.s).get_groups() assert len(gps) == 2 assert gps[1].get_members()[1].id == 34 assert len(gps[1].get_members()) == 2 g = grouper.AlphaGrouper(2) gps = g.make_grouping(self.c, self.s).get_groups() assert gps[1].get_members()[1].id == 25 # number incorrect assert len(gps) == 3 h = [] for group in gps: h.extend(group.get_members()) for student in self.c.students: assert student in h def test_score_grouping(self) -> None: self.c.enroll_students(self.answer_questions()) g = grouper.AlphaGrouper(3) gps = g.make_grouping(self.c, self.s) assert self.s.score_grouping(gps) == 0.3125 self.c.enroll_students(self.answer_questions()) g2 = grouper.GreedyGrouper(3) gps2 = g2.make_grouping(self.c, self.s) assert self.s.score_grouping(gps2) == 0.5892857142857143 def test_random_grouper(self) -> None: self.c.enroll_students(self.answer_questions()) g = grouper.RandomGrouper(3) gps = g.make_grouping(self.c, self.s).get_groups() assert len(gps) == 2 assert len(gps[1].get_members()) == 2 g = grouper.RandomGrouper(2) gps = g.make_grouping(self.c, self.s).get_groups() assert len(gps) == 3 h = [] for group in gps: h.extend(group.get_members()) for student in self.c.students: assert student in h def test_greedy_grouper(self) -> None: self.c.enroll_students(self.answer_questions()) g = grouper.GreedyGrouper(3) gps = g.make_grouping(self.c, self.s).get_groups() assert len(gps) == 2 assert gps[1].get_members()[1].id == 89 assert len(gps[1].get_members()) == 2 g = grouper.GreedyGrouper(2) gps = g.make_grouping(self.c, self.s).get_groups() assert len(gps) == 3 assert gps[1].get_members()[1].id == 34 h = [] for group in gps: h.extend(group.get_members()) for student in self.c.students: assert student in h def test_window_grouper(self) -> None: self.c.enroll_students(self.answer_questions()) g = grouper.WindowGrouper(3) gps = g.make_grouping(self.c, self.s).get_groups() assert len(gps) == 2 assert gps[0].get_members()[1] == 9 # number incorrect assert len(gps[1].get_members()) == 2 h = [] for group in gps: h.extend(group.get_members()) for student in self.c.students: assert student in h
def Checkboxq2(): return survey.CheckboxQuestion(2, "hello", ["a", "b", "c", "d", "e"])
def test_survey_checkbox_question_get_similarity() -> None: question = survey.CheckboxQuestion(1, 'What do you want?', ['A', 'B', 'C', 'D', 'E']) answer1 = survey.Answer(['B', 'D']) answer2 = survey.Answer(['C', 'D']) assert question.get_similarity(answer1, answer2) == 1 / 3
def test_checkbox_properties(self) -> None: q = survey.CheckboxQuestion(44, "type?", ["chaotic", "evil", "neutral"]) assert q.id == 44 assert q.text == 'type?'
def test_combination(self): students = [course.Student(i, "Shit" + str(i)) for i in range(8)] q1 = survey.YesNoQuestion(0, "To be, or not to be") q2 = survey.NumericQuestion(1, "How many times you f**k up", 0, 10000) q3 = survey.MultipleChoiceQuestion(2, "What's your favorite thing to do", ['A', 'B', 'C', 'D']) q4 = survey.CheckboxQuestion(3, "How many things you have done", ['A', 'B', 'C', 'D', 'E']) questions = [q1, q2, q3, q4] s = survey.Survey(questions) answers = [True, 1111, 'A', ['A', 'C'], False, 44, 'C', ['A', 'B', 'C'], True, 3, 'B', ['A', 'C', 'D'], True, 56, 'C', ['D', 'C'], False, 12, 'C', ['E'], True, 0, 'A', ['A'], False, 888, 'C', ['A', 'B', 'C', 'D'], True, 12, 'B', ['A', 'B', 'C', 'D', 'E']] i = 0 for stu in students: for q in questions: stu.set_answer(q, survey.Answer(answers[i])) i += 1 c = course.Course("Asshole101") c.enroll_students(students) grouping = grouper.AlphaGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 1, 2], [3, 4, 5], [6, 7]] grouping = grouper.GreedyGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 2, 5], [1, 4, 6], [3, 7]] grouping = grouper.WindowGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 4, 5], [1, 2, 3], [6, 7]] s.set_criterion(criterion.HeterogeneousCriterion(), q2) s.set_weight(2, q1) s.set_weight(2, q1) s.set_weight(3, q2) s.set_weight(55, q4) grouping = grouper.AlphaGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 1, 2], [3, 4, 5], [6, 7]] grouping = grouper.GreedyGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 2, 6], [1, 3, 7], [4, 5]] grouping = grouper.WindowGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 1, 2], [3, 4], [5, 6, 7]] s.set_weight(2, q1) s.set_weight(1, q2) s.set_weight(5, q3) s.set_weight(2, q4) s.set_criterion(criterion.LonelyMemberCriterion(), q1) s.set_criterion(criterion.LonelyMemberCriterion(), q2) s.set_criterion(criterion.LonelyMemberCriterion(), q3) s.set_criterion(criterion.LonelyMemberCriterion(), q4) grouping = grouper.AlphaGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 1, 2], [3, 4, 5], [6, 7]] grouping = grouper.GreedyGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 2, 5], [1, 4, 6], [3, 7]] grouping = grouper.WindowGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 1, 2], [3, 4, 5], [6, 7]] # make one of the student's answer invalid students[0].set_answer(q1, survey.Answer('F**K')) grouping = grouper.AlphaGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 1, 2], [3, 4, 5], [6, 7]] grouping = grouper.GreedyGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 1, 2], [3, 4, 6], [5, 7]] grouping = grouper.WindowGrouper(3).make_grouping(c, s) assert len(grouping) == 3 assert grouping_to_list_of_list(grouping) == [[0, 1, 2], [3, 4, 5], [6, 7]]
def test_string(self) -> None: q = survey.CheckboxQuestion(44, "type?", ["chaotic", "evil", "neutral"]) s = str(q) assert q.text in s
def CheckQuestion2(): return survey.CheckboxQuestion(100, "hello", ["a", 'b', 'c', 'd'])