File size: 1,266 Bytes
49da08e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from app.schemas.cross_validation import AnswerKind, ValidationConfidence
from app.services.math_answer_extractor import extract_student_math_answer


def test_extractor_uses_scanner_for_set_literal() -> None:
    r = extract_student_math_answer(
        "La reponse est {3}.",
        expected_answer_kind=AnswerKind.SOLUTION_SET,
    )
    assert r.extracted_value == "3"
    assert r.confidence == ValidationConfidence.CERTAIN
    assert r.needs_human_review is False
    assert r.reason == "deterministic_structure_scanner"


def test_extractor_preserves_multi_value_solution_set() -> None:
    r = extract_student_math_answer(
        "On obtient S={-2, 4}.",
        expected_answer_kind=AnswerKind.SOLUTION_SET,
    )
    assert r.extracted_value == "{-2,4}"
    assert r.confidence == ValidationConfidence.CERTAIN
    assert r.needs_human_review is False


def test_extractor_marks_bare_number_as_semantic_residue() -> None:
    r = extract_student_math_answer(
        "Donc 3 est la solution.",
        expected_answer_kind=AnswerKind.SOLUTION_SET,
    )
    assert r.extracted_value == "3"
    assert r.confidence == ValidationConfidence.PROBABLE
    assert r.needs_human_review is True
    assert r.reason == "bare_number_requires_semantic_confirmation"