1+ from app import extended_curriculum
12from app .content import EXAMS , LESSONS , MODULES , QUESTION_BY_ID
3+ from app .evaluator import normalize
4+ from app .extended_curriculum import TERM_SYNONYMS , build_extended_course
25
36
47def test_full_course_has_120_progressive_lessons () -> None :
@@ -29,13 +32,14 @@ def test_every_module_has_a_valid_exam() -> None:
2932
3033def test_extended_questions_are_fair_and_exams_are_mixed () -> None :
3134 extended_lessons = [lesson for lesson in LESSONS if lesson ["order" ] >= 13 ]
32- choice_positions = {
35+ choice_positions = [
3336 question ["options" ].index (question ["answer" ])
3437 for lesson in extended_lessons
3538 for question in lesson ["questions" ]
3639 if question ["kind" ] == "choice"
37- }
38- assert len (choice_positions ) > 1
40+ ]
41+ assert len (set (choice_positions )) > 1
42+ assert all (0 <= position < 3 for position in choice_positions )
3943 assert (
4044 sum (
4145 len (question ["answers" ]) > 1
@@ -47,6 +51,52 @@ def test_extended_questions_are_fair_and_exams_are_mixed() -> None:
4751 )
4852 extended_modules = {lesson ["module_id" ] for lesson in extended_lessons }
4953 for module_id in extended_modules :
50- assert {
51- QUESTION_BY_ID [question_id ]["kind" ] for question_id in EXAMS [module_id ]["question_ids" ]
52- } == {"choice" , "input" , "code" }
54+ question_ids = EXAMS [module_id ]["question_ids" ]
55+ assert len (question_ids ) == len (set (question_ids )) == 4
56+ assert {QUESTION_BY_ID [question_id ]["kind" ] for question_id in question_ids } == {
57+ "choice" ,
58+ "input" ,
59+ "code" ,
60+ }
61+
62+ term_question = next (
63+ question
64+ for lesson in extended_lessons
65+ for question in lesson ["questions" ]
66+ if question ["kind" ] == "input" and len (question ["answers" ]) > 1
67+ )
68+ assert all (
69+ normalize (answer ) not in normalize (term_question ["placeholder" ])
70+ for answer in term_question ["answers" ]
71+ )
72+
73+ keyword , synonyms = next (iter (TERM_SYNONYMS .items ()))
74+ answers = next (
75+ question ["answers" ]
76+ for lesson in extended_lessons
77+ for question in lesson ["questions" ]
78+ if question ["kind" ] == "input" and keyword in question ["answers" ]
79+ )
80+ assert normalize (f" { synonyms [0 ].upper ()} " ) in {normalize (answer ) for answer in answers }
81+
82+
83+ def test_extended_generation_is_deterministic_and_handles_short_modules (monkeypatch ) -> None :
84+ first = build_extended_course ()
85+ second = build_extended_course ()
86+ assert first == second
87+
88+ monkeypatch .setattr (
89+ extended_curriculum ,
90+ "COURSE_UNITS" ,
91+ [
92+ {
93+ ** extended_curriculum .COURSE_UNITS [0 ],
94+ "lessons" : extended_curriculum .COURSE_UNITS [0 ]["lessons" ][:1 ],
95+ }
96+ ],
97+ )
98+ monkeypatch .setattr (
99+ extended_curriculum , "TASK_CYCLES" , [extended_curriculum .TASK_CYCLES [0 ][:1 ]]
100+ )
101+ _ , _ , exams = build_extended_course ()
102+ assert len (next (iter (exams .values ()))["question_ids" ]) == 3
0 commit comments