asciiart_test.gno
3.07 Kb · 131 lines
1package asciiart
2
3import (
4 "strings"
5 "testing"
6
7 "gno.land/p/nt/avl/v0"
8 "gno.land/p/nt/testutils/v0"
9)
10
11func resetState() {
12 gallery = avl.Tree{}
13 nextID = 0
14}
15
16func TestRenderDiamond(t *testing.T) {
17 got := RenderDiamond(3)
18 want := " *\n ***\n*****\n ***\n *"
19 if got != want {
20 t.Fatalf("RenderDiamond(3) =\n%s\nwant\n%s", got, want)
21 }
22}
23
24func TestRenderPyramid(t *testing.T) {
25 got := RenderPyramid(3)
26 want := " *\n ***\n*****"
27 if got != want {
28 t.Fatalf("RenderPyramid(3) =\n%s\nwant\n%s", got, want)
29 }
30}
31
32func TestRenderSierpinski(t *testing.T) {
33 got := RenderSierpinski(4)
34 want := "####\n# # \n## \n# "
35 if got != want {
36 t.Fatalf("RenderSierpinski(4) =\n%s\nwant\n%s", got, want)
37 }
38}
39
40func TestRenderSierpinskiRejectsNonPowerOfTwo(t *testing.T) {
41 defer func() {
42 if r := recover(); r == nil {
43 t.Fatal("expected panic for a non-power-of-two size")
44 }
45 }()
46 RenderSierpinski(5)
47}
48
49func TestRenderChecker(t *testing.T) {
50 got := RenderChecker(3)
51 want := "#.#\n.#.\n#.#"
52 if got != want {
53 t.Fatalf("RenderChecker(3) =\n%s\nwant\n%s", got, want)
54 }
55}
56
57func TestRenderPatternUnknown(t *testing.T) {
58 defer func() {
59 if r := recover(); r == nil {
60 t.Fatal("expected panic for an unknown pattern")
61 }
62 }()
63 renderPattern("spiral", 3)
64}
65
66func TestPadID(t *testing.T) {
67 if padID(1) != "000001" {
68 t.Fatalf("padID(1) = %q, want 000001", padID(1))
69 }
70 if padID(42) != "000042" {
71 t.Fatalf("padID(42) = %q, want 000042", padID(42))
72 }
73}
74
75// Crossing: Generate mutates realm state, so the test needs `cur realm`.
76func TestGenerateAddsToGallery(cur realm, t *testing.T) {
77 resetState()
78 alice := testutils.TestAddress("alice")
79 testing.SetRealm(testing.NewUserRealm(alice))
80
81 art := Generate(cross(cur), "checker", 3)
82 if art != RenderChecker(3) {
83 t.Fatal("Generate should return the rendered art")
84 }
85 if nextID != 1 {
86 t.Fatalf("nextID = %d, want 1", nextID)
87 }
88
89 // avl/v0's Get returns a single `any` (a miss is a nil interface), not the
90 // value, ok pair a Go map yields — asciiart.gno:230 already does it this way.
91 v := gallery.Get(padID(1))
92 if v == nil {
93 t.Fatal("expected piece #1 to exist in the gallery")
94 }
95 p := v.(*piece)
96 if p.Pattern != "checker" || p.Size != 3 || p.Author != alice {
97 t.Fatalf("unexpected piece: %+v", p)
98 }
99}
100
101func TestGenerateRejectsOutOfRangeSize(cur realm, t *testing.T) {
102 resetState()
103 alice := testutils.TestAddress("alice")
104 testing.SetRealm(testing.NewUserRealm(alice))
105
106 rec := revive(func() { Generate(cross(cur), "diamond", 0) })
107 if rec == nil {
108 t.Fatal("expected panic for size < 1")
109 }
110 rec = revive(func() { Generate(cross(cur), "diamond", maxSize+1) })
111 if rec == nil {
112 t.Fatal("expected panic for size > maxSize")
113 }
114}
115
116// Non-crossing: Render is a plain read.
117func TestRenderHomeEmptyGallery(t *testing.T) {
118 resetState()
119 out := Render("")
120 if !strings.Contains(out, "nothing generated yet") {
121 t.Fatal(`Render("") on an empty gallery should say so`)
122 }
123}
124
125func TestRenderPieceNotFound(t *testing.T) {
126 resetState()
127 out := Render("99")
128 if !strings.Contains(out, "No such piece") {
129 t.Fatal(`Render("99") on a missing piece should say so`)
130 }
131}