aboutsummaryrefslogtreecommitdiff
path: root/internal/casino/manager_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/casino/manager_test.go')
-rw-r--r--internal/casino/manager_test.go103
1 files changed, 103 insertions, 0 deletions
diff --git a/internal/casino/manager_test.go b/internal/casino/manager_test.go
new file mode 100644
index 0000000..245133d
--- /dev/null
+++ b/internal/casino/manager_test.go
@@ -0,0 +1,103 @@
+package casino
+
+import "testing"
+
+type testWallet struct {
+ chips, credits, paid int
+}
+
+func (w *testWallet) Wager(amount int) (Wager, bool) {
+ if w.chips+w.credits < amount {
+ return Wager{}, false
+ }
+ chips := amount
+ if chips > w.chips {
+ chips = w.chips
+ }
+ w.chips -= chips
+ credits := amount - chips
+ w.credits -= credits
+ return Wager{Total: amount, Chips: chips, Credits: credits}, true
+}
+
+func (w *testWallet) PayCredits(amount int) {
+ w.paid += amount
+}
+
+func TestMixedWagerUsesChipsFirst(t *testing.T) {
+ w := &testWallet{chips: 7, credits: 50}
+ wager, ok := w.Wager(12)
+ if !ok || wager.Chips != 7 || wager.Credits != 5 || w.chips != 0 || w.credits != 45 {
+ t.Fatalf("unexpected wager: %+v wallet=%+v", wager, w)
+ }
+}
+
+func TestSoloBetResolvesImmediately(t *testing.T) {
+ m := NewManager(1)
+ cfg := TableConfig{ID: "slots", Game: GameSlots}
+ m.Join(1, cfg, "alice")
+ w := &testWallet{credits: 100}
+ events := m.Bet(1, "slots", "alice", 10, w)
+ found := false
+ for _, event := range events {
+ if event.Type == EventRoundStarted {
+ found = true
+ }
+ }
+ if !found {
+ t.Fatal("solo bet did not resolve immediately")
+ }
+}
+
+func TestMultiplePlayersWaitForBets(t *testing.T) {
+ m := NewManager(1)
+ cfg := TableConfig{ID: "slots", Game: GameSlots, BettingTicks: 2}
+ m.Join(1, cfg, "alice")
+ m.Join(1, cfg, "bob")
+ wa, wb := &testWallet{credits: 100}, &testWallet{credits: 100}
+ events := m.Bet(1, "slots", "alice", 10, wa)
+ for _, event := range events {
+ if event.Type == EventRoundStarted {
+ t.Fatal("round started before all players bet or timeout")
+ }
+ }
+ m.Bet(1, "slots", "bob", 10, wb)
+}
+
+func TestMachineAutobetCountdownAndStop(t *testing.T) {
+ m := NewManager(1)
+ cfg := MachineConfig{ID: "slots", Game: GameSlots, SpinTicks: 1}
+ m.JoinMachine(1, cfg, "alice")
+ m.SetMachineBet(1, "slots", "alice", 10)
+ w := &testWallet{credits: 100}
+ if events := m.EnableMachineAutoBet(1, "slots", "alice", w); len(events) != 0 {
+ t.Fatalf("enabling autobet emitted events before countdown: %+v", events)
+ }
+ for i, want := range []string{"Autobet enabled!", `Type "stop" to stop playing`, "Betting... 10 credits."} {
+ events := m.Tick()
+ if len(events) == 0 || eventText(events) != want {
+ t.Fatalf("tick %d message=%q events=%+v, want %q", i+1, eventText(events), events, want)
+ }
+ }
+ if !m.MachineBusy("alice") {
+ t.Fatal("autobet did not start a spin after countdown")
+ }
+ if events, stopped := m.StopMachineAutoBet(1, "slots", "alice"); !stopped || len(events) != 1 {
+ t.Fatalf("stop autobet events=%+v stopped=%v", events, stopped)
+ }
+ if _, playing := m.MachineFor("alice"); !playing {
+ t.Fatal("stopping autobet removed the player from the machine")
+ }
+}
+
+func eventText(events []Event) string {
+ for _, event := range events {
+ if event.PrivateMessage != "" {
+ return event.PrivateMessage
+ }
+ if event.Message != "" {
+ return event.Message
+ }
+ }
+ return ""
+}