aboutsummaryrefslogtreecommitdiff
path: root/internal/casino/blackjack_timer_test.go
blob: 5a57682f69ccda70af22ff7b9937f30a868f204f (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
package casino

import "testing"

// Regression: the blackjack action window may only restart when a new turn
// is actually prompted. Rejected actions must never extend the deadline, and
// each successive player must receive a full window.
func TestBlackjackActionWindowBoundaries(t *testing.T) {
	table := newBlackjackTable(1, TableConfig{ID: "blackjack", Game: GameBlackjack,
		Blackjack: BlackjackConfig{ActionTicks: 3}}, newTestRand())
	for _, name := range []string{"alice", "bob", "carol"} {
		table.players.add(name, &blackjackPlayer{
			Participant: Participant{Name: name, Connected: true, HasBet: true, Wallet: &testWallet{credits: 100}},
			hands:       []*blackjackHand{{bet: 10, cards: []card{{rank: "10"}, {rank: "6"}}}},
		})
	}
	table.dealer.cards = []card{{rank: "10"}, {rank: "7"}}
	table.beginPlay()
	table.prompt()

	// Alice burns one tick, then submits an invalid action and one she cannot
	// take (surrender disabled by default). Neither may reset her window.
	table.tick()
	table.action("alice", "invalid")
	table.action("alice", "surrender")
	if table.timer.clock != 1 {
		t.Fatalf("rejected actions extended or reset the deadline: timer=%+v", table.timer)
	}

	// Two more ticks expire her window; the timeout advances to Bob.
	table.tick()
	table.tick()
	if table.activeName() != "bob" {
		t.Fatalf("timeout did not advance to bob: active=%s", table.activeName())
	}
	if table.timer.clock != 0 {
		t.Fatalf("bob did not receive a fresh action window: timer=%+v", table.timer)
	}

	// Bob must survive two ticks and time out on the third.
	table.tick()
	table.tick()
	if table.activeName() != "bob" {
		t.Fatalf("bob timed out early: active=%s", table.activeName())
	}
	table.tick()
	if table.activeName() != "carol" {
		t.Fatalf("bob did not time out after his window: active=%s", table.activeName())
	}
}