aboutsummaryrefslogtreecommitdiff
path: root/internal/casino/casino_review_regression_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/casino/casino_review_regression_test.go')
-rw-r--r--internal/casino/casino_review_regression_test.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/internal/casino/casino_review_regression_test.go b/internal/casino/casino_review_regression_test.go
new file mode 100644
index 0000000..8860bd7
--- /dev/null
+++ b/internal/casino/casino_review_regression_test.go
@@ -0,0 +1,89 @@
+package casino
+
+import (
+ "reflect"
+ "strings"
+ "testing"
+)
+
+func TestCrapsRoundedOddsRespectTableMaximum(t *testing.T) {
+ for _, kind := range []string{"pass", "dontpass"} {
+ t.Run(kind, func(t *testing.T) {
+ table := crapsFixture()
+ table.Config.MaxBet = 11
+ table.join("a")
+ w := &testWallet{chips: 100}
+ table.bet("a", kind, 10, w)
+ table.resolveRoll(3, 3)
+ // Eleven rounds to 15 for pass odds, or 12 for don't odds.
+ events := table.bet("a", "odds "+kind, 11, w)
+ if !hasMessage(events, "above the table maximum") || len(w.open) != 1 || table.players.get("a").bets[0].odds.Total != 0 {
+ t.Fatalf("rounded odds bypassed maximum: %+v", events)
+ }
+ })
+ }
+}
+
+func TestCrapsFailedUnbetPreservesAllLiveWagers(t *testing.T) {
+ for _, retry := range []bool{false, true} {
+ t.Run(map[bool]string{false: "roll", true: "retry"}[retry], func(t *testing.T) {
+ table := crapsFixture()
+ table.join("a")
+ w := &pokerTestWallet{testWallet: testWallet{chips: 1000}}
+ table.bet("a", "pass", 10, w)
+ table.resolveRoll(3, 3)
+ table.bet("a", "odds pass", 10, w)
+ table.bet("a", "place 8", 12, w)
+ before := table.view().Bets
+ w.fail = true
+ events := table.action("a", "unbet")
+ if !hasMessage(events, "All wagers remain live") || !reflect.DeepEqual(before, table.view().Bets) || len(w.open) != 3 || !table.players.get("a").HasBet {
+ t.Fatalf("failed refund changed live wagers: %+v", events)
+ }
+ w.fail = false
+ if retry {
+ table.action("a", "unbet")
+ table.action("a", "unbet")
+ if w.paid != 22 || len(w.open) != 1 || table.players.get("a").bets[0].odds.Total != 0 {
+ t.Fatalf("refund retry was not exact: %+v", w)
+ }
+ } else {
+ table.resolveRoll(3, 3)
+ if w.paid != 42 || len(w.open) != 1 {
+ t.Fatalf("preserved pass/odds failed to settle: %+v", w)
+ }
+ }
+ })
+ }
+}
+
+func TestPokerPreparationClearsPreviousBonusPresentation(t *testing.T) {
+ for _, command := range []string{"coins", "coins 1", "unbet", "denom 10", "hands 5", "game ddb", "feature off"} {
+ t.Run(command, func(t *testing.T) {
+ table, w, _ := pokerTestCabinet(t, VideoPokerConfig{Cabinet: CabinetHotRoll})
+ pokerDeal(t, table, w)
+ table.action("alice", "draw")
+ p := table.players["alice"]
+ p.multiplier, p.dice = 12, [2]int{6, 6}
+ p.loaded = 5
+ events := table.action("alice", command)
+ snap, ok := events[0].Snapshot.(*VideoPokerSnapshot)
+ if !ok {
+ t.Fatalf("command rejected: %+v", events)
+ }
+ if snap.Multiplier != 1 || snap.Dice != [2]int{} || snap.NoWin || snap.Held != [5]bool{} || len(snap.Cards) != 0 || len(snap.Lines) != 0 || len(snap.Current) != 0 {
+ t.Fatalf("stale result after %s: %+v", command, snap)
+ }
+ if len(w.open) != 0 {
+ t.Fatal("preparation created a wager")
+ }
+ })
+ }
+}
+
+func TestBonusPokerDeluxeRuleDescribesFlatQuadAward(t *testing.T) {
+ cfg := (VideoPokerConfig{Variant: "bonus_poker_deluxe"}).Normalize()
+ if rule := cfg.PairRule(); !strings.Contains(rule, "80 per coin") || strings.Contains(rule, "by rank") {
+ t.Fatalf("incorrect Deluxe rule: %s", rule)
+ }
+}