aboutsummaryrefslogtreecommitdiff
path: root/internal/game/roulette_test.go
blob: 95377101e6df692f8a2498a73d4fd694691995b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package game

import (
	"strings"
	"testing"

	"thehouseoficarus/internal/casino"
	"thehouseoficarus/internal/net"
	"thehouseoficarus/internal/player"
)

func TestRouletteNumericTargetsAndRendering(t *testing.T) {
	for _, double := range []bool{false, true} {
		g := &Game{Casino: casino.NewManager(1)}
		cfg := casino.TableConfig{ID: "roulette", Game: casino.GameRoulette, Roulette: casino.RouletteConfig{DoubleZero: double}}
		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}
		for _, target := range []string{"0", "17", "00", "red", "column2"} {
			conn.data = nil
			g.executeBet(sess, []string{"10", "on", target}, "bet 10 on "+target)
			expected := "You don't have enough chips and credits"
			if target == "00" && !double {
				expected = "Unknown roulette target"
			}
			if !strings.Contains(string(conn.data), expected) {
				t.Fatalf("target=%s double=%v: %s", target, double, conn.data)
			}
		}
		conn.data = nil
		g.executeTableStatus(sess, []string{"rules"}, "table rules")
		if !strings.Contains(string(conn.data), "Straight numbers pay 35:1") || strings.Contains(string(conn.data), "Blackjack") {
			t.Fatal("wrong rules", string(conn.data))
		}
		snapshot := &casino.RouletteSnapshot{DoubleZero: double, Phase: "playing", Players: []string{"alice"}}
		if got := g.renderCasinoSnapshot(sess, snapshot); got != renderRouletteSnapshot(snapshot, g.colorMode(sess), sess.Player.OptionBool("unicode"), sess.Player.OptionInt("card_size")) {
			t.Fatal("snapshot not rendered", got)
		}
		if !g.seesCasinoDetails(sess, casino.Event{RoomID: 1, TableID: "roulette", Snapshot: snapshot}) {
			t.Fatal("player cannot see wheel")
		}
	}
}

func TestCasinoTestPortalAuthoredContract(t *testing.T) {
	g, rooms, _ := loadVesta(t)
	found := false
	for _, obj := range rooms[1001].Objects {
		found = found || obj.ID == "casino_test_portal"
	}
	if !found {
		t.Fatal("portal missing from starting room")
	}
	obj, err := g.ObjectStore.Load("casino_test_portal")
	if err != nil {
		t.Fatal(err)
	}
	if len(obj.OnUse) != 1 || len(obj.OnUse[0].Steps) != 2 {
		t.Fatal("unexpected portal sequence")
	}
	steps := obj.OnUse[0].Steps
	if len(steps[0].DropTable) != 1 || steps[0].DropTable[0].ItemID != "chips" || steps[0].DropTable[0].Quantity != 1000 {
		t.Fatal("portal does not grant 1000 chips")
	}
	if steps[1].Teleport != 6100 || rooms[6100] == nil {
		t.Fatal("wrong casino destination")
	}
	for _, id := range []int{6182, 6183} {
		cfg := rooms[id].CasinoTables[0]
		if err := cfg.Validate(); err != nil {
			t.Fatal(err)
		}
		if cfg.Game != casino.GameRoulette || cfg.Roulette.DoubleZero != (id == 6183) {
			t.Fatal("wrong roulette rules", id)
		}
	}
}