extends SceneTree var failures := 0 func check(ok: bool, message: String) -> void: if not ok: failures += 1 push_error(message) func sample(id: String, uid := "1234ABCD", device := "cab1_rfid1", fresh := true, age := 0) -> Dictionary: return {"fresh": fresh, "events": [{"id": id, "device": device, "kind": "rfid", "value": uid, "error": ""}], "devices": [{"id": device, "value": uid, "age_ms": age, "error": ""}]} func _initialize() -> void: call_deferred("run") func run() -> void: var game = load("res://games/pacman/pacman.gd").new() root.add_child(game) game.configure({"rfid_credit_device": "cab1_rfid1", "rfid_allowed_uids": ["1234ABCD"]}) game.set_physics_process(false) game._physics_process(4.0) check(not game.start_game(), "Start must require a credit") game.receive_device_feedback({}) game.receive_device_feedback(sample("old")) check(game.credits == 0, "First fresh snapshot must baseline historical scans") game.receive_device_feedback(sample("wrong-reader", "1234ABCD", "other")) game.receive_device_feedback(sample("wrong-card", "99999999")) game.receive_device_feedback(sample("stale", "1234ABCD", "cab1_rfid1", true, 5000)) game.receive_device_feedback(sample("offline", "1234ABCD", "cab1_rfid1", false)) check(game.credits == 0, "Wrong reader/card, stale and offline samples must not credit") game.receive_device_feedback(sample("scan")) check(game.credits == 1 and game.view.credits == 1, "New accepted scan grants one visible credit") game.receive_device_feedback(sample("scan")) game.receive_device_feedback(sample("scan2")) check(game.credits == 1, "Duplicate and additional scans must not stack credits") check(game.start_game() and game.credits == 0, "Start consumes one credit") game.receive_device_feedback(sample("during-play")) check(game.credits == 0, "Playing scans must not bank credits") game.reset_game() game.receive_device_feedback(sample("scan")) check(game.credits == 0, "Reset must not replay a prior event") game.receive_device_feedback(sample("new-scan")) check(game.credits == 1, "New scan works after reset") game.configure({}) game._physics_process(4.0) check(game.start_game(), "Ordinary non-RFID Pac-Man remains free start") game.queue_free() await process_frame print("RFID credit tests: ", "PASS" if failures == 0 else "FAIL") quit(1 if failures else 0)