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", "row2"} { 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) } } }