mirror of
https://github.com/deunix-educ/aventuriers-des-mots.git
synced 2026-10-13 02:11:58 +02:00
8584249d78
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
152 lines
5.4 KiB
GDScript
152 lines
5.4 KiB
GDScript
extends GutTest
|
||
## Tests de AnswerValidator (choix multiple et correction de phrase).
|
||
|
||
var multiple_choice_exercise: Dictionary = {
|
||
"rule_id": "regle_test",
|
||
"answers": ["petit", "petits", "petite"],
|
||
"correct_answer": 1,
|
||
"hint": "indice",
|
||
"explanation": "explication",
|
||
}
|
||
|
||
var sentence_correction_exercise: Dictionary = {
|
||
"rule_id": "regle_test",
|
||
"hint": "indice",
|
||
"explanation": "explication",
|
||
"tokens":
|
||
[
|
||
{"text": "Les", "correct": true},
|
||
{
|
||
"text": "petit",
|
||
"correct": false,
|
||
"expected": "petits",
|
||
"rule_id": "regle_accord_adjectif",
|
||
},
|
||
{"text": "chiens", "correct": true},
|
||
],
|
||
}
|
||
|
||
|
||
func test_multiple_choice_correct_answer() -> void:
|
||
var result := AnswerValidator.validate_multiple_choice(multiple_choice_exercise, 1)
|
||
assert_true(result.is_correct)
|
||
assert_eq(result.errors, [])
|
||
|
||
|
||
func test_multiple_choice_wrong_answer_reports_found_and_expected() -> void:
|
||
var result := AnswerValidator.validate_multiple_choice(multiple_choice_exercise, 0)
|
||
assert_false(result.is_correct)
|
||
assert_eq(result.errors.size(), 1)
|
||
assert_eq(result.errors[0]["found"], "petit")
|
||
assert_eq(result.errors[0]["expected"], "petits")
|
||
assert_eq(result.errors[0]["rule_id"], "regle_test")
|
||
|
||
|
||
func test_sentence_correction_fully_correct() -> void:
|
||
var result := AnswerValidator.validate_sentence_correction(
|
||
sentence_correction_exercise, [1], {1: "petits"}
|
||
)
|
||
assert_true(result.is_correct)
|
||
|
||
|
||
func test_sentence_correction_missed_faulty_token() -> void:
|
||
var result := AnswerValidator.validate_sentence_correction(sentence_correction_exercise, [], {})
|
||
assert_false(result.is_correct)
|
||
assert_eq(result.errors.size(), 1)
|
||
assert_eq(result.errors[0]["rule_id"], "regle_accord_adjectif")
|
||
assert_eq(result.errors[0]["found"], "petit")
|
||
assert_eq(result.errors[0]["expected"], "petits")
|
||
|
||
|
||
func test_sentence_correction_wrong_correction_text() -> void:
|
||
var result := AnswerValidator.validate_sentence_correction(
|
||
sentence_correction_exercise, [1], {1: "petite"}
|
||
)
|
||
assert_false(result.is_correct)
|
||
assert_eq(result.errors[0]["found"], "petite")
|
||
assert_eq(result.errors[0]["expected"], "petits")
|
||
|
||
|
||
func test_sentence_correction_false_positive_on_correct_token() -> void:
|
||
var result := AnswerValidator.validate_sentence_correction(
|
||
sentence_correction_exercise, [1, 2], {1: "petits", 2: "chien"}
|
||
)
|
||
assert_false(result.is_correct)
|
||
assert_eq(result.errors.size(), 1)
|
||
assert_eq(result.errors[0]["error_type"], "unclassified")
|
||
assert_eq(result.errors[0]["position"], 2)
|
||
|
||
|
||
func test_sentence_correction_accepts_correction_with_different_case() -> void:
|
||
# Rapporte manuellement : "Petits" (majuscule incidente, ex. autocapitalisation)
|
||
# devait etre accepte au meme titre que "petits".
|
||
var result := AnswerValidator.validate_sentence_correction(
|
||
sentence_correction_exercise, [1], {1: "Petits"}
|
||
)
|
||
assert_true(result.is_correct)
|
||
|
||
|
||
func test_sentence_correction_accepts_correction_with_surrounding_whitespace() -> void:
|
||
var result := AnswerValidator.validate_sentence_correction(
|
||
sentence_correction_exercise, [1], {1: " petits "}
|
||
)
|
||
assert_true(result.is_correct)
|
||
|
||
|
||
func test_sentence_correction_accepts_decomposed_accented_correction() -> void:
|
||
var exercise_with_accent: Dictionary = {
|
||
"rule_id": "regle_test",
|
||
"hint": "indice",
|
||
"explanation": "explication",
|
||
"tokens":
|
||
[
|
||
{
|
||
"text": "lecole",
|
||
"correct": false,
|
||
"expected": "école",
|
||
"rule_id": "regle_accord_adjectif",
|
||
},
|
||
],
|
||
}
|
||
# "e" + accent aigu combinant (U+0301), forme decomposee du meme mot.
|
||
var result := AnswerValidator.validate_sentence_correction(
|
||
exercise_with_accent, [0], {0: "école"}
|
||
)
|
||
assert_true(result.is_correct)
|
||
|
||
|
||
func _elision_exercise() -> Dictionary:
|
||
return {
|
||
"rule_id": "regle_x",
|
||
"hint": "indice",
|
||
"explanation": "explication",
|
||
"tokens":
|
||
[
|
||
{"text": "Si", "correct": true},
|
||
{"text": "j'achèterai", "correct": false, "expected": "j'achèterais"},
|
||
{"text": "une", "correct": true},
|
||
],
|
||
}
|
||
|
||
|
||
func test_elided_token_accepts_the_whole_word_or_only_the_verb() -> void:
|
||
var exercise := _elision_exercise()
|
||
for typed in ["j'achèterais", "J'achèterais", "j’achèterais", "achèterais", " achèterais "]:
|
||
var result := AnswerValidator.validate_sentence_correction(exercise, [1], {1: typed})
|
||
assert_true(result.is_correct, "« %s » doit etre accepte" % typed)
|
||
|
||
|
||
func test_elided_token_still_rejects_a_wrong_correction() -> void:
|
||
var exercise := _elision_exercise()
|
||
for typed in ["j'achèterai", "achèterai", "achetterais", ""]:
|
||
var result := AnswerValidator.validate_sentence_correction(exercise, [1], {1: typed})
|
||
assert_false(result.is_correct, "« %s » ne doit pas etre accepte" % typed)
|
||
|
||
|
||
func test_expected_without_elision_accepts_the_prefix_of_the_touched_word() -> void:
|
||
var exercise := _elision_exercise()
|
||
exercise["tokens"][1]["expected"] = "achèterais"
|
||
for typed in ["achèterais", "j'achèterais"]:
|
||
var result := AnswerValidator.validate_sentence_correction(exercise, [1], {1: typed})
|
||
assert_true(result.is_correct, "« %s » doit etre accepte" % typed)
|