aboutsummaryrefslogtreecommitdiff
path: root/internal/casino/roulette_history_test.go
blob: 8ac84a7ee9ebf6c2f5a017f5ec0507322a96b238 (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
79
80
81
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)
			}
			// A lone player's spin starts at once; the sample only appears on
			// the settling tick, never before.
			for j := 0; j < table.Config.Roulette.SpinTicks-1; 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.join("idle")
	table.bet("a", "red", 1, &testWallet{chips: 100})
	// With a second seat the wager sits in the timed betting window, so the
	// spin can still be cancelled by a disconnect.
	table.markDisconnected("a")
	table.tick()
	table.tick()
	if len(table.view().History) != 0 {
		t.Fatal("cancelled spin recorded a result")
	}
}