Example #1
0
    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)
Example #2
0
    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(),
        )
Example #3
0
    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,
        )
Example #4
0
    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,
            ]
        )
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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)
Example #9
0
    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)
                )
Example #10
0
    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,
        )
Example #11
0
    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()
        )
Example #12
0
    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)
Example #13
0
    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)
Example #14
0
    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)
Example #15
0
    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)
Example #16
0
    def test_scheme_skips_unknown_attribute(self):
        my_scheme = Scheme(display="foobar")
        question = Question("What?", scheme=my_scheme)

        self.assertFalse(hasattr(question, "display"))
Example #17
0
    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)
Example #18
0
    def test_empty_scheme_removes_finish_command(self):
        question = Question("What?")
        Quiz(questions=[question], scheme=Scheme())

        self.assertEqual([], question.commands)
Example #19
0
    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)
Example #20
0
    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)
Example #21
0
    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)