// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package html import ( "bytes" "template" "template/parse" "testing" ) func TestClone(t *testing.T) { tests := []struct { input, want, wantClone string }{ { `Hello, {{if true}}{{""}}{{end}}!`, "Hello, !", "Hello, <World>!", }, { `Hello, {{if false}}{{.X}}{{else}}{{""}}{{end}}!`, "Hello, !", "Hello, <World>!", }, { `Hello, {{with ""}}{{.}}{{end}}!`, "Hello, !", "Hello, <World>!", }, { `{{range .}}

{{.}}

{{end}}`, "

foo

baz

", "

foo

<bar>

baz

", }, { `Hello, {{"" | html}}!`, "Hello, <World>!", "Hello, <World>!", }, { `Hello{{if 1}}, World{{else}}{{template "d"}}{{end}}!`, "Hello, World!", "Hello, World!", }, } for _, test := range tests { s := template.Must(template.New("s").Parse(test.input)) d := template.New("d") d.Tree = &parse.Tree{Name: d.Name(), Root: cloneList(s.Root)} if want, got := s.Root.String(), d.Root.String(); want != got { t.Errorf("want %q, got %q", want, got) } d, err := Escape(d) if err != nil { t.Errorf("%q: failed to escape: %s", test.input, err) continue } if want, got := "s", s.Name(); want != got { t.Errorf("want %q, got %q", want, got) continue } if want, got := "d", d.Name(); want != got { t.Errorf("want %q, got %q", want, got) continue } data := []string{"foo", "", "baz"} // Make sure escaping d did not affect s. var b bytes.Buffer s.Execute(&b, data) if got := b.String(); got != test.want { t.Errorf("%q: want %q, got %q", test.input, test.want, got) continue } b.Reset() d.Execute(&b, data) if got := b.String(); got != test.wantClone { t.Errorf("%q: want %q, got %q", test.input, test.wantClone, got) } } }