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.

render_test.gno

3.81 Kb · 107 lines
  1package rpgroom
  2
  3import (
  4	"strings"
  5	"testing"
  6
  7	"gno.land/p/nt/testutils/v0"
  8	"gno.land/p/nt/uassert/v0"
  9)
 10
 11// ExampleRender pins the empty-room view. resetState() puts the realm back to
 12// its init() shape, so the example does not depend on test ordering.
 13func ExampleRender() {
 14	resetState()
 15	print(Render(""))
 16	// Output:
 17	// # RPG Room
 18	//
 19	// A single dungeon room with one monster in it at a time. Call `Spawn("name")` to enter, `Attack()` to fight the resident monster, `Rest()` to heal up, and `Revive()` if you fall.
 20	//
 21	// ## Current monster
 22	//
 23	// **Slime** — level 1
 24	//
 25	// `##########` 35/35 HP
 26	//
 27	// - Attack: 5
 28	// - Monsters cleared so far: 0
 29	//
 30	// ## Leaderboard
 31	//
 32	// _No heroes yet. Be the first: `Spawn("name")`._
 33}
 34
 35// TestRenderLeaderboard checks spawned heroes replace the empty notice and are
 36// listed in rank order.
 37func TestRenderLeaderboard(cur realm, t *testing.T) {
 38	resetState()
 39
 40	testing.SetRealm(testing.NewUserRealm(testutils.TestAddress("alice")))
 41	Spawn(cross(cur), "Alice the Bold")
 42	testing.SetRealm(testing.NewUserRealm(testutils.TestAddress("bob")))
 43	Spawn(cross(cur), "Bob the Brave")
 44
 45	out := Render("")
 46	uassert.False(t, strings.Contains(out, "_No heroes yet"), "empty notice should be gone")
 47	uassert.True(t, strings.Contains(out, "| # | Hero | Lvl | HP | Kills | Gold | Status |"),
 48		"leaderboard header should render")
 49	uassert.True(t, strings.Contains(out, "Alice the Bold"), "alice should be listed")
 50	uassert.True(t, strings.Contains(out, "Bob the Brave"), "bob should be listed")
 51	uassert.True(t, strings.Contains(out, "| alive |"), "a fresh hero is alive")
 52}
 53
 54// TestRenderHeroPage checks the per-address detail route.
 55func TestRenderHeroPage(cur realm, t *testing.T) {
 56	resetState()
 57	alice := testutils.TestAddress("alice")
 58
 59	testing.SetRealm(testing.NewUserRealm(alice))
 60	Spawn(cross(cur), "Alice the Bold")
 61
 62	out := Render(alice.String())
 63	uassert.True(t, strings.HasPrefix(out, "# Alice the Bold\n"), "hero page should be titled by name")
 64	uassert.True(t, strings.Contains(out, "- Level: 1\n"), "level should be shown")
 65	uassert.True(t, strings.Contains(out, "- Kills: 0\n"), "kills should be shown")
 66	uassert.True(t, strings.Contains(out, "- Gold: 0\n"), "gold should be shown")
 67	uassert.False(t, strings.Contains(out, "- Status: fallen"), "a live hero has no fallen status")
 68}
 69
 70// TestRenderUnknownHero covers the not-found branch of the detail route.
 71func TestRenderUnknownHero(t *testing.T) {
 72	resetState()
 73	stranger := testutils.TestAddress("stranger").String()
 74
 75	uassert.Equal(t, "> [!WARNING]\n> No hero found for `"+stranger+"`.\n", Render(stranger))
 76}
 77
 78// TestRenderTrimsPath checks surrounding whitespace still routes to the room.
 79func TestRenderTrimsPath(t *testing.T) {
 80	resetState()
 81	uassert.Equal(t, Render(""), Render("   "))
 82}
 83
 84// TestRenderMonsterHPBar checks the monster's bar tracks damage.
 85func TestRenderMonsterHPBar(t *testing.T) {
 86	resetState()
 87	monster.HP = monster.MaxHP / 2
 88
 89	uassert.True(t, strings.Contains(Render(""), hpBar(monster.HP, monster.MaxHP)),
 90		"the room should render the monster's current HP bar")
 91}
 92
 93// The not-found line puts the caller's path in a code span. Building that span
 94// by hand around sanitize.InlineText put an escaper INSIDE it, where markdown
 95// escapes do not apply: the backslashes reach the reader and a caller backtick
 96// closes the span early. gno-contracts#326 review, 2026-10-07.
 97func TestNoHeroFoundShowsThePathVerbatim(t *testing.T) {
 98	out := Render("gno.land_x-y")
 99	uassert.True(t, strings.Contains(out, "`gno.land_x-y`"),
100		"the path is not shown verbatim in a code span")
101	uassert.False(t, strings.Contains(out, `gno\.land`),
102		"an inline escaper ran inside a code span, so its backslashes reach the reader")
103
104	out = Render("a`b")
105	uassert.True(t, strings.Contains(out, "``a`b``"),
106		"the fence does not outscan the caller's backtick, so the span closes early")
107}