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}