// Copyright 2009 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 template

import (
	"bytes";
	"container/vector";
	"fmt";
	"io";
	"testing";
)

type Test struct {
	in, out, err string;
}

type T struct {
	item	string;
	value	string;
}

type S struct {
	header		string;
	integer		int;
	raw		string;
	innerT		T;
	innerPointerT	*T;
	data		[]T;
	pdata		[]*T;
	empty		[]*T;
	emptystring	string;
	null		[]*T;
	vec		*vector.Vector;
	true		bool;
	false		bool;
}

var t1 = T{"ItemNumber1", "ValueNumber1"}
var t2 = T{"ItemNumber2", "ValueNumber2"}

func uppercase(v interface{}) string {
	s := v.(string);
	t := "";
	for i := 0; i < len(s); i++ {
		c := s[i];
		if 'a' <= c && c <= 'z' {
			c = c+'A'-'a';
		}
		t += string(c);
	}
	return t;
}

func plus1(v interface{}) string {
	i := v.(int);
	return fmt.Sprint(i+1);
}

func writer(f func(interface{}) string) (func(io.Writer, interface{}, string)) {
	return func(w io.Writer, v interface{}, format string) { io.WriteString(w, f(v)) };
}


var formatters = FormatterMap{
	"uppercase": writer(uppercase),
	"+1": writer(plus1),
}

var tests = []*Test{
	// Simple
	&Test{"", "", ""},
	&Test{"abc\ndef\n", "abc\ndef\n", ""},
	&Test{" {.meta-left}   \n", "{", ""},
	&Test{" {.meta-right}   \n", "}", ""},
	&Test{" {.space}   \n", " ", ""},
	&Test{" {.tab}   \n", "\t", ""},
	&Test{"     {#comment}   \n", "", ""},

	// Variables at top level
	&Test{
		in: "{header}={integer}\n",

		out: "Header=77\n",
	},

	// Section
	&Test{
		in: "{.section data }\n"
			"some text for the section\n"
			"{.end}\n",

		out: "some text for the section\n",
	},
	&Test{
		in: "{.section data }\n"
			"{header}={integer}\n"
			"{.end}\n",

		out: "Header=77\n",
	},
	&Test{
		in: "{.section pdata }\n"
			"{header}={integer}\n"
			"{.end}\n",

		out: "Header=77\n",
	},
	&Test{
		in: "{.section pdata }\n"
			"data present\n"
			"{.or}\n"
			"data not present\n"
			"{.end}\n",

		out: "data present\n",
	},
	&Test{
		in: "{.section empty }\n"
			"data present\n"
			"{.or}\n"
			"data not present\n"
			"{.end}\n",

		out: "data not present\n",
	},
	&Test{
		in: "{.section null }\n"
			"data present\n"
			"{.or}\n"
			"data not present\n"
			"{.end}\n",

		out: "data not present\n",
	},
	&Test{
		in: "{.section pdata }\n"
			"{header}={integer}\n"
			"{.section @ }\n"
			"{header}={integer}\n"
			"{.end}\n"
			"{.end}\n",

		out: "Header=77\n"
			"Header=77\n",
	},
	&Test{
		in: "{.section data}{.end} {header}\n",

		out: " Header\n",
	},

	// Repeated
	&Test{
		in: "{.section pdata }\n"
			"{.repeated section @ }\n"
			"{item}={value}\n"
			"{.end}\n"
			"{.end}\n",

		out: "ItemNumber1=ValueNumber1\n"
			"ItemNumber2=ValueNumber2\n",
	},
	&Test{
		in: "{.section pdata }\n"
			"{.repeated section @ }\n"
			"{item}={value}\n"
			"{.or}\n"
			"this should not appear\n"
			"{.end}\n"
			"{.end}\n",

		out: "ItemNumber1=ValueNumber1\n"
			"ItemNumber2=ValueNumber2\n",
	},
	&Test{
		in: "{.section @ }\n"
			"{.repeated section empty }\n"
			"{item}={value}\n"
			"{.or}\n"
			"this should appear: empty field\n"
			"{.end}\n"
			"{.end}\n",

		out: "this should appear: empty field\n",
	},
	&Test{
		in: "{.repeated section pdata }\n"
			"{item}\n"
			"{.alternates with}\n"
			"is\nover\nmultiple\nlines\n"
			"{.end}\n",

		out: "ItemNumber1\n"
			"is\nover\nmultiple\nlines\n"
			"ItemNumber2\n",
	},
	&Test{
		in: "{.section pdata }\n"
			"{.repeated section @ }\n"
			"{item}={value}\n"
			"{.alternates with}DIVIDER\n"
			"{.or}\n"
			"this should not appear\n"
			"{.end}\n"
			"{.end}\n",

		out: "ItemNumber1=ValueNumber1\n"
			"DIVIDER\n"
			"ItemNumber2=ValueNumber2\n",
	},
	&Test{
		in: "{.repeated section vec }\n"
			"{@}\n"
			"{.end}\n",

		out: "elt1\n"
			"elt2\n",
	},
	&Test{
		in: "{.repeated section integer}{.end}",

		err: "line 1: .repeated: cannot repeat integer (type int)",
	},

	// Nested names
	&Test{
		in: "{.section @ }\n"
			"{innerT.item}={innerT.value}\n"
			"{.end}",

		out: "ItemNumber1=ValueNumber1\n",
	},
	&Test{
		in: "{.section @ }\n"
			"{innerT.item}={.section innerT}{.section value}{@}{.end}{.end}\n"
			"{.end}",

		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: "{raw}\n"
			"{raw|html}\n",

		out: "&<>!@ #$%^\n"
			"&amp;&lt;&gt;!@ #$%^\n",
	},

	&Test{
		in: "{.section emptystring}emptystring{.end}\n"
			"{.section header}header{.end}\n",

		out: "\nheader\n",
	},

	&Test{
		in: "{.section true}1{.or}2{.end}\n"
			"{.section false}3{.or}4{.end}\n",

		out: "1\n4\n",
	},
}

