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.
99 lines
6.0 KiB
GDScript
99 lines
6.0 KiB
GDScript
extends SceneTree
|
|
|
|
var _checks := 0
|
|
var _failures := 0
|
|
|
|
func _initialize() -> void:
|
|
call_deferred("_run")
|
|
|
|
func _run() -> void:
|
|
var service := OperationsCoordinator.new({&"start_minute": 360})
|
|
_bind(service, [-1, 0, -1, 1, -1, -1, -1], 0)
|
|
_expect(service.advance_to(1439).is_success() and service.get_day_summaries().is_empty(), "23:59 remains open")
|
|
var before_close := service.create_snapshot()
|
|
var boundary_restored := OperationsCoordinator.new()
|
|
_expect(boundary_restored.restore_snapshot(before_close), "23:59 save restores before the first close")
|
|
_bind(boundary_restored, [-1, 0, -1, 1, -1, -1, -1], 0)
|
|
boundary_restored.advance_to(1440)
|
|
_expect(service.advance_to(1440).is_success(), "first partial opening day closes at midnight")
|
|
_expect(boundary_restored.deterministic_digest() == service.deterministic_digest(), "save immediately before midnight closes and pays exactly once")
|
|
var legacy_open := before_close.duplicate(true)
|
|
legacy_open["schema_version"] = 3
|
|
legacy_open.erase("legacy_calendar_last_day")
|
|
legacy_open.erase("legacy_history_last_day")
|
|
var legacy_restored := OperationsCoordinator.new()
|
|
_expect(legacy_restored.restore_snapshot(legacy_open), "legacy save before its first close restores")
|
|
legacy_restored.advance_to(1500)
|
|
_expect(legacy_restored.get_day_summaries().is_empty(), "unclosed legacy first day is not retroactively settled at midnight")
|
|
legacy_restored.advance_to(1800)
|
|
_expect(legacy_restored.get_day_summary(1)[&"closed_at"] == 1800, "legacy first open day closes once at 06:00")
|
|
var day := service.get_day_summary(1)
|
|
_expect(day[&"closed_at"] == 1440 and day[&"period_start_minute"] == 0, "first day uses calendar midnight bounds")
|
|
_expect(service.get_consecutive_insolvency_count() == 1 and service.get_arrears_total() == 0, "a paid loss counts even without arrears")
|
|
service.advance_to(1800)
|
|
_expect(service.get_day_summaries().size() == 1 and not service.get_morning_report(2).is_empty(), "06:00 performs morning work without another close")
|
|
service.advance_to(2880)
|
|
_expect(service.get_consecutive_insolvency_count() == 0, "break-even resets loss streak")
|
|
service.advance_to(4320)
|
|
service.advance_to(5760)
|
|
_expect(service.get_consecutive_insolvency_count() == 0, "profit resets loss streak")
|
|
service.advance_to(8640)
|
|
var saved := service.create_snapshot()
|
|
var restored := OperationsCoordinator.new()
|
|
_expect(restored.restore_snapshot(saved), "two-loss snapshot restores")
|
|
var missing_alert := saved.duplicate(true)
|
|
missing_alert["alerts"].pop_back()
|
|
_expect(not restored.restore_snapshot(missing_alert) and restored.create_snapshot() == saved, "missing loss warning rejects atomically")
|
|
_bind(restored, [-1, 0, -1, 1, -1, -1, -1], 0)
|
|
service.advance_to(10200)
|
|
restored.advance_to(10200)
|
|
_expect(service.current_minute == 10080 and service.is_terminal(), "third loss stops a larger advance exactly at midnight")
|
|
_expect(service.deterministic_digest() == restored.deterministic_digest(), "save/load continuation preserves exact terminal outcome")
|
|
_expect(service.validate_invariants()[&"ok"], "loss history and terminal invariants reconcile")
|
|
var unpaid := OperationsCoordinator.new()
|
|
_bind(unpaid, [1, 1, 1, 1], 50)
|
|
unpaid.advance_to(5760)
|
|
_expect(not unpaid.is_terminal() and unpaid.get_consecutive_insolvency_count() == 0, "profitable closes with arrears never count as losses")
|
|
_expect(not unpaid.can_start_construction_or_investment()[&"allowed"], "unpaid wages still restrict new investment separately")
|
|
_test_legacy()
|
|
print("%s: %d checks" % ["PASS" if _failures == 0 else "FAIL", _checks])
|
|
quit(_failures)
|
|
|
|
func _test_legacy() -> void:
|
|
var old: Dictionary = str_to_var(FileAccess.get_file_as_string("res://tests/mvp/fixtures/operations_v3_0600.txt"))
|
|
var service := OperationsCoordinator.new()
|
|
_expect(service.restore_snapshot(old), "genuine pre-change v3 financial history restores")
|
|
_expect(service.get_day_summaries() == old["day_summaries"], "legacy closed financial records remain unchanged")
|
|
_expect(service.get_consecutive_insolvency_count() == 2, "historical unpaid streak remains auditable")
|
|
_bind(service, [-1, -1, -1, -1, -1], 0)
|
|
service.advance_to(4320)
|
|
_expect(service.get_day_summaries().size() == 2, "migration does not duplicate the still-open legacy day at midnight")
|
|
service.advance_to(4680)
|
|
_expect(service.get_day_summary(3)[&"period_start_minute"] == 3240 and service.get_consecutive_insolvency_count() == 1, "open legacy day closes once; new loss streak excludes old arrears count")
|
|
var snapshot := service.create_snapshot()
|
|
var restored := OperationsCoordinator.new()
|
|
_expect(restored.restore_snapshot(snapshot), "transition save restores")
|
|
_bind(restored, [-1, -1, -1, -1, -1], 0)
|
|
service.advance_to(5760)
|
|
restored.advance_to(5760)
|
|
_expect(service.get_day_summary(4)[&"period_start_minute"] == 4680 and service.get_day_summary(4)[&"closed_at"] == 5760, "18-hour transition has no gap or overlap")
|
|
_expect(service.deterministic_digest() == restored.deterministic_digest(), "migration replay is deterministic")
|
|
var before := restored.create_snapshot()
|
|
var bad := before.duplicate(true)
|
|
bad["legacy_calendar_last_day"] = 1
|
|
_expect(not restored.restore_snapshot(bad) and restored.create_snapshot() == before, "inconsistent transition marker rejects atomically")
|
|
service.advance_to(8000)
|
|
_expect(service.current_minute == 7200 and service.is_terminal() and service.validate_invariants()[&"ok"], "migrated save ends on three new losses at midnight")
|
|
|
|
func _bind(service: OperationsCoordinator, profits: Array, arrears: int) -> void:
|
|
service.configure_callbacks(func(payload: Dictionary, phase: StringName, token: Variant) -> Dictionary:
|
|
if phase != &"apply": return {&"ok": true, &"token": token}
|
|
var profit := int(profits[int(payload[&"day"]) - 1])
|
|
return {&"ok": true, &"category_totals": {&"revenue": 100 + profit, &"wages": 100}, &"facility_profit_loss": {}, &"anomalies": [], &"reconciliation_difference": 0, &"settlement": {&"arrears_total": arrears}})
|
|
|
|
func _expect(condition: bool, message: String) -> void:
|
|
_checks += 1
|
|
if not condition:
|
|
_failures += 1
|
|
push_error(message)
|