extends SceneTree const Config = preload("res://testing/playable_config.gd") const Report = preload("res://testing/playable_report.gd") var failures := 0 func _init() -> void: call_deferred("run") func check(ok: bool, message: String) -> void: if not ok: failures += 1 printerr("FAIL: " + message) func run() -> void: var example_path := ProjectSettings.globalize_path("res://../test/playable/scenario.example.json") var example := Config.load_file(example_path) check(not example.ok, "empty example configuration is rejected") check(example.errors.size() > 0, "invalid configuration has reasons") var valid := { "schema_version": 1, "scenario_id": "harness", "protocol": "classic", "server": {"server_index": 0, "channel_index": 0}, "character_slot": 0, "map_key": "OutdoorA1/metin2_map_a1", "waypoints_cm": [[454600, 934000]], "allowed_mob_vnums": [101], "allowed_drop_vnums": [19], "skill_cases": [{"case_id": "skill-1", "skill_id": 1, "required_evidence": ["damage"]}], "resolution": [1280, 720], "loops": 1, "timeout_seconds": 120, } check(Config.validate(valid).ok, "complete configuration is accepted") var secret := valid.duplicate(true) secret["password"] = "must-be-rejected" check(not Config.validate(secret).ok, "credentials in configuration are rejected") var report := Report.new() report.begin("harness-run", "playable", valid) report.add_case("CONFIG-01", "PASS", "validated") report.add_case("EVENT-01", "PASS", "received") var finished := report.finish() check(finished.status == "PASS", "all passing cases produce client PASS") check(finished.coverage.required == 2 and finished.coverage.passed == 2, "coverage is exact") var blocked := Report.new() blocked.begin("blocked-run", "playable", valid) blocked.add_case("FIXTURE-01", "BLOCKED", "fixture_not_ready") check(blocked.finish().status == "BLOCKED", "blocked fixture cannot become PASS") var out := "user://playable-harness-report.json" check(report.write(out), "report can be serialized") var json: Variant = JSON.parse_string(FileAccess.get_file_as_string(out)) check(json is Dictionary and json.get("run_id", "") == "harness-run", "serialized report is readable") print("playable_harness_test: failures=%d" % failures) quit(1 if failures else 0)