all repos — gomponents @ ba0d83f4fb1b588f7931b9a31609807adfa11163

HTML components in pure Go

Add examples in test files (#80) These show up in godoc.

Markus Wüstenberg
commit

ba0d83f4fb1b588f7931b9a31609807adfa11163

parent

7c0f2e4cbb4da6d7074bd78be9c55d3495c0dad7

3 files changed, 64 insertions(+), 13 deletions(-)

changed files
M components/attributes_test.gocomponents/attributes_test.go
@@ -1,6 +1,7 @@
package components_test import ( + "os" "testing" g "github.com/maragudk/gomponents"
@@ -30,3 +31,9 @@ t.FailNow()
} }) } + +func ExampleClasses() { + e := g.El("div", c.Classes{"party-hat": true, "boring-hat": false}) + _ = e.Render(os.Stdout) + // Output: <div class="party-hat"></div> +}
M gomponents.gogomponents.go
@@ -1,4 +1,4 @@
-// Package gomponents provides declarative view components in Go, that can render to HTML5. +// Package gomponents provides view components in Go, that render to HTML 5. // The primary interface is a Node, which has a single function Render, which should render // the Node to a string. Furthermore, NodeFunc is a function which implements the Node interface // by calling itself on Render.
@@ -219,14 +219,6 @@ return group{children: children}
} // Map something enumerable to a list of Nodes. -// Example: -// items := []string{"hat", "partyhat"} -// -// lis := Map(len(items), func(i int) Node { -// return El("li", Text(items[i])) -// }) -// -// list := El("ul", lis...) func Map(length int, cb func(i int) Node) []Node { var nodes []Node for i := 0; i < length; i++ {
@@ -237,10 +229,6 @@ }
// If condition is true, return the given Node. Otherwise, return nil. // This helper function is good for inlining elements conditionally. -// Example: -// El("div", -// If(showMessage, El("span", "You lost your hat.")), -// ) func If(condition bool, n Node) Node { if condition { return n
M gomponents_test.gogomponents_test.go
@@ -4,6 +4,7 @@ import (
"errors" "fmt" "io" + "os" "strings" "testing"
@@ -77,6 +78,18 @@ }
}) } +func ExampleAttr_bool() { + e := g.El("input", g.Attr("required")) + _ = e.Render(os.Stdout) + // Output: <input required> +} + +func ExampleAttr_name_value() { + e := g.El("div", g.Attr("id", "hat")) + _ = e.Render(os.Stdout) + // Output: <div id="hat"></div> +} + type outsider struct{} func (o outsider) String() string {
@@ -146,6 +159,12 @@ }
}) } +func ExampleEl() { + e := g.El("div", g.El("span")) + _ = e.Render(os.Stdout) + // Output: <div><span></span></div> +} + type erroringWriter struct{} func (w *erroringWriter) Write(p []byte) (n int, err error) {
@@ -159,6 +178,12 @@ assert.Equal(t, "&lt;div&gt;", e)
}) } +func ExampleText() { + e := g.El("span", g.Text("Party hats > normal hats.")) + _ = e.Render(os.Stdout) + // Output: <span>Party hats &gt; normal hats.</span> +} + func TestTextf(t *testing.T) { t.Run("renders interpolated and escaped text", func(t *testing.T) { e := g.Textf("<%v>", "div")
@@ -166,11 +191,23 @@ assert.Equal(t, "&lt;div&gt;", e)
}) } +func ExampleTextf() { + e := g.El("span", g.Textf("%v party hats > %v normal hats.", 2, 3)) + _ = e.Render(os.Stdout) + // Output: <span>2 party hats &gt; 3 normal hats.</span> +} + func TestRaw(t *testing.T) { t.Run("renders raw text", func(t *testing.T) { e := g.Raw("<div>") assert.Equal(t, "<div>", e) }) +} + +func ExampleRaw() { + e := g.El("span", g.Raw("<strong>Party</strong> hats &gt; normal hats.")) + _ = e.Render(os.Stdout) + // Output: <span><strong>Party</strong> hats &gt; normal hats.</span> } func TestGroup(t *testing.T) {
@@ -222,6 +259,15 @@ assert.Equal(t, `<ul><li>hat</li><li>partyhat</li><li>turtlehat</li></ul>`, list)
}) } +func ExampleMap() { + items := []string{"party hat", "super hat"} + e := g.El("ul", g.Group(g.Map(len(items), func(i int) g.Node { + return g.El("li", g.Text(items[i])) + }))) + _ = e.Render(os.Stdout) + // Output: <ul><li>party hat</li><li>super hat</li></ul> +} + func TestIf(t *testing.T) { t.Run("returns node if condition is true", func(t *testing.T) { n := g.El("div", g.If(true, g.El("span")))
@@ -233,3 +279,13 @@ n := g.El("div", g.If(false, g.El("span")))
assert.Equal(t, "<div></div>", n) }) } + +func ExampleIf() { + showMessage := true + e := g.El("div", + g.If(showMessage, g.El("span", g.Text("You lost your hat!"))), + g.If(!showMessage, g.El("span", g.Text("No messages."))), + ) + _ = e.Render(os.Stdout) + // Output: <div><span>You lost your hat!</span></div> +}