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.

gallery_test.gno

4.47 Kb · 113 lines
  1package gallery
  2
  3import (
  4	"strings"
  5	"testing"
  6
  7	"gno.land/p/nt/uassert/v0"
  8)
  9
 10func TestRenderIndexMarkdown(t *testing.T) {
 11	out := Render("")
 12	uassert.True(t, strings.Contains(out, "# moul's gallery"), "heading")
 13	uassert.True(t, strings.Contains(out, "```"), "the banner is fenced in markdown")
 14	uassert.True(t, strings.Contains(out, "| Piece |"), "a real markdown table")
 15	// The path is spelled out rather than taken from realmPath: a test that
 16	// reads the same constant the code does would pass with the version
 17	// dropped, which is the exact regression this pins.
 18	for _, p := range catalog() {
 19		uassert.True(t, strings.Contains(out, "/r/nym-moultest123/gallery/v0:piece/"+p.Slug), p.Slug+" is linked")
 20	}
 21}
 22
 23// The two targets are different documents, not one with characters deleted.
 24func TestTextTargetStripsMarkdownAndDefersLinks(t *testing.T) {
 25	out := Render("piece/millipede?fmt=txt")
 26
 27	uassert.False(t, strings.Contains(out, "```"), "no code fences")
 28	uassert.False(t, strings.Contains(out, "**"), "no bold markers")
 29	uassert.False(t, strings.Contains(out, "]("), "no inline link syntax")
 30	uassert.False(t, strings.Contains(out, "\n#"), "no heading hashes")
 31
 32	// A heading is underlined instead.
 33	uassert.True(t, strings.Contains(out, "millipede\n========="), "underlined heading")
 34	// And the URL is a numbered footnote, not inline noise.
 35	uassert.True(t, strings.Contains(out, "the source realm [1]"), "inline marker")
 36	uassert.True(t, strings.Contains(out, "\nLinks:\n  [1] https://gno.land/r/nym-moultest123/demo/millipede/v0"), "footnote block")
 37}
 38
 39func TestTextTableColumnsLineUp(t *testing.T) {
 40	out := Render("?fmt=txt")
 41	var header, rule string
 42	for _, line := range strings.Split(out, "\n") {
 43		if strings.HasPrefix(line, "  Piece ") {
 44			header = line
 45		}
 46		if strings.HasPrefix(line, "  ---") {
 47			rule = line
 48		}
 49	}
 50	uassert.True(t, header != "", "found the header")
 51	uassert.True(t, rule != "", "found the rule")
 52
 53	// Every column boundary in the rule is a pair of spaces in the header at
 54	// the same rune offset. That is the property an unpadded pipe table does
 55	// not have, and the reason the text target has its own table at all.
 56	uassert.Equal(t, gutters(rule), gutters(header), "columns start at the same offsets")
 57}
 58
 59// gutters returns the rune offsets at which a column starts: a non-space
 60// preceded by at least two spaces. Measuring where the PADDING starts instead
 61// would compare "Piece" against eleven dashes and report a difference that is
 62// not one.
 63func gutters(s string) string {
 64	r := []rune(s)
 65	out := ""
 66	for i := 2; i < len(r); i++ {
 67		if r[i] != ' ' && r[i-1] == ' ' && r[i-2] == ' ' {
 68			out += itoa(i) + ","
 69		}
 70	}
 71	return out
 72}
 73
 74func TestArtIsNeverEscapedOrWrapped(t *testing.T) {
 75	// The millipede is box-drawing and parentheses. A text target that ran it
 76	// through an escaper or a wrapper would ruin it, and it would still look
 77	// like a picture, which is what makes this worth pinning.
 78	out := Render("piece/millipede?fmt=txt")
 79	uassert.True(t, strings.Contains(out, "╚═(███)═╝"), "art survives verbatim")
 80	uassert.False(t, strings.Contains(out, "\\("), "no escaping")
 81}
 82
 83func TestUnknownPiece(t *testing.T) {
 84	uassert.True(t, strings.Contains(Render("piece/nope"), "no piece called nope"), "markdown 404")
 85	uassert.True(t, strings.Contains(Render("piece/nope?fmt=txt"), "No piece called nope."), "text 404")
 86	// An empty slug is the index, not a 404.
 87	uassert.True(t, strings.Contains(Render("piece/"), "# moul's gallery"), "empty slug falls back to the index")
 88}
 89
 90func TestLinkedPiecesSayWhyTheyAreNotRendered(t *testing.T) {
 91	p, ok := find("asciiart")
 92	uassert.True(t, ok, "found")
 93	uassert.False(t, p.Live(), "asciiart is private = true, so it cannot be imported")
 94
 95	out := Render("piece/asciiart")
 96	uassert.True(t, strings.Contains(out, "cannot import the source"), "says so rather than showing nothing")
 97}
 98
 99func TestEveryPieceRenders(t *testing.T) {
100	for _, p := range catalog() {
101		out := Render("piece/" + p.Slug)
102		uassert.True(t, strings.Contains(out, p.Title), p.Slug+" markdown")
103		uassert.True(t, len(Render("piece/"+p.Slug+"?fmt=txt")) > 0, p.Slug+" text")
104	}
105}
106
107func TestWrapKeepsLongWordsIntact(t *testing.T) {
108	long := "see gno.land/r/g17khqpukees4237dtn3astzapmp462vjhsz6st4/settlers/nft now"
109	got := wrap(long, 20)
110	// A path is worse broken than wide, so it overflows rather than splitting.
111	uassert.True(t, strings.Contains(got, "gno.land/r/g17khqpukees4237dtn3astzapmp462vjhsz6st4/settlers/nft"), "unbroken")
112	uassert.Equal(t, 3, len(strings.Split(got, "\n")), "three lines")
113}