"""Smoke #2 (boxed parser) + #4 (answer grader).""" from mathcompose.common.math_grade import ( extract_boxed_int, extract_last_boxed, grade_answer, normalize_problem_text, ) def test_boxed_int(): assert extract_boxed_int(r"blah \boxed{-1}") == -1 assert extract_boxed_int(r"...\boxed{3}") == 3 assert extract_boxed_int(r"Verdict... \boxed{ 12 }") == 12 assert extract_boxed_int(r"\boxed{\text{-1}}") == -1 assert extract_boxed_int("no box; first error at step 5") == 5 assert extract_boxed_int("nothing here") is None def test_last_boxed_nested(): assert extract_last_boxed(r"\boxed{\frac{1}{2}}") == r"\frac{1}{2}" assert extract_last_boxed(r"\boxed{1} then \boxed{2}") == "2" def test_grade_answer_equivalence(): assert grade_answer("42", "42") assert grade_answer(r"\frac{1}{2}", "0.5") assert grade_answer(r"\frac{1}{2}", r"\frac{2}{4}") assert grade_answer(r"\sqrt{2}", "1.41421356") assert grade_answer("1,000", "1000") assert grade_answer("x+1", "1+x") assert grade_answer(r"2\pi", "6.283185307") def test_grade_answer_rejects(): assert not grade_answer("3", "4") assert not grade_answer(r"\frac{1}{3}", "0.33") assert not grade_answer(None, "4") def test_problem_normalization(): assert normalize_problem_text("What is $1+1$?") == normalize_problem_text("what is 1 + 1 ?")