aboutsummaryrefslogtreecommitdiff
path: root/internal/game/casino_test.go
diff options
context:
space:
mode:
authorhistoria <[not public]>2026-08-03 16:18:17 -0400
committerhistoria <[not public]>2026-08-03 16:19:25 -0400
commitf2c4a58727169a03b8102704888d1579d26b28c8 (patch)
treea334f9cd37b3c7521c11d266d797b208dac4f3be /internal/game/casino_test.go
parent612e429de438821ae8e099d6b54f87c11ff6c1b5 (diff)
downloadthehouseoficarus-f2c4a58727169a03b8102704888d1579d26b28c8.tar.gz
feat: multiplayer baccarat game
Diffstat (limited to 'internal/game/casino_test.go')
-rw-r--r--internal/game/casino_test.go64
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):") {