json_test.gno
3.03 Kb · 83 lines
1package connect4_v2
2
3import (
4 "strconv"
5 "strings"
6 "testing"
7
8 "gno.land/p/nt/uassert/v0"
9)
10
11func TestGameJSONUnknown(t *testing.T) {
12 reset()
13 uassert.True(t, strings.HasSuffix(GameJSON(42), `,"game":null}`))
14 uassert.True(t, strings.HasPrefix(GameJSON(42), `{"now":`))
15}
16
17func TestGameJSONOpenOffer(cur realm, t *testing.T) {
18 reset()
19 testing.SetRealm(testing.NewUserRealm(alice))
20 pay(stake)
21 id := Offer(cross(cur), bob, 10, commit())
22 s := GameJSON(id)
23 uassert.True(t, strings.Contains(s, `"id":1,`))
24 uassert.True(t, strings.Contains(s, `"creator":"`+alice.String()+`"`))
25 uassert.True(t, strings.Contains(s, `"opponent":"`+bob.String()+`"`))
26 uassert.True(t, strings.Contains(s, `"acceptor":""`))
27 uassert.True(t, strings.Contains(s, `"stake":10000000,`))
28 uassert.True(t, strings.Contains(s, `"fee":100000,`))
29 uassert.True(t, strings.Contains(s, `"status":"open"`))
30 uassert.True(t, strings.Contains(s, `"turn":0,`))
31 uassert.True(t, strings.Contains(s, `"turnPlayer":""`))
32 uassert.True(t, strings.Contains(s, `"deadline":0,`))
33 uassert.True(t, strings.Contains(s, `"board":"`+strings.Repeat("0", 42)+`"`))
34}
35
36func TestGameJSONMidPlayAndWon(cur realm, t *testing.T) {
37 reset()
38 g := started(cur)
39 first := g.player(g.Turn)
40 move(cur, g, 3) // first mover, column 3 -> c=2, r=0
41 s := GameJSON(g.ID)
42 uassert.True(t, strings.Contains(s, `"status":"playing"`))
43 uassert.True(t, strings.Contains(s, `"moves":1,`))
44 uassert.True(t, strings.Contains(s, `"lastCol":2,"lastRow":0,`))
45 uassert.True(t, strings.Contains(s, `"turnPlayer":"`+g.player(g.Turn).String()+`"`))
46 uassert.True(t, strings.Contains(s, `"deadline":`+strconv.FormatInt(g.deadline().Unix(), 10)+`,`))
47 want := strings.Repeat("0", 12) + string(rune('0'+int(3-g.Turn))) + strings.Repeat("0", 29)
48 uassert.True(t, strings.Contains(s, `"board":"`+want+`"`))
49 // Second mover plays 2,2,2,4; first mover stacks column 1 four times.
50 move(cur, g, 2)
51 move(cur, g, 1)
52 move(cur, g, 2)
53 move(cur, g, 1)
54 move(cur, g, 2)
55 move(cur, g, 1)
56 move(cur, g, 4)
57 move(cur, g, 1) // first mover: column 1 rows 0-3 -> win
58 s = GameJSON(g.ID)
59 uassert.True(t, strings.Contains(s, `"status":"won"`))
60 uassert.True(t, strings.Contains(s, `"winner":"`+first.String()+`"`))
61 uassert.True(t, strings.Contains(s, `"turnPlayer":""`))
62}
63
64func TestActiveJSON(cur realm, t *testing.T) {
65 reset()
66 for i := 0; i < 3; i++ {
67 testing.SetRealm(testing.NewUserRealm(alice))
68 pay(stake)
69 Offer(cross(cur), "", 10, commit())
70 }
71 testing.SetRealm(testing.NewUserRealm(alice))
72 pay(0)
73 Cancel(cross(cur), 2)
74 s := ActiveJSON(0, 10)
75 uassert.True(t, strings.Contains(s, `"id":1,`))
76 uassert.False(t, strings.Contains(s, `"id":2,`))
77 uassert.True(t, strings.Contains(s, `"id":3,`))
78 uassert.Equal(t, 1, strings.Count(ActiveJSON(1, 10), `"id":`))
79 uassert.Equal(t, 1, strings.Count(ActiveJSON(-5, 1), `"id":`)) // offset clamps to 0, limit 1
80 uassert.Equal(t, 1, strings.Count(ActiveJSON(0, 0), `"id":`)) // limit clamps to 1
81 uassert.Equal(t, 2, strings.Count(ActiveJSON(0, 1000), `"id":`))
82 uassert.True(t, strings.HasSuffix(ActiveJSON(50, 10), `"games":[]}`))
83}