aboutsummaryrefslogtreecommitdiff
path: root/internal/casino/credits_test.go
blob: cff19c97b8d37cba07a0d432741b96cebf52a871 (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
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
}