diff options
Diffstat (limited to 'src/pkg/template/template_test.go')
-rw-r--r-- | src/pkg/template/template_test.go | 186 |
1 files changed, 135 insertions, 51 deletions
diff --git a/src/pkg/template/template_test.go b/src/pkg/template/template_test.go index 3842b6d6b..d21a5397a 100644 --- a/src/pkg/template/template_test.go +++ b/src/pkg/template/template_test.go @@ -31,8 +31,10 @@ type U struct { type S struct { Header string + HeaderPtr *string Integer int - Raw string + IntegerPtr *int + NilPtr *int InnerT T InnerPointerT *T Data []T @@ -47,7 +49,7 @@ type S struct { JSON interface{} Innermap U Stringmap map[string]string - Bytes []byte + Ptrmap map[string]*string Iface interface{} Ifaceptr interface{} } @@ -118,6 +120,24 @@ var tests = []*Test{ out: "Header=77\n", }, + &Test{ + in: "Pointers: {*HeaderPtr}={*IntegerPtr}\n", + + out: "Pointers: Header=77\n", + }, + + &Test{ + in: "Stars but not pointers: {*Header}={*Integer}\n", + + out: "Stars but not pointers: Header=77\n", + }, + + &Test{ + in: "nil pointer: {*NilPtr}={*Integer}\n", + + out: "nil pointer: <nil>=77\n", + }, + // Method at top level &Test{ in: "ptrmethod={PointerMethod}\n", @@ -312,38 +332,6 @@ var tests = []*Test{ out: "ItemNumber1=ValueNumber1\n", }, - - // Formatters - &Test{ - in: "{.section Pdata }\n" + - "{Header|uppercase}={Integer|+1}\n" + - "{Header|html}={Integer|str}\n" + - "{.end}\n", - - out: "HEADER=78\n" + - "Header=77\n", - }, - - &Test{ - in: "{.section Pdata }\n" + - "{Header|uppercase}={Integer Header|multiword}\n" + - "{Header|html}={Header Integer|multiword}\n" + - "{Header|html}={Header Integer}\n" + - "{.end}\n", - - out: "HEADER=<77><Header>\n" + - "Header=<Header><77>\n" + - "Header=Header77\n", - }, - - &Test{ - in: "{Raw}\n" + - "{Raw|html}\n", - - out: "&<>!@ #$%^\n" + - "&<>!@ #$%^\n", - }, - &Test{ in: "{.section Emptystring}emptystring{.end}\n" + "{.section Header}header{.end}\n", @@ -358,12 +346,6 @@ var tests = []*Test{ out: "1\n4\n", }, - &Test{ - in: "{Bytes}", - - out: "hello", - }, - // Maps &Test{ @@ -407,6 +389,20 @@ var tests = []*Test{ out: "\tstringresult\n" + "\tstringresult\n", }, + &Test{ + in: "{*Ptrmap.stringkey1}\n", + + out: "pointedToString\n", + }, + &Test{ + in: "{.repeated section Ptrmap}\n" + + "{*@}\n" + + "{.end}", + + out: "pointedToString\n" + + "pointedToString\n", + }, + // Interface values @@ -460,8 +456,9 @@ func testAll(t *testing.T, parseFunc func(*Test) (*Template, os.Error)) { s := new(S) // initialized by hand for clarity. s.Header = "Header" + s.HeaderPtr = &s.Header s.Integer = 77 - s.Raw = "&<>!@ #$%^" + s.IntegerPtr = &s.Integer s.InnerT = t1 s.Data = []T{t1, t2} s.Pdata = []*T{&t1, &t2} @@ -480,7 +477,10 @@ func testAll(t *testing.T, parseFunc func(*Test) (*Template, os.Error)) { s.Stringmap = make(map[string]string) s.Stringmap["stringkey1"] = "stringresult" // the same value so repeated section is order-independent s.Stringmap["stringkey2"] = "stringresult" - s.Bytes = []byte("hello") + s.Ptrmap = make(map[string]*string) + x := "pointedToString" + s.Ptrmap["stringkey1"] = &x // the same value so repeated section is order-independent + s.Ptrmap["stringkey2"] = &x s.Iface = []int{1, 2, 3} s.Ifaceptr = &T{"Item", "Value"} @@ -492,7 +492,7 @@ func testAll(t *testing.T, parseFunc func(*Test) (*Template, os.Error)) { t.Error("unexpected parse error: ", err) continue } - err = tmpl.Execute(s, &buf) + err = tmpl.Execute(&buf, s) if test.err == "" { if err != nil { t.Error("unexpected execute error:", err) @@ -517,7 +517,7 @@ func TestMapDriverType(t *testing.T) { t.Error("unexpected parse error:", err) } var b bytes.Buffer - err = tmpl.Execute(mp, &b) + err = tmpl.Execute(&b, mp) if err != nil { t.Error("unexpected execute error:", err) } @@ -535,7 +535,7 @@ func TestMapNoEntry(t *testing.T) { t.Error("unexpected parse error:", err) } var b bytes.Buffer - err = tmpl.Execute(mp, &b) + err = tmpl.Execute(&b, mp) if err != nil { t.Error("unexpected execute error:", err) } @@ -552,7 +552,7 @@ func TestStringDriverType(t *testing.T) { t.Error("unexpected parse error:", err) } var b bytes.Buffer - err = tmpl.Execute("hello", &b) + err = tmpl.Execute(&b, "hello") if err != nil { t.Error("unexpected execute error:", err) } @@ -569,7 +569,7 @@ func TestTwice(t *testing.T) { t.Error("unexpected parse error:", err) } var b bytes.Buffer - err = tmpl.Execute("hello", &b) + err = tmpl.Execute(&b, "hello") if err != nil { t.Error("unexpected parse error:", err) } @@ -578,7 +578,7 @@ func TestTwice(t *testing.T) { if s != expect { t.Errorf("failed passing string as data: expected %q got %q", expect, s) } - err = tmpl.Execute("hello", &b) + err = tmpl.Execute(&b, "hello") if err != nil { t.Error("unexpected parse error:", err) } @@ -614,7 +614,7 @@ func TestCustomDelims(t *testing.T) { continue } var b bytes.Buffer - err = tmpl.Execute("hello", &b) + err = tmpl.Execute(&b, "hello") s := b.String() if s != "template: hello"+ldelim+rdelim { t.Errorf("failed delim check(%q %q) %q got %q", ldelim, rdelim, text, s) @@ -635,7 +635,7 @@ func TestVarIndirection(t *testing.T) { if err != nil { t.Fatal("unexpected parse error:", err) } - err = tmpl.Execute(s, &buf) + err = tmpl.Execute(&buf, s) if err != nil { t.Fatal("unexpected execute error:", err) } @@ -669,7 +669,7 @@ func TestReferenceToUnexported(t *testing.T) { if err != nil { t.Fatal("unexpected parse error:", err) } - err = tmpl.Execute(u, &buf) + err = tmpl.Execute(&buf, u) if err == nil { t.Fatal("expected execute error, got none") } @@ -677,3 +677,87 @@ func TestReferenceToUnexported(t *testing.T) { t.Fatal("expected unexported error; got", err) } } + +var formatterTests = []Test{ + { + in: "{Header|uppercase}={Integer|+1}\n" + + "{Header|html}={Integer|str}\n", + + out: "HEADER=78\n" + + "Header=77\n", + }, + + { + in: "{Header|uppercase}={Integer Header|multiword}\n" + + "{Header|html}={Header Integer|multiword}\n" + + "{Header|html}={Header Integer}\n", + + out: "HEADER=<77><Header>\n" + + "Header=<Header><77>\n" + + "Header=Header77\n", + }, + { + in: "{Raw}\n" + + "{Raw|html}\n", + + out: "a <&> b\n" + + "a <&> b\n", + }, + { + in: "{Bytes}", + out: "hello", + }, + { + in: "{Raw|uppercase|html|html}", + out: "A &lt;&amp;&gt; B", + }, + { + in: "{Header Integer|multiword|html}", + out: "<Header><77>", + }, + { + in: "{Integer|no_formatter|html}", + err: `unknown formatter: "no_formatter"`, + }, + { + in: "{Integer|||||}", // empty string is a valid formatter + out: "77", + }, +} + +func TestFormatters(t *testing.T) { + data := map[string]interface{}{ + "Header": "Header", + "Integer": 77, + "Raw": "a <&> b", + "Bytes": []byte("hello"), + } + for _, c := range formatterTests { + tmpl, err := Parse(c.in, formatters) + if err != nil { + if c.err == "" { + t.Error("unexpected parse error:", err) + continue + } + if strings.Index(err.String(), c.err) < 0 { + t.Errorf("unexpected error: expected %q, got %q", c.err, err.String()) + continue + } + } else { + if c.err != "" { + t.Errorf("For %q, expected error, got none.", c.in) + continue + } + buf := bytes.NewBuffer(nil) + err = tmpl.Execute(buf, data) + if err != nil { + t.Error("unexpected Execute error: ", err) + continue + } + actual := buf.String() + if actual != c.out { + t.Errorf("for %q: expected %q but got %q.", c.in, c.out, actual) + } + } + } +} |