Files
TheTree_mock/tests/performance/test_facility_reachability.gd
Takeshi b84bade045 Save The Tree implementation and acceptance work in progress
Preserve production code, regression fixtures, audio assets and provenance, test infrastructure, and the original-completion plan and progress ledger. Final game and Windows acceptance remain pending; excluded local artifacts and native experiments are not part of this snapshot.
2026-10-11 15:58:00 +09:00

53 lines
3.1 KiB
GDScript

extends SceneTree
const Demo := preload("res://scripts/ui/pixel_tower_demo.gd")
var checks := 0
var failures := 0
var runtime: Variant
func expect(ok: bool, label: String) -> void:
checks += 1
if not ok: failures += 1; push_error(label)
func _initialize() -> void: call_deferred("run")
func compare(label: String) -> void:
for facility: FacilityInstance in runtime.facility_service.get_instances():
expect(runtime.is_facility_reachable(facility.instance_id) == bool(runtime.get_facility_access_report(facility.instance_id)[&"reachable"]), label + ": " + String(facility.instance_id))
func run() -> void:
runtime = root.get_node("SimulationRuntime")
var clock: Variant = root.get_node("GameClock")
var state: Variant = root.get_node("GameState")
# Disposable Demo fixture funds exact Doran signing_cost 300; DEFAULT5000 and paid hire stay unchanged.
clock.reset(1,6,0); state.reset();state.resources[&"gold"] += 300; runtime.initialize(clock,state,424242); clock.set_paused(true)
runtime.configure_save_policy({&"enabled":false,&"daily_checkpoint_enabled":false})
var demo := Demo.new()
expect(await demo.prepare(runtime,clock,self), "prepare actual multi-floor topology")
if failures: quit(failures); return
compare("connected topology")
expect(not runtime.is_facility_reachable(&"missing"), "missing facility is unreachable")
var checkpoint: Dictionary = runtime.create_snapshot()
var facility: FacilityInstance = runtime.facility_service.get_instances()[0]
facility.access_available = false
expect(not runtime.is_facility_reachable(facility.instance_id), "operating access override is honored")
expect(runtime.restore_snapshot(checkpoint), "restore access override")
# Block every graph cell, including all candidate public entrances. Do not
# leave a second entrance that can legitimately reach the same destination.
for cell: Vector3i in runtime.world_service.get_walkable_cells():
if runtime.path_service.has_cell(cell): runtime.path_service.set_cell_temporary_block(cell,true)
compare("blocked topology")
for item: FacilityInstance in runtime.facility_service.get_instances():
expect(not runtime.is_facility_reachable(item.instance_id), "blocked entrance cannot report reachable")
expect(runtime.restore_snapshot(checkpoint), "restore graph after temporary blocks")
compare("restored topology")
var measurements := {}
for method: StringName in [&"get_facility_access_report", &"is_facility_reachable"]: measurements[String(method)] = []
for attempt in 100:
var methods: Array[StringName] = [&"get_facility_access_report", &"is_facility_reachable"]
if attempt % 2: methods.reverse()
for method: StringName in methods:
var start := Time.get_ticks_usec()
for item: FacilityInstance in runtime.facility_service.get_instances(): runtime.call(method,item.instance_id)
measurements[String(method)].append(Time.get_ticks_usec()-start)
var output := OS.get_environment("THE_TREE_REACHABILITY_PROFILE")
if not output.is_empty():
var file := FileAccess.open(output,FileAccess.WRITE)
file.store_string(JSON.stringify(measurements," "));file.close()
print("Facility reachability: %d checks, %d failures" % [checks,failures]);quit(failures)