From 0fb83bdf433b9b48240f4ac7a5d4c912f6b808cc Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Sat, 3 Oct 2026 07:11:58 -0400 Subject: feat: added big 6 wheel to the casino --- .../game/hardening_shutdown_save_error_test.go | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'internal/game/hardening_shutdown_save_error_test.go') diff --git a/internal/game/hardening_shutdown_save_error_test.go b/internal/game/hardening_shutdown_save_error_test.go index c75f6fc..5842f9b 100644 --- a/internal/game/hardening_shutdown_save_error_test.go +++ b/internal/game/hardening_shutdown_save_error_test.go @@ -7,10 +7,59 @@ package game import ( "os" "path/filepath" + "reflect" "strings" "testing" + "time" + + "thehouseoficarus/internal/player" ) +func TestShutdownPreservesOnlineLocationAndExploration(t *testing.T) { + h := newHarness(t) + h.seedAccount("alice") + p := h.seedCharacter("alice", "alice") + p.RoomID = 6101 + p.Stats.RecordRoomVisit(6101) + if err := h.g.AccountStore.SaveCharacter(p); err != nil { + t.Fatal(err) + } + sess, _ := h.connect("alice") + wantRooms := []int{6101, 6182, 6183, 6199} + h.g.RunOnOwner(func() { + sess.Player.RoomID = 6199 + for _, id := range wantRooms { + sess.Player.Stats.RecordRoomVisit(id) + } + }) + // Deliberately leave disk at the older state. The signal shutdown path + // must persist the connected character before closing the transport, + // without requiring the player to quit or disconnect first. + var saved *player.Player + var loadErr error + h.g.SetTransportStop(func() { + saved, loadErr = player.NewAccountStore(h.dir).LoadCharacter("alice") + }) + h.g.RequestShutdown("signal") + select { + case <-h.g.ShutdownDone(): + case <-time.After(5 * time.Second): + t.Fatal("shutdown did not finish") + } + if err := h.g.ShutdownSaveError(); err != nil { + t.Fatal(err) + } + if loadErr != nil { + t.Fatal(loadErr) + } + if saved == nil { + t.Fatal("transport stop was not called") + } + if saved.RoomID != 6199 || !reflect.DeepEqual(saved.Stats.RoomsVisited.Keys(), wantRooms) { + t.Fatalf("shutdown lost progress: room=%d explored=%v", saved.RoomID, saved.Stats.RoomsVisited.Keys()) + } +} + // TestShutdownSaveErrorReportsFailedFinalSave makes the character save fail // (the character file is replaced by a directory, so the atomic replace cannot // land) and requires the shutdown sequence to record the failure on the Game. -- cgit v1.2.3