extends SceneTree const Preview = preload("res://scripts/construction/facility_resize_preview.gd") var checks := 0 var failures := 0 func expect(ok: bool, message: String) -> void: checks += 1 if not ok: failures += 1; push_error(message) func _initialize() -> void: var world := WorldService.new() world.reset({&"min_x":-10,&"max_x":10,&"min_y":-5,&"max_y":10}) var origin := Vector3i(0,0,0) var cells := world.cells_for_footprint(origin,Vector2i(3,2)) world.occupy(&"room",cells) world.set_support(origin,0,true) var item := {&"instance_id":&"room",&"definition_id":&"premium_room",&"origin":origin,&"rotation":0,&"occupied_cells":cells} var before := world.create_snapshot() var report := Preview.inspect(world,item,2) expect(report[&"geometry_ok"] and report[&"target_cells"].size()==4 and report[&"added"].size()==1 and report[&"removed"].size()==3, "premium room preview changes 3x2 into 4x1") expect(not report[&"ready_to_apply"] and not report[&"remaining_gates"].is_empty(), "geometry success never bypasses route save or job migration") expect(world.create_snapshot()==before, "successful preview does not mutate live world") world.occupy(&"neighbor",[Vector3i(3,0,0)]) before=world.create_snapshot();report=Preview.inspect(world,item,2) expect(not report[&"geometry_ok"] and report[&"errors"][0][&"code"]==&"OVERLAP", "expansion detects an occupied new cell") expect(world.create_snapshot()==before, "rejected preview preserves ownership and revisions") world.release(&"neighbor") world.occupy(&"upper",[Vector3i(2,2,0)]) report=Preview.inspect(world,item,2) expect(not report[&"geometry_ok"] and &"upper" in report[&"affected_entities"], "shrink detects loss of support for upper facility") var bad:=item.duplicate(true);bad[&"occupied_cells"][0]=Vector3i(9,9,0) expect(not Preview.inspect(world,bad,2)[&"geometry_ok"], "source ownership cannot be guessed from current definition") bad=item.duplicate(true);bad[&"occupied_cells"][1]=bad[&"occupied_cells"][0] expect(not Preview.inspect(world,bad,2)[&"geometry_ok"], "duplicate saved cells reject") bad=item.duplicate(true);bad[&"instance_id"]=42 expect(not Preview.inspect(world,bad,2)[&"geometry_ok"], "malformed saved identifiers reject without conversion errors") bad=item.duplicate(true);bad[&"rotation"]=45 expect(not Preview.inspect(world,bad,2)[&"geometry_ok"], "invalid rotation rejects") world.release(&"upper");world.release(&"room") origin=Vector3i(0,0,1);cells=world.cells_for_footprint(origin,Vector2i(2,4)) world.occupy(&"dorm",cells);world.set_support(origin,0,true) item={&"instance_id":&"dorm",&"definition_id":&"staff_dormitory",&"origin":origin,&"rotation":90,&"occupied_cells":cells} report=Preview.inspect(world,item,1) expect(report[&"geometry_ok"] and report[&"target_cells"]==[Vector3i(0,0,1),Vector3i(0,1,1)], "rotated dorm shrinks on correct layer and axis") world.release(&"dorm") origin=Vector3i(7,-3,0);cells=world.cells_for_footprint(origin,Vector2i(3,2)) world.occupy(&"market",cells);world.set_support(origin,0,true) for cell: Vector3i in cells: world.set_excavated(cell,true) item={&"instance_id":&"market",&"definition_id":&"black_market",&"origin":origin,&"rotation":0,&"occupied_cells":cells} before=world.create_snapshot();report=Preview.inspect(world,item,2) expect(not report[&"geometry_ok"] and world.create_snapshot()==before, "market cannot expand into unexcavated underground space") world.set_excavated(Vector3i(10,-3,0),true);world.set_excavated(Vector3i(10,-2,0),true) report=Preview.inspect(world,item,2) expect(report[&"geometry_ok"] and report[&"target_cells"].size()==8 and report[&"added"].size()==2, "excavated market expands to original four-by-two footprint") world.release(&"market") origin=Vector3i(8,-3,0);cells=world.cells_for_footprint(origin,Vector2i(3,2)) world.occupy(&"edge",cells);world.set_support(origin,0,true) item={&"instance_id":&"edge",&"definition_id":&"black_market",&"origin":origin,&"rotation":0,&"occupied_cells":cells} expect(not Preview.inspect(world,item,2)[&"geometry_ok"], "market expansion cannot leave map bounds") print("Facility resize preview: %d checks, %d failures" % [checks,failures]);quit(failures)