def test_gift_quiz_docx_generator(): quiz = GiftQuiz() q = GiftQuestion( "L'appareil servant à mesurer la vitesse du vent au sol s'appelle :", name="0001", comment="question: 1 name: 0001") q.append_distractor(GiftDistractor("une girouette.", 0)) q.append_distractor(GiftDistractor("une rose des vents.", 0)) q.append_distractor(GiftDistractor("un baromètre.", 0)) q.append_distractor(GiftDistractor("un anémomètre.", 1)) quiz.append(q) q = GiftQuestion( "L'unité de pression utilisée dans le système international et en aéronautique est :", name="0002", comment="question: 2 name: 0002") q.append_distractor(GiftDistractor("le pascal.", 1)) q.append_distractor(GiftDistractor("le newton.", 0)) q.append_distractor(GiftDistractor("le joule.", 0)) q.append_distractor(GiftDistractor("le millimètre de mercure.", 0)) quiz.append(q) #generator = DocxGenerator() from docx import Document document = Document() show_question_name = False show_correct_answers = True title = 'GIFT Quiz' if show_correct_answers: title += " (correction)" fname_out = 'gift_quiz.docx' document.add_heading(title, 0) p = document.add_paragraph('This is a ') p.add_run('GIFT').bold = True p.add_run(' quiz with ') p.add_run('great').italic = True p.add_run(' questions.') for i, q in enumerate(quiz.iter_questions()): heading = "Question %d" % (i + 1) if q.name != "" and show_question_name: heading += " (%s)" % q.name document.add_heading(heading, level=1) document.add_paragraph(q.stem) for j, distractor in enumerate(q.iter_distractors()): if show_correct_answers and q.is_partially_correct_answer(j) > 0: checkbox = "☑" else: checkbox = "☐" document.add_paragraph("\t" + checkbox + " " * 3 + _escape_special_chars(distractor.text)) # document.add_page_break() document.save(fname_out)
def test_aiken_quiz_from_gift_quiz(): gift_quiz = GiftQuiz() q = GiftQuestion( "L'appareil servant à mesurer la vitesse du vent au sol s'appelle :", name="0001", comment="question: 1 name: 0001") q.append_distractor(GiftDistractor("une girouette.", 0)) q.append_distractor(GiftDistractor("une rose des vents.", 0)) q.append_distractor(GiftDistractor("un baromètre.", 0)) q.append_distractor(GiftDistractor("un anémomètre.", 1)) gift_quiz.append(q) q = GiftQuestion( "L'unité de pression utilisée dans le système international et en aéronautique est :", name="0002", comment="question: 2 name: 0002") q.append_distractor(GiftDistractor("le pascal.", 1)) q.append_distractor(GiftDistractor("le newton.", 0)) q.append_distractor(GiftDistractor("le joule.", 0)) q.append_distractor(GiftDistractor("le millimètre de mercure.", 0)) gift_quiz.append(q) aiken_quiz = AikenQuiz.from_gift(gift_quiz) assert len(aiken_quiz) == len(gift_quiz)
def test_escape_semi_colon(): gift_text = """::30037::Pour indiquer une phase de détresse, vous affichez sur le transpondeur le code \\:{ ~7000 =7700 ~7500 ~7600. }""" quiz = GiftQuiz.parse(gift_text) assert len(quiz) == 1 q = quiz._lst_questions[0] assert len(q) == 4 expected = "Pour indiquer une phase de détresse, vous affichez sur le transpondeur le code :" expected = expected[-10:] #assert q.stem[-10:] == expected
def test_gift_quiz(): quiz = GiftQuiz() q = GiftQuestion( "L'appareil servant à mesurer la vitesse du vent au sol s'appelle :", name="0001", comment="question: 1 name: 0001") q.append_distractor(GiftDistractor("une girouette.", 0)) q.append_distractor(GiftDistractor("une rose des vents.", 0)) q.append_distractor(GiftDistractor("un baromètre.", 0)) q.append_distractor(GiftDistractor("un anémomètre.", 1)) quiz.append(q) q = GiftQuestion( "L'unité de pression utilisée dans le système international et en aéronautique est :", name="0002", comment="question: 2 name: 0002") q.append_distractor(GiftDistractor("le pascal.", 1)) q.append_distractor(GiftDistractor("le newton.", 0)) q.append_distractor(GiftDistractor("le joule.", 0)) q.append_distractor(GiftDistractor("le millimètre de mercure.", 0)) quiz.append(q) assert len(quiz) == 2 header = """// question: 0 name: Switch category to $module$/Défaut pour BIA 2016 Météorologie et aérologie $CATEGORY: $module$/Défaut pour BIA 2016 Météorologie et aérologie """ footer = """ // end of quiz""" expected_gift_text = """// question: 0 name: Switch category to $module$/Défaut pour BIA 2016 Météorologie et aérologie $CATEGORY: $module$/Défaut pour BIA 2016 Météorologie et aérologie // question: 1 name: 0001 ::0001::L'appareil servant à mesurer la vitesse du vent au sol s'appelle \:{ \t~une girouette. \t~une rose des vents. \t~un baromètre. \t=un anémomètre. } // question: 2 name: 0002 ::0002::L'unité de pression utilisée dans le système international et en aéronautique est \:{ \t=le pascal. \t~le newton. \t~le joule. \t~le millimètre de mercure. } // end of quiz""" assert quiz.to_string(header=header, footer=footer) == expected_gift_text
def test_aiken_quiz_to_gift_quiz(): aiken_text = """L'appareil servant à mesurer la vitesse du vent au sol s'appelle : A) une girouette. B) une rose des vents. C) un baromètre. D) un anémomètre. ANSWER: D L'unité de pression utilisée dans le système international et en aéronautique est : A) le pascal. B) le newton. C) le joule. D) le millimètre de mercure. ANSWER: A""" aiken_quiz = AikenQuiz.parse(aiken_text) gift_quiz = GiftQuiz.from_aiken(aiken_quiz) for i, question in enumerate(gift_quiz.iter_questions()): val = i + 1 question.comment = "question: %d name: %04d" % (val, val) question.name = "%04d" % val gift_text = gift_quiz.to_string() expected_gift_text = """// question: 1 name: 0001 ::0001::L'appareil servant à mesurer la vitesse du vent au sol s'appelle \:{ \t~une girouette. \t~une rose des vents. \t~un baromètre. \t=un anémomètre. } // question: 2 name: 0002 ::0002::L'unité de pression utilisée dans le système international et en aéronautique est \:{ \t=le pascal. \t~le newton. \t~le joule. \t~le millimètre de mercure. }""" assert expected_gift_text == gift_text assert len(aiken_quiz) == len(gift_quiz)
def test_gift_parse_no_correct_answer(): """Fix issue where a ZeroDivisionError: float division by zero was raised""" gift_text = """// question: 1 name: 0001 ::0001::L'appareil servant à mesurer la vitesse du vent au sol s'appelle \\:{ \t~une girouette. \t~une rose des vents. \t~un baromètre. \t~un anémomètre. } // question: 2 name: 0002 ::0002::L'unité de pression utilisée dans le système international et en aéronautique est \\:{ \t~le pascal. \t~le newton. \t~le joule. \t~le millimètre de mercure. }""" quiz = GiftQuiz.parse(gift_text) assert len(quiz) == 2 q = quiz._lst_questions[0] assert len(q) == 4 q = quiz._lst_questions[1] assert len(q) == 4
def test_gift_parse(): gift_text = """// question: 1 name: 0001 ::0001::L'appareil servant à mesurer la vitesse du vent au sol s'appelle \:{ \t~une girouette. \t~une rose des vents. \t~un baromètre. \t=un anémomètre. } // question: 2 name: 0002 ::0002::L'unité de pression utilisée dans le système international et en aéronautique est \:{ \t=le pascal. \t~le newton. \t~le joule. \t~le millimètre de mercure. }""" quiz = GiftQuiz.parse(gift_text) assert len(quiz) == 2 q = quiz._lst_questions[0] assert len(q) == 4 assert q.is_correct_answer(3) q = quiz._lst_questions[1] assert len(q) == 4 assert q.is_correct_answer(0)
def test_to_xml(): quiz = GiftQuiz() q = GiftQuestion( "L'appareil servant à mesurer la vitesse du vent au sol s'appelle :", name="0001", comment="question: 1 name: 0001") q.append_distractor(GiftDistractor("une girouette.", 0)) q.append_distractor(GiftDistractor("une rose des vents.", 0)) q.append_distractor(GiftDistractor("un baromètre.", 0)) q.append_distractor(GiftDistractor("un anémomètre.", 1)) quiz.append(q) q = GiftQuestion( "L'unité de pression utilisée dans le système international et en aéronautique est :", name="0002", comment="question: 2 name: 0002") q.append_distractor(GiftDistractor("le pascal.", 1)) q.append_distractor(GiftDistractor("le newton.", 0)) q.append_distractor(GiftDistractor("le joule.", 0)) q.append_distractor(GiftDistractor("le millimètre de mercure.", 0)) quiz.append(q) assert len(quiz) == 2 xml_text = quiz.to_xml_moodle( category='$module$/Défaut pour BIA 2016 Météorologie et aérologie') expected_xml_text = """<?xml version="1.0" encoding="UTF-8"?> <quiz> <question type="category"> <category> <text>$module$/Défaut pour BIA 2016 Météorologie et aérologie</text> </category> </question> </quiz> <question type="multichoice"> <name> <text>0001</text> </name> <questiontext> <text>L'appareil servant à mesurer la vitesse du vent au sol s'appelle :</text> </questiontext> <shuffleanswers>false</shuffleanswers> <answer fraction="0"> <text>une girouette.</text> </answer> <answer fraction="0"> <text>une rose des vents.</text> </answer> <answer fraction="0"> <text>un baromètre.</text> </answer> <answer fraction="100"> <text>un anémomètre.</text> </answer> </question> <question type="multichoice"> <name> <text>0002</text> </name> <questiontext> <text>L'unité de pression utilisée dans le système international et en aéronautique est :</text> </questiontext> <shuffleanswers>false</shuffleanswers> <answer fraction="100"> <text>le pascal.</text> </answer> <answer fraction="0"> <text>le newton.</text> </answer> <answer fraction="0"> <text>le joule.</text> </answer> <answer fraction="0"> <text>le millimètre de mercure.</text> </answer> </question>""" assert xml_text == expected_xml_text
def test_gift_quiz_join(): quiz1 = GiftQuiz() q = GiftQuestion( "L'appareil servant à mesurer la vitesse du vent au sol s'appelle :", name="0001", comment="question: 1 name: 0001") q.append_distractor(GiftDistractor("une girouette.", 0)) q.append_distractor(GiftDistractor("une rose des vents.", 0)) q.append_distractor(GiftDistractor("un baromètre.", 0)) q.append_distractor(GiftDistractor("un anémomètre.", 1)) quiz1.append(q) q = GiftQuestion( "L'unité de pression utilisée dans le système international et en aéronautique est :", name="0002", comment="question: 2 name: 0002") q.append_distractor(GiftDistractor("le pascal.", 1)) q.append_distractor(GiftDistractor("le newton.", 0)) q.append_distractor(GiftDistractor("le joule.", 0)) q.append_distractor(GiftDistractor("le millimètre de mercure.", 0)) quiz1.append(q) quiz2 = GiftQuiz() q = GiftQuestion("En vol en palier stabilisé :", name="0003", comment="question: 3 name: 0003") q.append_distractor(GiftDistractor("la portance équilibre le poids.", 1)) q.append_distractor(GiftDistractor("la portance équilibre la traînée.", 0)) q.append_distractor( GiftDistractor("la portance équilibre la résultante aérodynamique.", 0)) q.append_distractor( GiftDistractor("la portance équilibre la force de propulsion.", 0)) quiz2.append(q) q = GiftQuestion("Le vent relatif :", name="0004", comment="question: 4 name: 0004") q.append_distractor( GiftDistractor( "est la composante du vent réel parallèle à la trajectoire.", 0)) q.append_distractor( GiftDistractor( "est parallèle à la trajectoire, et de même sens que le déplacement de l'avion.", 0)) q.append_distractor( GiftDistractor( "est parallèle à la trajectoire, mais de sens opposé au déplacement de l'avion.", 1)) q.append_distractor( GiftDistractor( "est la composante du vent réel perpendiculaire à la trajectoire.", 0)) quiz2.append(q) quiz_result = GiftQuiz.join([quiz1, quiz2]) expected_text = """// question: 1 name: 0001 ::0001::L'appareil servant à mesurer la vitesse du vent au sol s'appelle \:{ \t~une girouette. \t~une rose des vents. \t~un baromètre. \t=un anémomètre. } // question: 2 name: 0002 ::0002::L'unité de pression utilisée dans le système international et en aéronautique est \:{ \t=le pascal. \t~le newton. \t~le joule. \t~le millimètre de mercure. } // question: 3 name: 0003 ::0003::En vol en palier stabilisé \:{ \t=la portance équilibre le poids. \t~la portance équilibre la traînée. \t~la portance équilibre la résultante aérodynamique. \t~la portance équilibre la force de propulsion. } // question: 4 name: 0004 ::0004::Le vent relatif \:{ \t~est la composante du vent réel parallèle à la trajectoire. \t~est parallèle à la trajectoire, et de même sens que le déplacement de l'avion. \t=est parallèle à la trajectoire, mais de sens opposé au déplacement de l'avion. \t~est la composante du vent réel perpendiculaire à la trajectoire. }""" assert len(quiz_result) == 4 assert quiz_result.to_string() == expected_text