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
|
package casino
import (
"testing"
)
func TestAddCreditsChecked(t *testing.T) {
sum, err := AddCredits(5, 7)
if err != nil || sum != 12 {
t.Fatalf("AddCredits(5,7) = %d, %v", sum, err)
}
if sum, err := AddCredits(MaxCredits, 1); err == nil || sum != MaxCredits {
t.Fatalf("overflow add: %d, %v", sum, err)
}
if _, err := AddCredits(MaxCredits, -1); err == nil {
t.Fatal("negative add must be rejected")
}
}
func TestMulPayoutBoundsAndConverts(t *testing.T) {
payout, err := MulPayout(10, 1.5)
if err != nil || payout != 15 {
t.Fatalf("MulPayout(10,1.5) = %d, %v", payout, err)
}
// Floor conversion: 10 * 0.333 = 3.33 -> 3.
if payout, _ := MulPayout(10, 0.333); payout != 3 {
t.Fatalf("floor conversion: %d", payout)
}
if payout, err := MulPayout(MaxCredits, 2); err == nil || payout != MaxCredits {
t.Fatalf("overflow payout: %d, %v", payout, err)
}
if payout, err := MulPayout(MaxCredits, 0.5); err != nil || payout != MaxCredits/2 {
t.Fatalf("half of max: %d, %v", payout, err)
}
for _, bad := range []float64{-1, inf(), nan()} {
if payout, err := MulPayout(10, bad); err == nil || payout != 0 {
t.Fatalf("multiplier %v accepted: %d, %v", bad, payout, err)
}
}
if payout, _ := MulPayout(0, 2); payout != 0 {
t.Fatalf("zero-amount payout = %d", payout)
}
}
func TestWalletErrorMessages(t *testing.T) {
if got := walletErrorMessage(ErrInsufficientFunds, "Custom short balance."); got != "Custom short balance." {
t.Fatalf("insufficient funds rendering: %q", got)
}
if got := walletErrorMessage(ErrWalletPersistence); !errContains(got, "persistence failure") || errContains(got, "insufficient") {
t.Fatalf("persistence rendering must be distinct: %q", got)
}
if got := walletErrorMessage(ErrInsufficientFunds); got == "" {
t.Fatal("default message missing")
}
}
func inf() float64 {
max := 1e308
return max * 10
}
func nan() float64 { return inf() - inf() }
func errContains(value, fragment string) bool {
return len(value) >= len(fragment) && (value == fragment || len(fragment) == 0 || indexOf(value, fragment) >= 0)
}
func indexOf(haystack, needle string) int {
for i := 0; i+len(needle) <= len(haystack); i++ {
if haystack[i:i+len(needle)] == needle {
return i
}
}
return -1
}
|