Files
TheTree_mock/tests/mvp/test_original_midnight_settlement.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

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)