Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

rps_test.gno

2.22 Kb · 74 lines
 1package rps
 2
 3import (
 4	"strings"
 5	"testing"
 6
 7	"gno.land/p/nt/testutils/v0"
 8	"gno.land/p/nt/uassert/v0"
 9)
10
11func TestDecideAndParse(t *testing.T) {
12	// parseChoice.
13	cases := []struct {
14		in   string
15		want int
16		ok   bool
17	}{
18		{"rock", rock, true},
19		{"PAPER", paper, true},
20		{" scissors ", scissors, true},
21		{"r", rock, true},
22		{"p", paper, true},
23		{"s", scissors, true},
24		{"lizard", 0, false},
25	}
26	for _, c := range cases {
27		got, ok := parseChoice(c.in)
28		uassert.Equal(t, c.ok, ok, "ok for "+c.in)
29		if ok {
30			uassert.Equal(t, c.want, got, "move for "+c.in)
31		}
32	}
33
34	// decide: player perspective.
35	uassert.Equal(t, outDraw, decide(rock, rock), "rock vs rock")
36	uassert.Equal(t, outWin, decide(rock, scissors), "rock beats scissors")
37	uassert.Equal(t, outLose, decide(rock, paper), "rock loses to paper")
38	uassert.Equal(t, outWin, decide(paper, rock), "paper beats rock")
39	uassert.Equal(t, outWin, decide(scissors, paper), "scissors beats paper")
40	uassert.Equal(t, outLose, decide(scissors, rock), "scissors loses to rock")
41
42	// houseMove determinism.
43	uassert.Equal(t, houseMove(10, 0), houseMove(10, 0), "same inputs -> same move")
44	if houseMove(10, 0) == houseMove(10, 1) && houseMove(10, 1) == houseMove(10, 2) {
45		t.Error("play count should vary house move across values")
46	}
47}
48
49func TestPlayRecordsTally(cur realm, t *testing.T) {
50	user := testutils.TestAddress("rps-player")
51	testing.SetRealm(testing.NewUserRealm(user))
52
53	before := totalRounds
54	Play(cross(cur),"rock")
55	Play(cross(cur),"paper")
56	Play(cross(cur),"scissors")
57
58	uassert.Equal(t, before+3, totalRounds, "global rounds incremented")
59
60	tl := getTally(user.String())
61	uassert.True(t, tl != nil, "player tally exists")
62	uassert.Equal(t, 3, tl.plays, "player played 3 rounds")
63	uassert.Equal(t, tl.wins+tl.losses+tl.draws, tl.plays, "outcomes sum to plays")
64
65	// Render must show the global tally header and the player.
66	out := Render("")
67	uassert.True(t, strings.Contains(out, "Global tally"), "render has global tally")
68	uassert.True(t, strings.Contains(out, "Recent rounds"), "render has recent rounds")
69
70	// Invalid choice aborts (crossing fn -> cross-realm abort).
71	uassert.AbortsWithMessage(t, cur, "invalid choice: use rock, paper, or scissors", func() {
72		Play(cross(cur),"lizard")
73	})
74}