1package reporting
2
3import "testing"
4
5func TestPrint(t *testing.T) {
6	file := newMemoryFile()
7	printer := NewPrinter(file)
8	const expected = "Hello, World!"
9
10	printer.Print(expected)
11
12	if file.buffer != expected {
13		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
14	}
15}
16
17func TestPrintFormat(t *testing.T) {
18	file := newMemoryFile()
19	printer := NewPrinter(file)
20	template := "Hi, %s"
21	name := "Ralph"
22	expected := "Hi, Ralph"
23
24	printer.Print(template, name)
25
26	if file.buffer != expected {
27		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
28	}
29}
30
31func TestPrintPreservesEncodedStrings(t *testing.T) {
32	file := newMemoryFile()
33	printer := NewPrinter(file)
34	const expected = "= -> %%3D"
35	printer.Print(expected)
36
37	if file.buffer != expected {
38		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
39	}
40}
41
42func TestPrintln(t *testing.T) {
43	file := newMemoryFile()
44	printer := NewPrinter(file)
45	const expected = "Hello, World!"
46
47	printer.Println(expected)
48
49	if file.buffer != expected+"\n" {
50		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
51	}
52}
53
54func TestPrintlnFormat(t *testing.T) {
55	file := newMemoryFile()
56	printer := NewPrinter(file)
57	template := "Hi, %s"
58	name := "Ralph"
59	expected := "Hi, Ralph\n"
60
61	printer.Println(template, name)
62
63	if file.buffer != expected {
64		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
65	}
66}
67
68func TestPrintlnPreservesEncodedStrings(t *testing.T) {
69	file := newMemoryFile()
70	printer := NewPrinter(file)
71	const expected = "= -> %%3D"
72	printer.Println(expected)
73
74	if file.buffer != expected+"\n" {
75		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
76	}
77}
78
79func TestPrintIndented(t *testing.T) {
80	file := newMemoryFile()
81	printer := NewPrinter(file)
82	const message = "Hello, World!\nGoodbye, World!"
83	const expected = "  Hello, World!\n  Goodbye, World!"
84
85	printer.Indent()
86	printer.Print(message)
87
88	if file.buffer != expected {
89		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
90	}
91}
92
93func TestPrintDedented(t *testing.T) {
94	file := newMemoryFile()
95	printer := NewPrinter(file)
96	const expected = "Hello, World!\nGoodbye, World!"
97
98	printer.Indent()
99	printer.Dedent()
100	printer.Print(expected)
101
102	if file.buffer != expected {
103		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
104	}
105}
106
107func TestPrintlnIndented(t *testing.T) {
108	file := newMemoryFile()
109	printer := NewPrinter(file)
110	const message = "Hello, World!\nGoodbye, World!"
111	const expected = "  Hello, World!\n  Goodbye, World!\n"
112
113	printer.Indent()
114	printer.Println(message)
115
116	if file.buffer != expected {
117		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
118	}
119}
120
121func TestPrintlnDedented(t *testing.T) {
122	file := newMemoryFile()
123	printer := NewPrinter(file)
124	const expected = "Hello, World!\nGoodbye, World!"
125
126	printer.Indent()
127	printer.Dedent()
128	printer.Println(expected)
129
130	if file.buffer != expected+"\n" {
131		t.Errorf("Expected '%s' to equal '%s'.", expected, file.buffer)
132	}
133}
134
135func TestDedentTooFarShouldNotPanic(t *testing.T) {
136	defer func() {
137		if r := recover(); r != nil {
138			t.Error("Should not have panicked!")
139		}
140	}()
141	file := newMemoryFile()
142	printer := NewPrinter(file)
143
144	printer.Dedent()
145
146	t.Log("Getting to this point without panicking means we passed.")
147}
148
149func TestInsert(t *testing.T) {
150	file := newMemoryFile()
151	printer := NewPrinter(file)
152
153	printer.Indent()
154	printer.Print("Hi")
155	printer.Insert(" there")
156	printer.Dedent()
157
158	expected := "  Hi there"
159	if file.buffer != expected {
160		t.Errorf("Should have written '%s' but instead wrote '%s'.", expected, file.buffer)
161	}
162}
163
164////////////////// memoryFile ////////////////////
165
166type memoryFile struct {
167	buffer string
168}
169
170func (self *memoryFile) Write(p []byte) (n int, err error) {
171	self.buffer += string(p)
172	return len(p), nil
173}
174
175func (self *memoryFile) String() string {
176	return self.buffer
177}
178
179func newMemoryFile() *memoryFile {
180	return new(memoryFile)
181}
182