1// Copyright 2011 The Go Authors.  All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// This benchmark tests text/template throughput,
6// converting a large data structure with a simple template.
7
8package go1
9
10import (
11	"bytes"
12	"io/ioutil"
13	"strings"
14	"testing"
15	"text/template"
16)
17
18// After removing \t and \n this generates identical output to
19// json.Marshal, making it easy to test for correctness.
20const tmplText = `
21{
22	"tree":{{template "node" .Tree}},
23	"username":"{{.Username}}"
24}
25{{define "node"}}
26{
27	"name":"{{.Name}}",
28	"kids":[
29	{{range $i, $k := .Kids}}
30		{{if $i}}
31			,
32		{{end}}
33		{{template "node" $k}}
34	{{end}}
35	],
36	"cl_weight":{{.CLWeight}},
37	"touches":{{.Touches}},
38	"min_t":{{.MinT}},
39	"max_t":{{.MaxT}},
40	"mean_t":{{.MeanT}}
41}
42{{end}}
43`
44
45func stripTabNL(r rune) rune {
46	if r == '\t' || r == '\n' {
47		return -1
48	}
49	return r
50}
51
52var tmpl = template.Must(template.New("main").Parse(strings.Map(stripTabNL, tmplText)))
53
54func init() {
55	var buf bytes.Buffer
56	if err := tmpl.Execute(&buf, &jsondata); err != nil {
57		panic(err)
58	}
59	if !bytes.Equal(buf.Bytes(), jsonbytes) {
60		println(buf.Len(), len(jsonbytes))
61		panic("wrong output")
62	}
63}
64
65func tmplexec() {
66	if err := tmpl.Execute(ioutil.Discard, &jsondata); err != nil {
67		panic(err)
68	}
69}
70
71func BenchmarkTemplate(b *testing.B) {
72	b.SetBytes(int64(len(jsonbytes)))
73	for i := 0; i < b.N; i++ {
74		tmplexec()
75	}
76}
77