Files
TheTree_mock/tests/ui/test_original_build_pointer.gd
T
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

167 lines
9.4 KiB
GDScript

extends SceneTree
# Exercise viewport GUI hit testing; do not emit button signals or call map handlers.
var checks := 0
var failures := 0
var main: Control
var runtime: Variant
var clock: Variant
func expect(ok: bool, message: String) -> void:
checks += 1
if not ok:
failures += 1
push_error(message)
func _initialize() -> void: call_deferred("run")
func click_at(point: Vector2) -> void:
var motion := InputEventMouseMotion.new()
motion.position = point
motion.global_position = point
root.push_input(motion, true)
for pressed: bool in [true, false]:
var event := InputEventMouseButton.new()
event.position = point
event.global_position = point
event.button_index = MOUSE_BUTTON_LEFT
event.pressed = pressed
event.button_mask = MOUSE_BUTTON_MASK_LEFT if pressed else 0
root.push_input(event, true)
await process_frame
func run() -> void:
runtime = root.get_node("SimulationRuntime")
clock = root.get_node("GameClock")
var state: Variant = root.get_node("GameState")
clock.reset(1,6,0);state.reset();runtime.initialize(clock,state,42508);clock.set_paused(true)
root.size = Vector2i(1440,810)
main = load("res://scenes/main/main.tscn").instantiate()
main.set("manual_save_path", "user://tests/build_pointer_%d" % Time.get_ticks_usec())
root.add_child(main)
runtime.configure_save_policy({&"enabled":false, &"daily_checkpoint_enabled":false})
await process_frame;await process_frame
await click_at((main.get("palette_toggle_button") as Button).get_global_rect().get_center())
expect(main.get("palette_scroll").visible, "viewport click opens construction palette")
for item: Dictionary in [
{&"id": &"reception", &"cell": Vector3i(-6,0,0), &"cells":8},
{&"id": &"premium_room", &"cell": Vector3i(-6,2,0), &"cells":4},
{&"id": &"guest_stairs", &"cell": Vector3i(-7,1,0), &"cells":1},
{&"id": &"guest_stairs", &"cell": Vector3i(-7,2,0), &"cells":1},
]:
var button: Button = main.get("build_buttons")[item[&"id"]]
var scroll: ScrollContainer = main.get("palette_scroll")
for attempt in 8:
if scroll.get_global_rect().has_point(button.get_global_rect().get_center()): break
var bar := scroll.get_h_scroll_bar()
await click_at(bar.global_position + Vector2(bar.size.x-3,bar.size.y/2))
# Clicking an already selected toggle would deselect the tool.
if not button.button_pressed: await click_at(button.get_global_rect().get_center())
expect(main.get("_selected_definition_id") == item[&"id"], "viewport click selects %s" % item[&"id"])
var preview: WorldPreview = main.get("world_preview")
var point := preview.global_position + preview.cell_to_canvas(item[&"cell"])
expect(preview.get_global_rect().has_point(point), "placement target is visible")
var before: int = runtime.construction_service.get_jobs().size()
await click_at(point)
expect(runtime.construction_service.get_jobs().size() == before+1, "viewport placement creates exactly one %s job" % item[&"id"])
if runtime.construction_service.get_jobs().size() != before+1:
print("Placement diagnostic: ", main.get("build_status_label").text)
finish();return
if item[&"id"] == &"premium_room":
expect((main.find_child("InnOpeningGuide", true, false) as InnOpeningGuide).get_progress()[&"action"] == &"resume", "guide recognizes premium construction in progress")
clock.advance_minutes(runtime.definition_registry.get_facility(item[&"id"]).build_minutes)
var found := false
for room: Dictionary in runtime.construction_service.get_facilities():
if room[&"definition_id"] == item[&"id"] and room[&"origin"] == item[&"cell"]: found = room[&"occupied_cells"].size() == item[&"cells"]
expect(found, "clicked construction completes with original geometry")
expect((main.find_child("InnOpeningGuide", true, false) as InnOpeningGuide).get_progress()[&"stage"] == &"staff", "premium room advances opening guide to staff instead of requesting a standard room")
await operate_day()
if OS.get_environment("THE_TREE_POINTER_CAPTURE") == "1":
await process_frame;await RenderingServer.frame_post_draw
expect(root.get_texture().get_image().save_png(ProjectSettings.globalize_path("res://artifacts/facility-dimensions-2026-09-29/original-pointer.png")) == OK, "capture viewport-built room")
finish()
func finish() -> void:
SaveService.delete_save(main.get("manual_save_path"))
main.queue_free()
print("Original build viewport input: %d checks, %d failures" % [checks,failures])
quit(failures)
func press_key(code: Key, target: Window = root) -> void:
for pressed: bool in [true,false]:
var event := InputEventKey.new()
event.keycode = code
event.physical_keycode = code
event.window_id = target.get_window_id()
event.pressed = pressed
Input.parse_input_event(event)
await process_frame
func operate_day() -> void:
await press_key(KEY_ESCAPE)
await press_key(KEY_H)
var hire: Button = main.get("staff_candidate_buttons")[&"staff_akane"]
await click_at(hire.get_global_rect().get_center())
var staff: Array = runtime.staff_service.get_staff_members()
expect(staff.size() == 1, "pointer hires ordinary receptionist from candidates")
if staff.is_empty(): return
await click_at((main.get("staff_management_toggle_button") as Button).get_global_rect().get_center())
var panel: StaffManagementPanel = main.get("staff_management_panel")
await click_at((panel.roster_buttons[staff[0].staff_id] as Button).get_global_rect().get_center())
var reception_id: StringName = &""
var room_id: StringName = &""
for room: FacilityInstance in runtime.facility_service.get_instances():
if room.definition_id == &"reception": reception_id = room.instance_id
if room.definition_id == &"premium_room": room_id = room.instance_id
var option_index := -1
for i in panel.facility_option.item_count:
if StringName(panel.facility_option.get_item_metadata(i)) == reception_id: option_index = i
expect(option_index >= 0, "reception appears in assignment options")
if option_index < 0: return
await click_at(panel.facility_option.get_global_rect().get_center())
var popup := panel.facility_option.get_popup()
await press_key(KEY_HOME, popup)
for attempt in panel.facility_option.item_count + 1:
if popup.get_focused_item() == option_index: break
await press_key(KEY_DOWN, popup)
await press_key(KEY_ENTER, popup)
await click_at(panel.apply_button.get_global_rect().get_center())
clock.advance_minutes(2)
expect(runtime.staff_service.get_staff(staff[0].staff_id).assigned_facility_id == reception_id, "pointer/dropdown keyboard assigns receptionist")
print("ASSIGNMENT_UI selected=",panel.facility_option.selected," expected=",option_index," result=",panel.result_label.text," popup=",popup.visible)
if runtime.staff_service.get_staff(staff[0].staff_id).assigned_facility_id != reception_id: return
await press_key(KEY_ESCAPE)
expect(runtime.get_facility_access_report(room_id)[&"reachable"], "clicked stairs connect the premium room")
while clock.absolute_minute < 1440:
var before: int = clock.absolute_minute
clock.advance_minutes(mini(30,1440-clock.absolute_minute))
if clock.absolute_minute == before:
expect(false, "ordinary clock did not advance: %s" % runtime.get_operations_report());return
if clock.absolute_minute % 120 == 52: print("PREMIUM_DAY minute=",clock.absolute_minute)
await process_frame
var sales := 0
for entry: LedgerEntry in runtime.economy_service.get_entries():
if entry.category == &"SERVICE_SALE" and entry.source_entity_id == room_id: sales += entry.amount
expect(sales > 0, "natural arrivals complete paid premium lodging before first midnight")
expect(runtime.operations_coordinator.get_day_summaries().size() == 1 and runtime.economy_service.validate_ledger()[&"ok"], "natural premium day closes with balanced ledger")
expect((main.find_child("InnOpeningGuide", true, false) as InnOpeningGuide).get_progress()[&"stage"] == &"complete", "premium revenue and midnight close complete the opening guide")
print("PREMIUM_POINTER_DAY sales=", sales, " minute=", clock.absolute_minute)
# Close the daily ledger before clicking the ordinary save control.
await press_key(KEY_ESCAPE)
for button: Node in main.find_children("*", "Button", true, false):
if button.text == "保存":
await click_at(button.get_global_rect().get_center())
break
var saved: Dictionary = SaveService.load_snapshot(main.get("manual_save_path"))
expect(saved[&"ok"], "pointer saves normal premium-day progress")
if saved[&"ok"]:
clock.advance_minutes(2)
await click_at((main.find_child("SaveLoadMenu",true,false) as MenuButton).get_global_rect().get_center())
var load_popup := (main.find_child("SaveLoadMenu",true,false) as MenuButton).get_popup()
await press_key(KEY_HOME,load_popup)
await press_key(KEY_ENTER,load_popup)
expect(clock.absolute_minute == 1440, "load-menu input restores saved day boundary")
expect((main.find_child("InnOpeningGuide", true, false) as InnOpeningGuide).get_progress()[&"stage"] == &"complete", "load preserves completed premium opening guidance")
var loaded: Dictionary = runtime.create_snapshot()
for section: StringName in [&"facilities", &"economy", &"guests", &"staff", &"construction"]:
expect(loaded[&"systems"][&"runtime"][section] == saved[&"snapshot"][&"systems"][&"runtime"][section], "load-menu input restores %s state" % section)
clock.advance_minutes(30)
var continued: Dictionary = runtime.create_snapshot()
expect(runtime.restore_snapshot(loaded), "loaded next-day state can be replayed")
clock.advance_minutes(30)
expect(runtime.create_snapshot() == continued, "loaded inn continues thirty minutes with deterministic guest/staff/economy replay")