Connect physical elevators and staff commutes to construction, saves, and cutaway UI
This commit is contained in:
@@ -52,16 +52,21 @@ func _run() -> void:
|
||||
return
|
||||
_expect(_command(&"hire_staff_candidate", {&"candidate_id": PORTER}), "hire the catalogue porter")
|
||||
_expect(_command(&"set_staff_work_assignment", {&"staff_id": PORTER, &"facility_id": _source, &"template_id": &"DAY"}), "assign porter to a repeating real shift")
|
||||
_expect(_worker().state == StaffRuntime.State.COMMUTING, "porter assignment begins a real warehouse commute")
|
||||
for minute in range(40):
|
||||
if _worker().state == StaffRuntime.State.AVAILABLE: break
|
||||
_clock.advance_minutes(1)
|
||||
_expect(_worker().state == StaffRuntime.State.AVAILABLE and StaffCommuteService.is_at_facility(_worker(), _runtime.facility_service.get_instance(_source)), "porter checks in physically before taking a supply job")
|
||||
_expect(_command(&"purchase_supplies", {&"warehouse_id": _source, &"item_id": SupplyCatalog.RAW_FOOD, &"quantity": 8}), "purchase the source stock through the ledger")
|
||||
_expect(_command(&"create_logistics_request", {&"request_id": REQUEST, &"source_inventory_id": _inventory(_source), &"destination_inventory_id": _inventory(_destination), &"item_requirements": {SupplyCatalog.RAW_FOOD: 8}}), "create the reserved supply request")
|
||||
_expect(_quantity(_inventory(_destination)) == 0, "request creation does not deliver anything")
|
||||
_test_manual_dispatch_boundary()
|
||||
_reserved = _runtime.create_snapshot()
|
||||
var check_in_cell := _worker().current_cell
|
||||
_clock.advance_minutes(1)
|
||||
_expect(_request().assigned_carrier_id == PORTER and _worker().current_cell.distance_to(Vector3i.ZERO) <= 1.0, "dispatcher selects the actual employee without teleporting")
|
||||
var start := _worker().current_cell
|
||||
_expect(_request().assigned_carrier_id == PORTER and _worker().current_cell.distance_to(check_in_cell) <= 1.0, "dispatcher selects the checked-in employee without teleporting")
|
||||
_wait_for(LogisticsRequest.State.DELIVERING, 40)
|
||||
_expect(_request().state == LogisticsRequest.State.DELIVERING and _worker().current_cell != start, "porter walks to the source before pickup")
|
||||
_expect(_request().state == LogisticsRequest.State.DELIVERING and _worker().current_cell.distance_to(check_in_cell) <= 1.0, "physical pickup starts delivery from the checked-in warehouse access without teleporting")
|
||||
if _request().state != LogisticsRequest.State.DELIVERING:
|
||||
_finish()
|
||||
return
|
||||
@@ -69,6 +74,7 @@ func _run() -> void:
|
||||
_expect(_crosslinks(), "loaded Request, Task, reservations and cargo agree")
|
||||
_loaded = _runtime.create_snapshot()
|
||||
_expect(_runtime.restore_snapshot(_loaded), "mid-delivery Runtime snapshot restores")
|
||||
_test_same_floor_access()
|
||||
_test_ownership_and_replay()
|
||||
_test_capacity_wait()
|
||||
_test_route_recovery()
|
||||
@@ -84,6 +90,13 @@ func _run() -> void:
|
||||
_finish()
|
||||
|
||||
|
||||
func _test_same_floor_access() -> void:
|
||||
var upper := FacilityInstance.new().configure(&"upper", &"warehouse", {&"origin": Vector3i(2, 1, 1), &"occupied_cells": [Vector3i(2, 1, 1)]})
|
||||
_expect(not SupplyLogisticsBridge._cell_touches_facility(Vector3i(2, 0, 1), upper), "goods cannot be picked up from the floor below a warehouse")
|
||||
_expect(SupplyLogisticsBridge._cell_touches_facility(Vector3i(1, 1, 1), upper), "same-floor doorway remains a valid transfer boundary")
|
||||
_expect(not _runtime.supply_logistics.find_facility_access_path(Vector3i(2, 0, 1), upper).get(&"reachable", false), "source access routing cannot substitute a corridor below the destination floor")
|
||||
|
||||
|
||||
func _test_ownership_and_replay() -> void:
|
||||
var owned := _owned_snapshot()
|
||||
var manual: CommandResult = _runtime.submit_command(&"advance_logistics_request", {&"request_id": REQUEST})
|
||||
|
||||
@@ -9,7 +9,7 @@ func _initialize() -> void:
|
||||
|
||||
|
||||
func _run() -> void:
|
||||
print("P1: Runtime v7 supply save migration")
|
||||
print("P1: Runtime v8 supply save migration")
|
||||
var source := _fixture(7301)
|
||||
var first := _fixture(7302)
|
||||
var second := _fixture(7303)
|
||||
@@ -19,28 +19,31 @@ func _run() -> void:
|
||||
source[&"clock"].advance_minutes(3)
|
||||
var canonical: Dictionary = source_runtime.create_snapshot()
|
||||
var canonical_data: Dictionary = canonical[&"systems"][&"runtime"]
|
||||
_expect(canonical_data[&"runtime_schema_version"] == 7, "current Runtime emits schema v7")
|
||||
_expect(canonical_data[&"runtime_schema_version"] == 8, "current Runtime emits schema v8")
|
||||
_expect(canonical_data[&"kitchen_production"][&"current_minute"] == source[&"clock"].absolute_minute, "production clock follows Runtime clock without existing kitchens")
|
||||
var legacy := canonical.duplicate(true)
|
||||
var legacy_data: Dictionary = legacy[&"systems"][&"runtime"]
|
||||
legacy_data[&"runtime_schema_version"] = 6
|
||||
legacy_data.erase(&"kitchen_production")
|
||||
legacy_data.erase(&"elevators")
|
||||
legacy_data[&"path"][&"schema_version"] = 3
|
||||
legacy_data[&"path"].erase(&"vertical_walk_blockers")
|
||||
_expect(legacy_data.has(&"facility_infrastructure") and legacy_data.has(&"route_projection"), "v6 fixture retains infrastructure introduced in v6")
|
||||
_expect(first_runtime.restore_snapshot(legacy), "genuine v6 state restores into v7")
|
||||
_expect(first_runtime.restore_snapshot(legacy), "genuine v6 state restores into v8")
|
||||
var migrated: Dictionary = first_runtime.create_snapshot()
|
||||
_expect(migrated[&"systems"][&"runtime"][&"runtime_schema_version"] == 7, "v6 migration re-emits current schema")
|
||||
_expect(migrated[&"systems"][&"runtime"][&"runtime_schema_version"] == 8, "v6 migration re-emits current schema")
|
||||
var kitchen: Dictionary = migrated[&"systems"][&"runtime"][&"kitchen_production"]
|
||||
_expect(kitchen[&"plans"].is_empty() and kitchen[&"active_batches"].is_empty(), "legacy migration does not infer kitchen production plans or batches")
|
||||
_expect(kitchen[&"current_minute"] == source[&"clock"].absolute_minute, "legacy production clock binds to the restored Runtime minute")
|
||||
_expect(migrated == canonical, "v6 migration preserves non-supply state exactly")
|
||||
_expect(second_runtime.restore_snapshot(legacy) and second_runtime.create_snapshot() == migrated, "v6 migration is deterministic across Runtime instances")
|
||||
_expect(first_runtime.restore_snapshot(migrated) and first_runtime.create_snapshot() == migrated, "canonical v7 round trip is exact")
|
||||
_expect(first_runtime.restore_snapshot(migrated) and first_runtime.create_snapshot() == migrated, "canonical v8 round trip is exact")
|
||||
var missing_supply := canonical.duplicate(true)
|
||||
missing_supply[&"systems"][&"runtime"].erase(&"kitchen_production")
|
||||
_expect(_rejects_atomically(first_runtime, missing_supply), "v7 cannot omit its supply aggregate")
|
||||
_expect(_rejects_atomically(first_runtime, missing_supply), "v8 cannot omit its supply aggregate")
|
||||
var relabelled := canonical.duplicate(true)
|
||||
relabelled[&"systems"][&"runtime"][&"runtime_schema_version"] = 6
|
||||
_expect(_rejects_atomically(first_runtime, relabelled), "relabelled v7 with retained kitchen state cannot masquerade as v6")
|
||||
_expect(_rejects_atomically(first_runtime, relabelled), "relabelled v8 with retained kitchen state cannot masquerade as v6")
|
||||
var bad_clock := canonical.duplicate(true)
|
||||
bad_clock[&"systems"][&"runtime"][&"kitchen_production"][&"current_minute"] -= 1
|
||||
_expect(_rejects_atomically(first_runtime, bad_clock), "production and Runtime clock disagreement is rejected")
|
||||
@@ -57,6 +60,9 @@ func _run() -> void:
|
||||
var orphaned: Dictionary = source_runtime.create_snapshot()
|
||||
orphaned[&"systems"][&"runtime"][&"runtime_schema_version"] = 6
|
||||
orphaned[&"systems"][&"runtime"].erase(&"kitchen_production")
|
||||
orphaned[&"systems"][&"runtime"].erase(&"elevators")
|
||||
orphaned[&"systems"][&"runtime"][&"path"][&"schema_version"] = 3
|
||||
orphaned[&"systems"][&"runtime"][&"path"].erase(&"vertical_walk_blockers")
|
||||
_expect(_rejects_atomically(first_runtime, orphaned), "legacy label cannot hide input holds for a discarded production batch")
|
||||
for fixture: Dictionary in [source, first, second]:
|
||||
fixture[&"runtime"].free()
|
||||
|
||||
Reference in New Issue
Block a user