From b3568f03e4103dd46db2ccc680fbab0a6454d604 Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Tue, 15 Sep 2026 13:56:10 -0400 Subject: fix: telnet buffer reuse, bank stack handling, transport casino gate, and admin cache invalidation --- internal/casino/machine_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'internal/casino/machine_test.go') diff --git a/internal/casino/machine_test.go b/internal/casino/machine_test.go index 53fe2e6..349a452 100644 --- a/internal/casino/machine_test.go +++ b/internal/casino/machine_test.go @@ -113,3 +113,34 @@ func TestMachineDisconnectFreesSeatAndForfeitsSpin(t *testing.T) { t.Fatalf("empty machine emitted events after disconnect: %+v", events) } } + +func TestMachineFreeSpinsDoNotRetrigger(t *testing.T) { + m := newMachine(1, MachineConfig{ID: "slots", Game: GameSlots}, rand.New(rand.NewSource(7))) + m.player = &Participant{Name: "alice", Connected: true, Wallet: &testWallet{credits: 100}} + m.spinBet = 10 + m.inFreeSpins = true + m.freeSpins = 1 + m.spin = &SlotSpin{ScatterCount: 3} + events := m.finishSpin() + for _, e := range events { + if hasMessage([]Event{e}, "trigger") { + t.Fatalf("scatters during free spins retriggered: %+v", events) + } + } + // The last free spin resolved; the feature is now over. + m.spin = &SlotSpin{ScatterCount: 3} + m.finishSpin() + if m.freeSpins != 0 || m.inFreeSpins { + t.Fatalf("free-spin feature did not end: freeSpins=%d inFreeSpins=%v", m.freeSpins, m.inFreeSpins) + } + // Scatters on a paid spin trigger normally again. + m.phase = machineReady + m.spin = &SlotSpin{ScatterCount: 3} + events = m.finishSpin() + if m.freeSpins != m.profile.FreeSpinCount-1 || !m.inFreeSpins { + t.Fatalf("paid-spin trigger broken: freeSpins=%d inFreeSpins=%v", m.freeSpins, m.inFreeSpins) + } + if !hasMessage(events, "trigger") { + t.Fatalf("missing trigger message: %+v", events) + } +} -- cgit v1.2.3