mirror of
https://github.com/deunix-educ/aventuriers-des-mots.git
synced 2026-10-13 02:11:58 +02:00
Add settings screen and adult space with progress report and save export/restore (0.4.0)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
extends GutTest
|
||||
## Tests d'AdultGate : le calcul est dans les bornes et la reponse est exacte.
|
||||
|
||||
|
||||
func test_challenge_is_within_bounds_and_answer_matches() -> void:
|
||||
var rng := RandomNumberGenerator.new()
|
||||
rng.seed = 42
|
||||
for _i in range(50):
|
||||
var challenge := AdultGate.make_challenge(rng)
|
||||
assert_between(challenge["a"], AdultGate.MIN_FACTOR_A, AdultGate.MAX_FACTOR_A)
|
||||
assert_between(challenge["b"], AdultGate.MIN_FACTOR_B, AdultGate.MAX_FACTOR_B)
|
||||
assert_eq(challenge["answer"], challenge["a"] * challenge["b"])
|
||||
|
||||
|
||||
func test_same_seed_gives_same_challenge() -> void:
|
||||
var first := RandomNumberGenerator.new()
|
||||
first.seed = 7
|
||||
var second := RandomNumberGenerator.new()
|
||||
second.seed = 7
|
||||
assert_eq(AdultGate.make_challenge(first), AdultGate.make_challenge(second))
|
||||
|
||||
|
||||
func test_is_correct_accepts_exact_answer_with_spaces() -> void:
|
||||
var challenge := {"a": 13, "b": 7, "answer": 91}
|
||||
assert_true(AdultGate.is_correct(challenge, "91"))
|
||||
assert_true(AdultGate.is_correct(challenge, " 91 "))
|
||||
|
||||
|
||||
func test_is_correct_rejects_wrong_or_non_numeric() -> void:
|
||||
var challenge := {"a": 13, "b": 7, "answer": 91}
|
||||
assert_false(AdultGate.is_correct(challenge, "90"))
|
||||
assert_false(AdultGate.is_correct(challenge, ""))
|
||||
assert_false(AdultGate.is_correct(challenge, "quatre-vingt-onze"))
|
||||
@@ -0,0 +1 @@
|
||||
uid://cv8nfcak28jm8
|
||||
@@ -0,0 +1,91 @@
|
||||
extends GutTest
|
||||
## Tests de SaveTransfer : export, liste, restauration non destructive et
|
||||
## rejet des fichiers invalides. Le dossier d'export est un dossier de test
|
||||
## sous user:// ; jamais le dossier Documents de l'utilisateur.
|
||||
|
||||
const EXPORT_DIR := "user://test_save_transfer_exports"
|
||||
const SOURCE_ID := "test_transfer_source"
|
||||
const RESTORED_ID := "test_transfer_restored"
|
||||
|
||||
var schema: Dictionary = {}
|
||||
|
||||
|
||||
func before_each() -> void:
|
||||
schema = DataLoader.load_schema("save")
|
||||
_clean()
|
||||
|
||||
|
||||
func after_all() -> void:
|
||||
_clean()
|
||||
|
||||
|
||||
func _clean() -> void:
|
||||
SaveIO.delete(SOURCE_ID)
|
||||
SaveIO.delete(RESTORED_ID)
|
||||
var dir := DirAccess.open(EXPORT_DIR)
|
||||
if dir != null:
|
||||
for file_name in dir.get_files():
|
||||
dir.remove(file_name)
|
||||
DirAccess.remove_absolute(EXPORT_DIR)
|
||||
|
||||
|
||||
func _make_source() -> void:
|
||||
var save := SaveFactory.new_save(SOURCE_ID, "Léa", "CE2")
|
||||
save["rewards"] = {"stars": 4, "items": ["item_graine_magique"]}
|
||||
save["mission_results"] = {"m": {"best_stars": 3, "last_stars": 3, "completions": 2}}
|
||||
SaveIO.write(SOURCE_ID, save)
|
||||
|
||||
|
||||
func test_export_writes_a_readable_file_named_after_the_profile() -> void:
|
||||
_make_source()
|
||||
var path := SaveTransfer.export_profile(SOURCE_ID, schema, EXPORT_DIR)
|
||||
assert_ne(path, "")
|
||||
assert_true(path.get_file().begins_with("Léa_CE2"))
|
||||
var read_back: Variant = SaveTransfer.read_export(path, schema)
|
||||
assert_not_null(read_back)
|
||||
assert_eq(read_back["display_name"], "Léa")
|
||||
|
||||
|
||||
func test_second_export_does_not_overwrite_the_first() -> void:
|
||||
_make_source()
|
||||
var first := SaveTransfer.export_profile(SOURCE_ID, schema, EXPORT_DIR)
|
||||
var second := SaveTransfer.export_profile(SOURCE_ID, schema, EXPORT_DIR)
|
||||
assert_ne(first, second)
|
||||
assert_eq(SaveTransfer.list_exports(EXPORT_DIR, schema).size(), 2)
|
||||
|
||||
|
||||
func test_export_of_missing_profile_fails_cleanly() -> void:
|
||||
assert_eq(SaveTransfer.export_profile("test_transfer_nobody", schema, EXPORT_DIR), "")
|
||||
|
||||
|
||||
func test_restore_creates_a_new_profile_and_keeps_the_original() -> void:
|
||||
_make_source()
|
||||
var path := SaveTransfer.export_profile(SOURCE_ID, schema, EXPORT_DIR)
|
||||
assert_true(SaveTransfer.import_as_new_profile(path, schema, RESTORED_ID))
|
||||
|
||||
var restored: Variant = SaveIO.read(RESTORED_ID, schema)
|
||||
assert_not_null(restored)
|
||||
assert_eq(restored["profile_id"], RESTORED_ID)
|
||||
assert_eq(restored["rewards"]["stars"], 4)
|
||||
assert_eq(restored["mission_results"]["m"]["completions"], 2)
|
||||
|
||||
var original: Variant = SaveIO.read(SOURCE_ID, schema)
|
||||
assert_eq(original["profile_id"], SOURCE_ID)
|
||||
|
||||
|
||||
func test_invalid_files_are_listed_as_invalid_and_cannot_be_restored() -> void:
|
||||
DirAccess.make_dir_recursive_absolute(EXPORT_DIR)
|
||||
var file := FileAccess.open(EXPORT_DIR + "/abime.json", FileAccess.WRITE)
|
||||
file.store_string("{ pas du json")
|
||||
file.close()
|
||||
var entries := SaveTransfer.list_exports(EXPORT_DIR, schema)
|
||||
assert_eq(entries.size(), 1)
|
||||
assert_false(entries[0]["valid"])
|
||||
assert_false(
|
||||
SaveTransfer.import_as_new_profile(EXPORT_DIR + "/abime.json", schema, RESTORED_ID)
|
||||
)
|
||||
assert_null(SaveIO.read(RESTORED_ID, schema))
|
||||
|
||||
|
||||
func test_list_of_missing_directory_is_empty() -> void:
|
||||
assert_eq(SaveTransfer.list_exports("user://test_transfer_absent_dir", schema).size(), 0)
|
||||
@@ -0,0 +1 @@
|
||||
uid://c2qnw22eh66lv
|
||||
Reference in New Issue
Block a user