func TestAll(t *testing.T) {
	s := new(S);
	// initialized by hand for clarity.
	s.header = "Header";
	s.integer = 77;
	s.raw = "&<>!@ #$%^";
	s.innerT = t1;
	s.data = []T{t1, t2};
	s.pdata = []*T{&t1, &t2};
	s.empty = []*T{};
	s.null = nil;
	s.vec = vector.New(0);
	s.vec.Push("elt1");
	s.vec.Push("elt2");
	s.true = true;
	s.false = false;

	var buf bytes.Buffer;
	for _, test := range tests {
		buf.Reset();
		tmpl, err := Parse(test.in, formatters);
		if err != nil {
			t.Error("unexpected parse error:", err);
			continue;
		}
		err = tmpl.Execute(s, &buf);
		if test.err == "" {
			if err != nil {
				t.Error("unexpected execute error:", err);
			}
		} else {
			if err == nil || err.String() != test.err {
				t.Errorf("expected execute error %q, got %q", test.err, err.String());
			}
		}
		if buf.String() != test.out {
			t.Errorf("for %q: expected %q got %q", test.in, test.out, buf.String());
		}
	}
}

func TestStringDriverType(t *testing.T) {
	tmpl, err := Parse("template: {@}", nil);
	if err != nil {
		t.Error("unexpected parse error:", err);
	}
	var b bytes.Buffer;
	err = tmpl.Execute("hello", &b);
	if err != nil {
		t.Error("unexpected execute error:", err);
	}
	s := b.String();
	if s != "template: hello" {
		t.Errorf("failed passing string as data: expected %q got %q", "template: hello", s);
	}
}

func TestTwice(t *testing.T) {
	tmpl, err := Parse("template: {@}", nil);
	if err != nil {
		t.Error("unexpected parse error:", err);
	}
	var b bytes.Buffer;
	err = tmpl.Execute("hello", &b);
	if err != nil {
		t.Error("unexpected parse error:", err);
	}
	s := b.String();
	text := "template: hello";
	if s != text {
		t.Errorf("failed passing string as data: expected %q got %q", text, s);
	}
	err = tmpl.Execute("hello", &b);
	if err != nil {
		t.Error("unexpected parse error:", err);
	}
	s = b.String();
	text += text;
	if s != text {
		t.Errorf("failed passing string as data: expected %q got %q", text, s);
	}
}

func TestCustomDelims(t *testing.T) {
	// try various lengths.  zero should catch error.
	for i := 0; i < 7; i++ {
		for j := 0; j < 7; j++ {
			tmpl := New(nil);
			// first two chars deliberately the same to test equal left and right delims
			ldelim := "$!#$%^&"[0:i];
			rdelim := "$*&^%$!"[0:j];
			tmpl.SetDelims(ldelim, rdelim);
			// if braces, this would be template: {@}{.meta-left}{.meta-right}
			text := "template: " +
				ldelim + "@" + rdelim +
				ldelim + ".meta-left" + rdelim +
				ldelim + ".meta-right" + rdelim;
			err := tmpl.Parse(text);
			if err != nil {
				if i == 0 || j == 0 {	// expected
					continue;
				}
				t.Error("unexpected parse error:", err);
			} else if i == 0 || j == 0 {
				t.Errorf("expected parse error for empty delimiter: %d %d %q %q", i, j, ldelim, rdelim);
				continue;
			}
			var b bytes.Buffer;
			err = tmpl.Execute("hello", &b);
			s := b.String();
			if s != "template: hello" + ldelim + rdelim {
				t.Errorf("failed delim check(%q %q) %q got %q", ldelim, rdelim, text, s);
			}
		}
	}
}

// Test that a variable evaluates to the field itself and does not further indirection
func TestVarIndirection(t *testing.T) {
	s := new(S);
	// initialized by hand for clarity.
	s.innerPointerT = &t1;

	var buf bytes.Buffer;
	input := "{.section @}{innerPointerT}{.end}";
	tmpl, err := Parse(input, nil);
	if err != nil {
		t.Fatal("unexpected parse error:", err);
	}
	err = tmpl.Execute(s, &buf);
	if err != nil {
		t.Fatal("unexpected execute error:", err);
	}
	expect := fmt.Sprintf("%v", &t1);	// output should be hex address of t1
	if buf.String() != expect {
		t.Errorf("for %q: expected %q got %q", input, expect, buf.String());
	}
}
