def test_choices_update_options_with_scheme(self): scheme = Scheme(choices=["Cat", "Dog", "Fish"]) question = MultipleChoiceQuestion( "What?", choices=["Chicken"], scheme=scheme ) self.assertEqual( [ Option(value="a", expression="Chicken"), Option(value="b", expression="Cat"), Option(value="c", expression="Dog"), Option(value="d", expression="Fish"), ], question.get_options(), ) # External update new_scheme = Scheme(choices=["Cow"]) question.update_scheme(new_scheme) self.assertEqual( [ Option(value="a", expression="Chicken"), Option(value="b", expression="Cat"), Option(value="c", expression="Dog"), Option(value="d", expression="Fish"), Option(value="e", expression="Cow"), ], question.get_options(), ) self.assertEqual([], question.primitive_options)
def test_choices_combined_with_options_with_scheme(self): scheme = Scheme(options=[Option(value="Cat", expression="Meow")]) question = MultipleChoiceQuestion( "What?", choices=["Hello", "World"], options=[Option(value="Hello", expression="World")], scheme=scheme, ) self.assertEqual( [ Option(value="a", expression="Hello"), Option(value="b", expression="World"), Option(value="Hello", expression="World"), Option(value="Cat", expression="Meow"), ], question.get_options(), ) self.assertEqual( [ Option(value="Hello", expression="World"), Option(value="Cat", expression="Meow"), ], question.primitive_options, ) # External update new_scheme = Scheme(options=[Option(value="Dog", expression="Bark")]) question.update_scheme(new_scheme) self.assertEqual( [ Option(value="Hello", expression="World"), Option(value="Cat", expression="Meow"), Option(value="Dog", expression="Bark"), ], question.primitive_options, ) self.assertEqual( [ Option(value="a", expression="Hello"), Option(value="b", expression="World"), Option(value="Hello", expression="World"), Option(value="Cat", expression="Meow"), Option(value="Dog", expression="Bark"), ], question.get_options(), )
def test_scheme_extends_list(self): alpha, digit, max_len = ( AlphaValidator(), DigitValidator(), MaxLengthValidator(10), ) my_scheme = Scheme( validators=[alpha], correct_answers=["SchemeAnswer", "SchemeAnswer2"], commands=[Skip], ) empty_question = Question("What?", scheme=my_scheme) self.assertEqual([alpha], empty_question.validators) self.assertEqual([Skip], empty_question.commands) self.assertEqual( ["SchemeAnswer", "SchemeAnswer2"], empty_question.correct_answers ) question = Question( "What?", validators=[digit, max_len], correct_answers=["RealAnswer"], commands=[Skip], scheme=my_scheme, ) self.assertEqual([digit, max_len, alpha], question.validators) self.assertEqual([Skip, Skip], question.commands) self.assertEqual( ["RealAnswer", "SchemeAnswer", "SchemeAnswer2"], question.correct_answers, )
def test_answers(self, mock_stdout, *_): q1, q2, q3, q4 = ( Question("What?"), Question("How?"), Question("When?", required=False), MultipleChoiceQuestion("Which?", choices=["This"]), ) quiz = Quiz( questions=[q1, q2, q3, q4], scheme=Scheme(commands=[Answers, Finish]), ) quiz.start() mock_stdout.assert_has_calls( [ ANY, call( "\nCurrent answers:\n" "1. What? -> [Me]\n" "2. How? -> [Handsome]\n" "~3. When? -> [No answer]\n" "4. Which? -> [a) This]\n" ), ANY, ] )
def test_jump(self, mock_stdout, *_): q1, q2, q3, q4 = ( Question("What?"), MultipleChoiceQuestion("What?", choices=["a"], required=False), MultipleChoiceQuestion("What?", choices=["c"], required=False), Question("What?", required=False), ) quiz = Quiz( questions=[q1, q2, q3, q4], scheme=Scheme(commands=[Jump, Finish]) ) quiz.start() mock_stdout.assert_has_calls( [ call("Jumped to question 4."), call("Jumped to question 1."), call("Jumped to question 4."), call("Jumped to question 1."), ANY, ] ) self.assertEqual(3, q1.attempt) self.assertEqual(1, q2.attempt) self.assertEqual(2, q4.attempt) self.assertEqual(0, q3.attempt) self.assertEqual("Answer", q1.answer)
def test_update_scheme_force(self): my_scheme = Scheme(commands=[Jump]) question = Question("What?", scheme=my_scheme) self.assertEqual([my_scheme], question.mounted_schemes) question.update_scheme(my_scheme, force=True) self.assertEqual([my_scheme, my_scheme], question.mounted_schemes) self.assertEqual([Jump, Jump], question.commands)
def test_update_scheme_force(self): my_scheme = Scheme(commands=[Skip]) a, b = Question("a"), Question("b", scheme=my_scheme) quiz = Quiz(questions=[a], scheme=my_scheme) quiz.questions.append(b) quiz.update(force_scheme=True) self.assertEqual([my_scheme, my_scheme], b.mounted_schemes)
def test_update_scheme_do_not_force(self): # Same scheme is not applied twice if force_scheme=False my_scheme = Scheme(commands=[Skip]) a, b = Question("a"), Question("b", scheme=my_scheme) quiz = Quiz(questions=[a], scheme=my_scheme) quiz.questions.append(b) quiz.update() self.assertEqual([my_scheme], b.mounted_schemes)
def test_empty_scheme_has_no_effect(self): from quizz import _field_names # noqa empty = Scheme() question = Question("What?", scheme=empty) question_no_scheme = Question("What?") for name in _field_names: if hasattr(question_no_scheme, name): self.assertEqual( getattr(question_no_scheme, name), getattr(question, name) )
def test_scheme_extends_dict(self): my_scheme = Scheme(extra={"foo": "bar", "baz": "qux"}) question = Question("What?", scheme=my_scheme) question_with_extra = Question( "What?", extra={"hello": 5}, scheme=my_scheme ) self.assertEqual({"foo": "bar", "baz": "qux"}, question.extra) self.assertEqual( {"hello": 5, "foo": "bar", "baz": "qux"}, question_with_extra.extra, )
def test_question_prompt_changes_with_quiz(self): question = Question("What?") question2 = Question("Hello?") Quiz(questions=[question, question2]) self.assertEqual( "* Question 1/2. [No answer]\nWhat?", question.get_prompt() ) question.update_scheme(Scheme(suffix="Suf", prefix="Pre")) self.assertEqual( "* Question 1/2. [No answer]\nPreWhat?Suf", question.get_prompt() )
def test_next_previous(self, *_): q1, q2, q3 = ( Question("What?"), Question("What? 2"), Question("What? 3"), ) quiz = Quiz( questions=[q1, q2, q3], scheme=Scheme(commands=[Next, Previous, Finish], required=False), ) quiz.start() self.assertEqual(17, q1.attempt) self.assertEqual(16, q2.attempt) self.assertEqual(0, q3.attempt)
def test_update(self): a, b = Question("a"), Question("b") quiz = Quiz(questions=[a]) quiz.questions.append(b) self.assertIsNone(b.quiz) self.assertEqual([a, b], quiz.required_questions) self.assertEqual(0, b.sequence) quiz.update() self.assertEqual(quiz, b.quiz) self.assertEqual(1, b.sequence) # update() should add Quiz's scheme. (default scheme, in this case) self.assertEqual([Scheme(commands=[Finish])], b.mounted_schemes)
def test_scheme_overrides_immutable(self): my_scheme = Scheme( prompt="Whats up?", required=False, strip=False, suffix="abc", prefix="def", command_delimiter="x", option_indicator="-", ) question = Question("What?", scheme=my_scheme) self.assertEqual("Whats up?", question.prompt) self.assertEqual("x", question.command_delimiter) self.assertEqual("-", question.option_indicator) self.assertEqual("abc", question.suffix) self.assertEqual("def", question.prefix) self.assertFalse(question.required) self.assertFalse(question.strip)
range(21, 31): "Moderate depression", range(31, 41): "Severe depression", range(41, 64): "Extreme depression", } with open("data.json") as file: question_data = json.loads(file.read()) quiz = Quiz( questions=[ MultipleChoiceQuestion("Choose one", choices=choices) for choices in question_data ], scheme=Scheme( style="number_fromzero", display="vertical", commands=[Next, Previous, Jump, Finish, Quit, Help], ), ) print(warning) quiz.start() result = sum(int(question.answer.value) for question in quiz.questions) correspond = next(description for (scale, description) in levels.items() if result in scale) print("Your answers added up to %d, which corresponds to: '%s'." % (result, correspond)) print(warning)
def test_scheme_skips_unknown_attribute(self): my_scheme = Scheme(display="foobar") question = Question("What?", scheme=my_scheme) self.assertFalse(hasattr(question, "display"))
def test_update_scheme_gets_called(self, mock_update_scheme): my_scheme = Scheme(command_delimiter="**") Quiz(questions=[Question("What?")], scheme=my_scheme) mock_update_scheme.assert_called_with(my_scheme, force=False)
def test_empty_scheme_removes_finish_command(self): question = Question("What?") Quiz(questions=[question], scheme=Scheme()) self.assertEqual([], question.commands)
def test_scheme_does_not_skip_empty_strings(self): my_scheme = Scheme(prompt="", option_indicator="") question = Question("What?", scheme=my_scheme) self.assertEqual("", question.prompt) self.assertEqual("", question.option_indicator)
def test_scheme_allows_external_interference(self): my_scheme = Scheme(prompt="Hello") question = Question("What?") question.update_scheme(my_scheme) self.assertEqual("Hello", question.prompt)
def test_scheme_dict_disallow_key_overriding(self): my_scheme = Scheme(extra={"foo": "bar"}) question = Question("What?", extra={"foo": "baz"}, scheme=my_scheme) self.assertEqual({"foo": "baz"}, question.extra)