mirror of
https://github.com/golang/go
synced 2024-11-22 04:44:39 -07:00
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
This commit is contained in:
parent
ad58dc9d26
commit
02039b6345
@ -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,
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user