diff options
Diffstat (limited to 'internal/game/casino_test.go')
| -rw-r--r-- | internal/game/casino_test.go | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/internal/game/casino_test.go b/internal/game/casino_test.go index b74baab..d7b5ae9 100644 --- a/internal/game/casino_test.go +++ b/internal/game/casino_test.go @@ -45,6 +45,66 @@ func TestExecuteBetRejectsInvalidMachineArgs(t *testing.T) { } } +func TestExecuteBetParsesBaccaratSpots(t *testing.T) { + g := &Game{Casino: casino.NewManager(1)} + cfg := casino.TableConfig{ID: "baccarat", Game: casino.GameBaccarat} + g.Casino.Join(1, cfg, "alice") + conn := &casinoTestConn{} + sess := &net.Session{Player: player.New("alice"), Conn: conn} + g.loggedInChars = map[string]*net.Session{"alice": sess} + // Valid spot syntaxes reach the table and fail only at the (empty) wallet. + for _, args := range [][]string{{"tie", "100"}, {"100", "tie"}, {"100", "on", "banker"}, {"banker", "100"}} { + conn.data = nil + g.executeBet(sess, args, "bet "+strings.Join(args, " ")) + if !strings.Contains(string(conn.data), "You don't have enough chips and credits") { + t.Fatalf("bet %v: expected wallet failure, got %q", args, string(conn.data)) + } + } + // Invalid spots are rejected by the table. + conn.data = nil + g.executeBet(sess, []string{"red", "100"}, "bet red 100") + if !strings.Contains(string(conn.data), "must be on player, banker, or tie") { + t.Fatalf("bet red 100: expected spot rejection, got %q", string(conn.data)) + } + // Two amounts or two spots are usage errors. + for _, args := range [][]string{{"10", "20"}, {"player", "banker"}} { + conn.data = nil + g.executeBet(sess, args, "bet "+strings.Join(args, " ")) + if !strings.Contains(string(conn.data), "Use bet,") { + t.Fatalf("bet %v: expected usage error, got %q", args, string(conn.data)) + } + } + // A bare first bet asks for a target (via the rebet path). + conn.data = nil + g.executeBet(sess, nil, "bet") + if !strings.Contains(string(conn.data), "Bet on what?") { + t.Fatalf("bare bet: expected target guidance, got %q", string(conn.data)) + } +} + +func TestRenderBaccaratSnapshot(t *testing.T) { + snapshot := &casino.BaccaratSnapshot{ + Player: []casino.CardView{{Rank: "5", Suit: "clubs"}, {Rank: "4", Suit: "hearts"}}, + Banker: []casino.CardView{{Rank: "2", Suit: "spades"}, {Rank: "3", Suit: "diamonds"}}, + PlayerScore: "9", + BankerScore: "5", + Bets: []casino.BaccaratBetView{{Name: "alice", Spot: "player", Amount: 100}}, + } + plain := renderBaccaratSnapshot(snapshot, "none", false, 5, "dark", nil) + if !strings.Contains(plain, "Player (9):") || !strings.Contains(plain, "Banker (5):") || !strings.Contains(plain, "alice bets 100 on player.") { + t.Fatalf("unexpected baccarat render: %q", plain) + } + output := renderBaccaratSnapshot(snapshot, "xterm256", true, 7, "dark", nil) + if !strings.Contains(output, "\033[38;5;") { + t.Fatalf("expected colored baccarat art: %q", output) + } + for _, line := range strings.Split(output, "\n") { + if color.VisibleLen(line) > 80 { + t.Fatalf("baccarat line exceeds console width: %d", color.VisibleLen(line)) + } + } +} + func TestRenderSlotSnapshotColorsWordSymbols(t *testing.T) { snapshot := &casino.SlotSnapshot{StoppedReels: 1} snapshot.Grid[0][0] = "scatter" @@ -67,8 +127,8 @@ func TestRenderSlotSnapshotColorsWordSymbols(t *testing.T) { func TestRenderBlackjackSnapshotUsesCompactASCIIArt(t *testing.T) { snapshot := &casino.BlackjackSnapshot{ - Dealer: []casino.BlackjackCardView{{Rank: "?", Hidden: true}, {Rank: "K", Suit: "hearts"}}, - Players: []casino.BlackjackPlayerView{{Name: "alice", Score: "20", Cards: []casino.BlackjackCardView{{Rank: "5", Suit: "clubs"}, {Rank: "Q", Suit: "spades"}}}}, + Dealer: []casino.CardView{{Rank: "?", Hidden: true}, {Rank: "K", Suit: "hearts"}}, + Players: []casino.BlackjackPlayerView{{Name: "alice", Score: "20", Cards: []casino.CardView{{Rank: "5", Suit: "clubs"}, {Rank: "Q", Suit: "spades"}}}}, } plain := renderBlackjackSnapshot(snapshot, "none", false, 5, "dark", nil) if !strings.Contains(plain, "+---+") || !strings.Contains(plain, "Dealer:") || !strings.Contains(plain, "alice (20):") { |
