From 02039b6345fdb2026e4469ef12921a0c5a34d434 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Fri, 8 Jul 2011 16:49:06 +1000 Subject: [PATCH] exp/template: add a tree-walking example to the test. Also fix a comment formatting glitch. R=golang-dev, adg CC=golang-dev https://golang.org/cl/4672054 --- src/pkg/exp/template/exec.go | 2 +- src/pkg/exp/template/exec_test.go | 81 +++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/src/pkg/exp/template/exec.go b/src/pkg/exp/template/exec.go index 09bf8587e08..42279c2e6b9 100644 --- a/src/pkg/exp/template/exec.go +++ b/src/pkg/exp/template/exec.go @@ -267,7 +267,7 @@ func isExported(name string) bool { // The 'final' argument represents the return value from the preceding // value of the pipeline, if any. // If we're in a chain, such as (.X.Y.Z), .X and .Y cannot be methods; -//canBeMethod will be true only for the last element of such chains (here .Z). +// canBeMethod will be true only for the last element of such chains (here .Z). // The isFirst argument tells whether this is the first element of a chain (here .X). // If true, evaluation is allowed to examine the parent to resolve the reference. func (s *state) evalField(data reflect.Value, fieldName string, args []node, final reflect.Value, diff --git a/src/pkg/exp/template/exec_test.go b/src/pkg/exp/template/exec_test.go index db3e89f63d4..5d771a2b775 100644 --- a/src/pkg/exp/template/exec_test.go +++ b/src/pkg/exp/template/exec_test.go @@ -346,3 +346,84 @@ func TestJSEscaping(t *testing.T) { } } } + +// A nice example: walk a binary tree. + +type Tree struct { + Val int + Left, Right *Tree +} + +const treeTemplate = ` + {{define "tree"}} + [ + {{.Val}} + {{with .Left}} + {{template "tree" .}} + {{end}} + {{with .Right}} + {{template "tree" .}} + {{end}} + ] + {{end}} +` + +func TestTree(t *testing.T) { + var tree = &Tree{ + 1, + &Tree{ + 2, &Tree{ + 3, + &Tree{ + 4, nil, nil, + }, + nil, + }, + &Tree{ + 5, + &Tree{ + 6, nil, nil, + }, + nil, + }, + }, + &Tree{ + 7, + &Tree{ + 8, + &Tree{ + 9, nil, nil, + }, + nil, + }, + &Tree{ + 10, + &Tree{ + 11, nil, nil, + }, + nil, + }, + }, + } + set := NewSet() + err := set.Parse(treeTemplate) + if err != nil { + t.Fatal("parse error:", err) + } + var b bytes.Buffer + err = set.Execute("tree", &b, tree) + if err != nil { + t.Fatal("exec error:", err) + } + stripSpace := func(r int) int { + if r == '\t' || r == '\n' { + return -1 + } + return r + } + result := strings.Map(stripSpace, b.String()) + const expect = "[1[2[3[4]][5[6]]][7[8[9]][10[11]]]]" + if result != expect { + t.Errorf("expected %q got %q", expect, result) + } +}