Files
TheTree_mock/tests/mvp/test_chapel_boundaries.gd
Takeshi 5dde0c5ec2 Record original-alignment implementation and traceability checkpoint
Capture current source, content data, tests, asset licenses, and original-specification traceability. Original implementation remains incomplete. The accepted matching UI generation passed 154 suites and 12,253 checks, with eight rendered staff-contract screens reviewed. Latest native Windows and full-original acceptance remain outstanding.
2026-09-30 23:52:24 +09:00

89 lines
7.1 KiB
GDScript

extends SceneTree
var checks:=0
var failures:=0
func expect(ok:bool,label:String)->void:
checks+=1
if not ok:failures+=1;push_error(label)
func _initialize()->void:call_deferred("run")
func run()->void:
var runtime:Variant=load("res://autoload/simulation_runtime.gd").new()
var clock:Variant=load("res://autoload/game_clock.gd").new()
var state:Variant=load("res://autoload/game_state.gd").new()
clock.reset(1,6,0);state.reset();runtime.initialize(clock,state,42608);clock.set_paused(true)
expect(runtime.submit_command(&"build_facility",{&"definition_id":&"chapel",&"origin":Vector3i(-6,0,0)}).is_success(),"build normal catalog chapel")
clock.advance_minutes(180)
var chapel:FacilityInstance
for f:FacilityInstance in runtime.facility_service.get_instances():
if f.definition_id==&"chapel":chapel=f
if chapel==null:expect(false,"chapel exists");quit(failures);return
var facility_id:StringName=chapel.instance_id
expect(runtime.submit_command(&"hire_staff_candidate",{&"candidate_id":&"staff_uma"}).is_success(),"hire real cleric")
expect(runtime.submit_command(&"set_staff_work_assignment",{&"staff_id":&"staff_uma",&"facility_id":facility_id,&"template_id":&"DAY"}).is_success(),"assign cleric")
clock.advance_minutes(20)
expect(chapel.active_staff_ids==[&"staff_uma"],"actual cleric attendance opens chapel")
for index in 9:
var guest_id:=StringName("chapel_capacity_%d"%index)
expect(runtime.submit_command(&"register_guest_wallet",{&"guest_id":guest_id,&"gold":100}).is_success(),"fund controlled capacity payer")
expect(runtime.submit_command(&"create_service_request",{&"request_id":StringName("worship_%d"%index),&"facility_id":facility_id,&"guest_ids":[guest_id],&"service_type":&"worship"}).is_success(),"request capacity worship")
if index==7:clock.advance_one_minute()
clock.advance_one_minute()
expect(runtime.facility_service.get_active_services(facility_id).size()==8 and chapel.queue_entries.size()==1,"eight simultaneous customers and one separate waiting request")
var occupied:Dictionary=runtime.create_snapshot()
expect(runtime.restore_snapshot(occupied) and runtime.create_snapshot()==occupied,"full chapel and waiting queue restore exactly")
var services:Array=runtime.facility_service.get_active_services(facility_id)
var service_id:StringName=services[0].service_id
var elapsed:int=services[0].elapsed_minutes
expect(runtime.submit_command(&"set_staff_work_assignment",{&"staff_id":&"staff_uma",&"facility_id":&"",&"template_id":&"DAY"}).is_success(),"normal unassignment removes required cleric")
clock.advance_minutes(2)
var interrupted:ServiceInstance=runtime.facility_service.get_service(service_id)
expect(interrupted.state==ServiceInstance.State.WAITING_FOR_STAFF and interrupted.elapsed_minutes==elapsed,"cleric loss pauses worship without consuming service time")
expect(state.get_resource(&"faith")==0 and runtime.economy_service.get_balance(&"GUEST_WALLET:chapel_capacity_0")==100,"interrupted worship grants no faith and takes no donation")
var paused:Dictionary=runtime.create_snapshot()
expect(runtime.restore_snapshot(paused) and runtime.create_snapshot()==paused,"interrupted services and grace deadline restore together")
clock.advance_minutes(6)
expect(runtime.facility_service.get_service(service_id).state==ServiceInstance.State.FAILED,"continued absence fails worship after existing replacement grace")
expect(state.get_resource(&"faith")==0 and runtime.economy_service.get_balance(&"GUEST_WALLET:chapel_capacity_0")==100,"failed worship grants no reward or charge")
expect(runtime.restore_snapshot(occupied),"restore staffed capacity scenario")
var exceeded:=false
for minute in 125:
clock.advance_one_minute()
exceeded=exceeded or runtime.facility_service.get_active_services(facility_id).size()>8
expect(not exceeded,"queue continuation never exceeds eight simultaneous users")
expect(state.get_resource(&"faith")==9 and runtime.progression_service.metrics[&"faith_lifetime"]==9,"all nine requests complete with nine faith total")
var revenue:=0
for entry:LedgerEntry in runtime.economy_service.get_entries():
if entry.category==&"SERVICE_SALE" and entry.source_entity_id==facility_id:revenue+=entry.amount
expect(revenue==180 and runtime.economy_service.validate_ledger()[&"ok"],"nine donations produce180G with balanced ledger")
expect(runtime.restore_snapshot(runtime.create_snapshot()),"finished capacity services and Faith remain saveable")
# Start a separate normal operating game; enabling midway is invalid by design.
clock.reset(1,6,0);state.reset();runtime.initialize(clock,state,42609);clock.set_paused(true)
var enabled:Dictionary=runtime.enable_production_operations()
expect(enabled[&"ok"],"enable normal arrivals and daily closing from new game")
if not enabled[&"ok"]:runtime.free();clock.free();state.free();quit(failures);return
expect(runtime.submit_command(&"build_facility",{&"definition_id":&"chapel",&"origin":Vector3i(-6,0,0)}).is_success(),"construct chapel in normal operating game")
clock.advance_minutes(180)
for f:FacilityInstance in runtime.facility_service.get_instances():
if f.definition_id==&"chapel":facility_id=f.instance_id
expect(runtime.submit_command(&"hire_staff_candidate",{&"candidate_id":&"staff_uma"}).is_success(),"hire cleric in normal operating game")
expect(runtime.submit_command(&"set_staff_work_assignment",{&"staff_id":&"staff_uma",&"facility_id":facility_id,&"template_id":&"DAY"}).is_success(),"staff chapel in normal operating game")
clock.advance_minutes(1439-clock.absolute_minute)
var before_close:Dictionary=runtime.create_snapshot()
expect(runtime.restore_snapshot(before_close),"chapel23:59 operating state restores")
clock.advance_one_minute()
var first_day:Dictionary=runtime.operations_coordinator.get_day_summary(1)
expect(not first_day.is_empty() and first_day[&"category_totals"][&"maintenance"]==3,"first partial ownership day charges prorated chapel upkeep")
clock.advance_minutes(1439)
var second_close:Dictionary=runtime.create_snapshot()
expect(runtime.restore_snapshot(second_close),"second operating day saves before settlement")
clock.advance_one_minute()
var second_day:Dictionary=runtime.operations_coordinator.get_day_summary(2)
expect(not second_day.is_empty() and second_day[&"category_totals"][&"maintenance"]==6,"full ownership day charges approved6G chapel upkeep")
var all_sales:=0
for entry:LedgerEntry in runtime.economy_service.get_entries():
if entry.category==&"SERVICE_SALE" and entry.source_entity_id==facility_id:all_sales+=entry.amount
expect(all_sales>0 and all_sales==int(state.get_resource(&"faith"))*20 and runtime.progression_service.metrics[&"faith_lifetime"]==state.get_resource(&"faith"),"two-day natural operations reconcile donations with Faith and lifetime progress")
expect(runtime.economy_service.validate_ledger()[&"ok"] and not runtime.get_operations_report()[&"runtime_failure_latched"],"two-day chapel operation closes without ledger or runtime failure")
expect(runtime.restore_snapshot(runtime.create_snapshot()),"second chapel close restores without repeating settlement")
runtime.free();clock.free();state.free()
print("Chapel boundaries: %d checks, %d failures"%[checks,failures]);quit(failures)