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

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

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}