aboutsummaryrefslogtreecommitdiff
path: root/internal/game/casino_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/game/casino_test.go')
-rw-r--r--internal/game/casino_test.go80
1 files changed, 80 insertions, 0 deletions
diff --git a/internal/game/casino_test.go b/internal/game/casino_test.go
index b2b37c4..b74baab 100644
--- a/internal/game/casino_test.go
+++ b/internal/game/casino_test.go
@@ -6,8 +6,45 @@ import (
"thehouseoficarus/internal/casino"
"thehouseoficarus/internal/color"
+ "thehouseoficarus/internal/net"
+ "thehouseoficarus/internal/player"
)
+type casinoTestConn struct {
+ data []byte
+}
+
+func (c *casinoTestConn) ReadMessage() (string, error) { return "", nil }
+func (c *casinoTestConn) Write(b []byte) (int, error) {
+ c.data = append(c.data, b...)
+ return len(b), nil
+}
+func (c *casinoTestConn) Close() error { return nil }
+func (c *casinoTestConn) SetEcho(bool) error { return nil }
+
+func TestExecuteBetRejectsInvalidMachineArgs(t *testing.T) {
+ g := &Game{Casino: casino.NewManager(1)}
+ cfg := casino.MachineConfig{ID: "slots", Game: casino.GameSlots}
+ g.Casino.JoinMachine(1, cfg, "alice")
+ conn := &casinoTestConn{}
+ sess := &net.Session{Player: player.New("alice"), Conn: conn}
+ g.loggedInChars = map[string]*net.Session{"alice": sess}
+ for _, args := range [][]string{{"banana"}, {"-5"}, {"10", "extra"}} {
+ conn.data = nil
+ g.executeBet(sess, args, "bet "+strings.Join(args, " "))
+ if !strings.Contains(string(conn.data), "Use bet, bet <amount>, or bet max.") {
+ t.Fatalf("bet %v: expected usage error, got %q", args, string(conn.data))
+ }
+ }
+ // A bare bet at a machine reaches the spin path instead of erroring.
+ g.Casino.SetMachineBet(1, "slots", "alice", 10)
+ conn.data = nil
+ g.executeBet(sess, nil, "bet")
+ if !strings.Contains(string(conn.data), "You don't have enough chips and credits") {
+ t.Fatalf("bare bet should attempt a spin, got %q", string(conn.data))
+ }
+}
+
func TestRenderSlotSnapshotColorsWordSymbols(t *testing.T) {
snapshot := &casino.SlotSnapshot{StoppedReels: 1}
snapshot.Grid[0][0] = "scatter"
@@ -27,3 +64,46 @@ func TestRenderSlotSnapshotColorsWordSymbols(t *testing.T) {
t.Fatalf("slot output lacks the Unicode frame: %q", output)
}
}
+
+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"}}}},
+ }
+ plain := renderBlackjackSnapshot(snapshot, "none", false, 5, "dark", nil)
+ if !strings.Contains(plain, "+---+") || !strings.Contains(plain, "Dealer:") || !strings.Contains(plain, "alice (20):") {
+ t.Fatalf("unexpected blackjack art: %q", plain)
+ }
+ output := renderBlackjackSnapshot(snapshot, "xterm256", false, 5, "dark", nil)
+ if !strings.Contains(output, "\033[38;5;") {
+ t.Fatalf("expected colored blackjack art: %q", output)
+ }
+ if strings.ContainsAny(output, "│─┌┐└┘") {
+ t.Fatalf("blackjack art contains Unicode borders: %q", output)
+ }
+ for _, line := range strings.Split(output, "\n") {
+ if color.VisibleLen(line) > 80 {
+ t.Fatalf("blackjack line exceeds console width: %d", color.VisibleLen(line))
+ }
+ }
+ unicodeOutput := renderBlackjackSnapshot(snapshot, "none", true, 7, "dark", nil)
+ if !strings.Contains(unicodeOutput, "│5 │") || !strings.Contains(unicodeOutput, "│ 5│") || !strings.Contains(unicodeOutput, "│ ♣ │") {
+ t.Fatalf("unexpected Unicode card alignment: %q", unicodeOutput)
+ }
+ coloredUnicode := renderBlackjackSnapshot(snapshot, "xterm256", true, 7, "dark", nil)
+ if !strings.Contains(coloredUnicode, "\033[38;5;15m") || !strings.Contains(coloredUnicode, "\033[38;5;27m") {
+ t.Fatalf("expected white borders and blue card art: %q", coloredUnicode)
+ }
+ light := renderBlackjackSnapshot(snapshot, "xterm256", true, 7, "light", nil)
+ if !strings.Contains(light, "\033[48;5;15m") {
+ t.Fatalf("expected white card background in light style: %q", light)
+ }
+ lightLines := strings.Split(light, "\n")
+ if strings.Contains(lightLines[1], "\033[48;5;15m") || strings.Contains(lightLines[7], "\033[48;5;15m") {
+ t.Fatalf("card edges should not have a background: %q", light)
+ }
+ lightPlain := renderBlackjackSnapshot(snapshot, "none", true, 7, "light", nil)
+ if !strings.Contains(lightPlain, "▀▀▀▀▀▀▀") || !strings.Contains(lightPlain, "▄▄▄▄▄▄▄") {
+ t.Fatalf("expected half-height light card edges: %q", lightPlain)
+ }
+}