package casino import ( "math/rand" "reflect" "testing" ) func TestRouletteHistoryTracksCompletedSpinsOnly(t *testing.T) { for _, double := range []bool{false, true} { table := rouletteFixture() table.Config.Roulette.DoubleZero = double table.join("a") wallet := &testWallet{chips: 1000} rng := rand.New(rand.NewSource(7)) wheel := rouletteWheel(double) var expected []string var first *RouletteSnapshot for i := 0; i < rouletteHistoryLimit+5; i++ { table.bet("a", "red", 1, wallet) before := table.view() if !reflect.DeepEqual(before.History, expected) { t.Fatalf("history changed on bet: %v", before.History) } // Two betting ticks, then two spinning ticks. No sample until the last. for j := 0; j < 3; j++ { table.tick() if !reflect.DeepEqual(table.view().History, expected) { t.Fatal("history revealed before settlement") } } events := table.tick() result := events[0].Snapshot.(*RouletteSnapshot) expected = append(expected, wheel[rng.Intn(len(wheel))]) if len(expected) > rouletteHistoryLimit { expected = expected[1:] } if !reflect.DeepEqual(result.History, expected) || result.Pockets[2] != expected[len(expected)-1] { t.Fatalf("wrong result history: %v, want %v", result.History, expected) } if i == 0 { first = result } if !reflect.DeepEqual(table.view().History, expected) { t.Fatal("round reset lost history") } } if len(first.History) != 1 || first.History[0] != first.Pockets[2] { t.Fatal("later spins mutated an earlier snapshot") } snapshot := table.view() snapshot.History[0] = "bad" if !reflect.DeepEqual(table.view().History, expected) { t.Fatal("snapshot aliases engine history") } table.refundAll() table.tick() if !reflect.DeepEqual(table.view().History, expected) { t.Fatal("refund or idle tick changed history") } if len(rouletteFixture().view().History) != 0 { t.Fatal("history leaked to another table") } } } func TestRouletteCancelledSpinDoesNotEnterHistory(t *testing.T) { table := rouletteFixture() table.join("a") table.bet("a", "red", 1, &testWallet{chips: 100}) table.tick() table.tick() table.markDisconnected("a") table.tick() table.tick() if len(table.view().History) != 0 { t.Fatal("cancelled spin recorded a result") } }