1 package list
2
3 import (
4 "fmt"
5 "sort"
6 "strings"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 )
11
12 func TestList_Render(t *testing.T) {
13 lw := NewWriter()
14 lw.AppendItem(testItem1)
15 lw.Indent()
16 lw.AppendItems(testItems2)
17 lw.Indent()
18 lw.AppendItems(testItems3)
19 lw.UnIndent()
20 lw.UnIndent()
21 lw.AppendItem(testItem4)
22 lw.Indent()
23 lw.AppendItem(testItem5)
24 lw.SetStyle(styleTest)
25
26 expectedOut := `t Game Of Thrones
27 |f Winter
28 |m Is
29 |b Coming
30 | f This
31 | m Is
32 | b Known
33 b The Dark Tower
34 b The Gunslinger`
35 assert.Equal(t, expectedOut, lw.Render())
36 }
37
38 func TestList_Render_Complex(t *testing.T) {
39 lw := NewWriter()
40 lw.AppendItem("The Houses of Westeros")
41 lw.Indent()
42 lw.AppendItem("The Starks of Winterfell")
43 lw.Indent()
44 lw.AppendItem("Eddard Stark")
45 lw.Indent()
46 lw.AppendItems([]interface{}{"Robb Stark", "Sansa Stark", "Arya Stark", "Bran Stark", "Rickon Stark"})
47 lw.UnIndent()
48 lw.AppendItems([]interface{}{"Lyanna Stark", "Benjen Stark"})
49 lw.UnIndent()
50 lw.AppendItem("The Targaryens of Dragonstone")
51 lw.Indent()
52 lw.AppendItem("Aerys Targaryen")
53 lw.Indent()
54 lw.AppendItems([]interface{}{"Rhaegar Targaryen", "Viserys Targaryen", "Daenerys Targaryen"})
55 lw.UnIndent()
56 lw.UnIndent()
57 lw.AppendItem("The Lannisters of Lannisport")
58 lw.Indent()
59 lw.AppendItem("Tywin Lannister")
60 lw.Indent()
61 lw.AppendItems([]interface{}{"Cersei Lannister", "Jaime Lannister", "Tyrion Lannister"})
62
63 styles := map[Style]string{
64 StyleBulletCircle: "● The Houses of Westeros\n ● The Starks of Winterfell\n ● Eddard Stark\n ● Robb Stark\n ● Sansa Stark\n ● Arya Stark\n ● Bran Stark\n ● Rickon Stark\n ● Lyanna Stark\n ● Benjen Stark\n ● The Targaryens of Dragonstone\n ● Aerys Targaryen\n ● Rhaegar Targaryen\n ● Viserys Targaryen\n ● Daenerys Targaryen\n ● The Lannisters of Lannisport\n ● Tywin Lannister\n ● Cersei Lannister\n ● Jaime Lannister\n ● Tyrion Lannister",
65 StyleBulletFlower: "✽ The Houses of Westeros\n ✽ The Starks of Winterfell\n ✽ Eddard Stark\n ✽ Robb Stark\n ✽ Sansa Stark\n ✽ Arya Stark\n ✽ Bran Stark\n ✽ Rickon Stark\n ✽ Lyanna Stark\n ✽ Benjen Stark\n ✽ The Targaryens of Dragonstone\n ✽ Aerys Targaryen\n ✽ Rhaegar Targaryen\n ✽ Viserys Targaryen\n ✽ Daenerys Targaryen\n ✽ The Lannisters of Lannisport\n ✽ Tywin Lannister\n ✽ Cersei Lannister\n ✽ Jaime Lannister\n ✽ Tyrion Lannister",
66 StyleBulletSquare: "■ The Houses of Westeros\n ■ The Starks of Winterfell\n ■ Eddard Stark\n ■ Robb Stark\n ■ Sansa Stark\n ■ Arya Stark\n ■ Bran Stark\n ■ Rickon Stark\n ■ Lyanna Stark\n ■ Benjen Stark\n ■ The Targaryens of Dragonstone\n ■ Aerys Targaryen\n ■ Rhaegar Targaryen\n ■ Viserys Targaryen\n ■ Daenerys Targaryen\n ■ The Lannisters of Lannisport\n ■ Tywin Lannister\n ■ Cersei Lannister\n ■ Jaime Lannister\n ■ Tyrion Lannister",
67 StyleBulletStar: "★ The Houses of Westeros\n ★ The Starks of Winterfell\n ★ Eddard Stark\n ★ Robb Stark\n ★ Sansa Stark\n ★ Arya Stark\n ★ Bran Stark\n ★ Rickon Stark\n ★ Lyanna Stark\n ★ Benjen Stark\n ★ The Targaryens of Dragonstone\n ★ Aerys Targaryen\n ★ Rhaegar Targaryen\n ★ Viserys Targaryen\n ★ Daenerys Targaryen\n ★ The Lannisters of Lannisport\n ★ Tywin Lannister\n ★ Cersei Lannister\n ★ Jaime Lannister\n ★ Tyrion Lannister",
68 StyleBulletTriangle: "▶ The Houses of Westeros\n ▶ The Starks of Winterfell\n ▶ Eddard Stark\n ▶ Robb Stark\n ▶ Sansa Stark\n ▶ Arya Stark\n ▶ Bran Stark\n ▶ Rickon Stark\n ▶ Lyanna Stark\n ▶ Benjen Stark\n ▶ The Targaryens of Dragonstone\n ▶ Aerys Targaryen\n ▶ Rhaegar Targaryen\n ▶ Viserys Targaryen\n ▶ Daenerys Targaryen\n ▶ The Lannisters of Lannisport\n ▶ Tywin Lannister\n ▶ Cersei Lannister\n ▶ Jaime Lannister\n ▶ Tyrion Lannister",
69 StyleConnectedBold: "━━ The Houses of Westeros\n ┣━ The Starks of Winterfell\n ┃ ┣━ Eddard Stark\n ┃ ┃ ┣━ Robb Stark\n ┃ ┃ ┣━ Sansa Stark\n ┃ ┃ ┣━ Arya Stark\n ┃ ┃ ┣━ Bran Stark\n ┃ ┃ ┗━ Rickon Stark\n ┃ ┣━ Lyanna Stark\n ┃ ┗━ Benjen Stark\n ┣━ The Targaryens of Dragonstone\n ┃ ┗━ Aerys Targaryen\n ┃ ┣━ Rhaegar Targaryen\n ┃ ┣━ Viserys Targaryen\n ┃ ┗━ Daenerys Targaryen\n ┗━ The Lannisters of Lannisport\n ┗━ Tywin Lannister\n ┣━ Cersei Lannister\n ┣━ Jaime Lannister\n ┗━ Tyrion Lannister",
70 StyleConnectedDouble: "══ The Houses of Westeros\n ╠═ The Starks of Winterfell\n ║ ╠═ Eddard Stark\n ║ ║ ╠═ Robb Stark\n ║ ║ ╠═ Sansa Stark\n ║ ║ ╠═ Arya Stark\n ║ ║ ╠═ Bran Stark\n ║ ║ ╚═ Rickon Stark\n ║ ╠═ Lyanna Stark\n ║ ╚═ Benjen Stark\n ╠═ The Targaryens of Dragonstone\n ║ ╚═ Aerys Targaryen\n ║ ╠═ Rhaegar Targaryen\n ║ ╠═ Viserys Targaryen\n ║ ╚═ Daenerys Targaryen\n ╚═ The Lannisters of Lannisport\n ╚═ Tywin Lannister\n ╠═ Cersei Lannister\n ╠═ Jaime Lannister\n ╚═ Tyrion Lannister",
71 StyleConnectedLight: "── The Houses of Westeros\n ├─ The Starks of Winterfell\n │ ├─ Eddard Stark\n │ │ ├─ Robb Stark\n │ │ ├─ Sansa Stark\n │ │ ├─ Arya Stark\n │ │ ├─ Bran Stark\n │ │ └─ Rickon Stark\n │ ├─ Lyanna Stark\n │ └─ Benjen Stark\n ├─ The Targaryens of Dragonstone\n │ └─ Aerys Targaryen\n │ ├─ Rhaegar Targaryen\n │ ├─ Viserys Targaryen\n │ └─ Daenerys Targaryen\n └─ The Lannisters of Lannisport\n └─ Tywin Lannister\n ├─ Cersei Lannister\n ├─ Jaime Lannister\n └─ Tyrion Lannister",
72 StyleConnectedRounded: "── The Houses of Westeros\n ├─ The Starks of Winterfell\n │ ├─ Eddard Stark\n │ │ ├─ Robb Stark\n │ │ ├─ Sansa Stark\n │ │ ├─ Arya Stark\n │ │ ├─ Bran Stark\n │ │ ╰─ Rickon Stark\n │ ├─ Lyanna Stark\n │ ╰─ Benjen Stark\n ├─ The Targaryens of Dragonstone\n │ ╰─ Aerys Targaryen\n │ ├─ Rhaegar Targaryen\n │ ├─ Viserys Targaryen\n │ ╰─ Daenerys Targaryen\n ╰─ The Lannisters of Lannisport\n ╰─ Tywin Lannister\n ├─ Cersei Lannister\n ├─ Jaime Lannister\n ╰─ Tyrion Lannister",
73 StyleDefault: "* The Houses of Westeros\n * The Starks of Winterfell\n * Eddard Stark\n * Robb Stark\n * Sansa Stark\n * Arya Stark\n * Bran Stark\n * Rickon Stark\n * Lyanna Stark\n * Benjen Stark\n * The Targaryens of Dragonstone\n * Aerys Targaryen\n * Rhaegar Targaryen\n * Viserys Targaryen\n * Daenerys Targaryen\n * The Lannisters of Lannisport\n * Tywin Lannister\n * Cersei Lannister\n * Jaime Lannister\n * Tyrion Lannister",
74 StyleMarkdown: " * The Houses of Westeros\n * The Starks of Winterfell\n * Eddard Stark\n * Robb Stark\n * Sansa Stark\n * Arya Stark\n * Bran Stark\n * Rickon Stark\n * Lyanna Stark\n * Benjen Stark\n * The Targaryens of Dragonstone\n * Aerys Targaryen\n * Rhaegar Targaryen\n * Viserys Targaryen\n * Daenerys Targaryen\n * The Lannisters of Lannisport\n * Tywin Lannister\n * Cersei Lannister\n * Jaime Lannister\n * Tyrion Lannister",
75 styleTest: "s The Houses of Westeros\n f The Starks of Winterfell\n |f Eddard Stark\n ||f Robb Stark\n ||m Sansa Stark\n ||m Arya Stark\n ||m Bran Stark\n ||b Rickon Stark\n |m Lyanna Stark\n |b Benjen Stark\n m The Targaryens of Dragonstone\n |b Aerys Targaryen\n | f Rhaegar Targaryen\n | m Viserys Targaryen\n | b Daenerys Targaryen\n b The Lannisters of Lannisport\n b Tywin Lannister\n f Cersei Lannister\n m Jaime Lannister\n b Tyrion Lannister",
76 }
77 var mismatches []string
78 for style, expectedOut := range styles {
79 lw.SetStyle(style)
80 out := lw.Render()
81 assert.Equal(t, expectedOut, out)
82 if expectedOut != out {
83 mismatches = append(mismatches, fmt.Sprintf("%s: %#v,", style.Name, out))
84 fmt.Printf("// %s renders a List like below:\n", style.Name)
85 for _, line := range strings.Split(out, "\n") {
86 fmt.Printf("// %s\n", line)
87 }
88 fmt.Println()
89 }
90 }
91 sort.Strings(mismatches)
92 for _, mismatch := range mismatches {
93 fmt.Println(mismatch)
94 }
95 }
96
97 func TestList_Render_Connected(t *testing.T) {
98 lw := NewWriter()
99 lw.SetStyle(StyleConnectedLight)
100 assert.Empty(t, lw.Render())
101
102 lw.AppendItem(testItem1)
103 expectedOut := "── Game Of Thrones"
104 assert.Equal(t, expectedOut, lw.Render())
105
106 lw.AppendItem(testItem1)
107 expectedOut = `┌─ Game Of Thrones
108 └─ Game Of Thrones`
109 assert.Equal(t, expectedOut, lw.Render())
110
111 lw.AppendItem(testItem1)
112 expectedOut = `┌─ Game Of Thrones
113 ├─ Game Of Thrones
114 └─ Game Of Thrones`
115 assert.Equal(t, expectedOut, lw.Render())
116
117 lw.Indent()
118 lw.AppendItem(testItem1)
119 expectedOut = `┌─ Game Of Thrones
120 ├─ Game Of Thrones
121 └─ Game Of Thrones
122 └─ Game Of Thrones`
123 assert.Equal(t, expectedOut, lw.Render())
124
125 lw.AppendItem(testItem1)
126 expectedOut = `┌─ Game Of Thrones
127 ├─ Game Of Thrones
128 └─ Game Of Thrones
129 ├─ Game Of Thrones
130 └─ Game Of Thrones`
131 assert.Equal(t, expectedOut, lw.Render())
132
133 lw.Indent()
134 lw.AppendItem(testItem1)
135 expectedOut = `┌─ Game Of Thrones
136 ├─ Game Of Thrones
137 └─ Game Of Thrones
138 ├─ Game Of Thrones
139 └─ Game Of Thrones
140 └─ Game Of Thrones`
141 assert.Equal(t, expectedOut, lw.Render())
142
143 lw.UnIndent()
144 lw.AppendItem(testItem1)
145 expectedOut = `┌─ Game Of Thrones
146 ├─ Game Of Thrones
147 └─ Game Of Thrones
148 ├─ Game Of Thrones
149 ├─ Game Of Thrones
150 │ └─ Game Of Thrones
151 └─ Game Of Thrones`
152 assert.Equal(t, expectedOut, lw.Render())
153
154 lw.UnIndent()
155 lw.AppendItem(testItem1)
156 expectedOut = `┌─ Game Of Thrones
157 ├─ Game Of Thrones
158 ├─ Game Of Thrones
159 │ ├─ Game Of Thrones
160 │ ├─ Game Of Thrones
161 │ │ └─ Game Of Thrones
162 │ └─ Game Of Thrones
163 └─ Game Of Thrones`
164 assert.Equal(t, expectedOut, lw.Render())
165 }
166
167 func TestList_Render_MultiLine(t *testing.T) {
168 lw := NewWriter()
169 lw.AppendItem(testItem1ML)
170 lw.Indent()
171 lw.AppendItems(testItems2ML)
172 lw.Indent()
173 lw.AppendItems(testItems3ML)
174 lw.UnIndent()
175 lw.UnIndent()
176 lw.AppendItem(testItem4ML)
177 lw.Indent()
178 lw.AppendItem(testItem5)
179
180 expectedOut := `* Game Of Thrones
181 // George. R. R. Martin
182 * Winter
183 Is
184 Coming
185 * Is
186 * Coming
187 * This
188 Is
189 Known
190 * Is
191 * Known
192 * The Dark Tower
193 // Stephen King
194 * The Gunslinger`
195 assert.Equal(t, expectedOut, lw.Render())
196
197 expectedOutRounded := `╭─ Game Of Thrones
198 │ // George. R. R. Martin
199 │ ├─ Winter
200 │ │ Is
201 │ │ Coming
202 │ ├─ Is
203 │ ╰─ Coming
204 │ ├─ This
205 │ │ Is
206 │ │ Known
207 │ ├─ Is
208 │ ╰─ Known
209 ╰─ The Dark Tower
210 // Stephen King
211 ╰─ The Gunslinger`
212 lw.SetStyle(StyleConnectedRounded)
213 assert.Equal(t, expectedOutRounded, lw.Render())
214
215 expectedOutHTML := `<ul class="go-pretty-table">
216 <li>Game Of Thrones<br/> // George. R. R. Martin</li>
217 <ul class="go-pretty-table-1">
218 <li>Winter<br/>Is<br/>Coming</li>
219 <li>Is</li>
220 <li>Coming</li>
221 <ul class="go-pretty-table-2">
222 <li>This<br/>Is<br/>Known</li>
223 <li>Is</li>
224 <li>Known</li>
225 </ul>
226 </ul>
227 <li>The Dark Tower<br/> // Stephen King</li>
228 <ul class="go-pretty-table-1">
229 <li>The Gunslinger</li>
230 </ul>
231 </ul>`
232 assert.Equal(t, expectedOutHTML, lw.RenderHTML())
233
234 expectedOutMarkdown := ` * Game Of Thrones<br/> // George. R. R. Martin
235 * Winter<br/>Is<br/>Coming
236 * Is
237 * Coming
238 * This<br/>Is<br/>Known
239 * Is
240 * Known
241 * The Dark Tower<br/> // Stephen King
242 * The Gunslinger`
243 assert.Equal(t, expectedOutMarkdown, lw.RenderMarkdown())
244 }
245
246 func TestList_Render_Styles(t *testing.T) {
247 lw := NewWriter()
248 lw.AppendItem(testItem1)
249 lw.Indent()
250 lw.AppendItems(testItems2)
251 lw.Indent()
252 lw.AppendItems(testItems3)
253 lw.UnIndent()
254 lw.UnIndent()
255 lw.AppendItem(testItem4)
256 lw.Indent()
257 lw.AppendItem(testItem5)
258
259 styles := map[Style]string{
260 StyleBulletCircle: "● Game Of Thrones\n ● Winter\n ● Is\n ● Coming\n ● This\n ● Is\n ● Known\n● The Dark Tower\n ● The Gunslinger",
261 StyleBulletFlower: "✽ Game Of Thrones\n ✽ Winter\n ✽ Is\n ✽ Coming\n ✽ This\n ✽ Is\n ✽ Known\n✽ The Dark Tower\n ✽ The Gunslinger",
262 StyleBulletSquare: "■ Game Of Thrones\n ■ Winter\n ■ Is\n ■ Coming\n ■ This\n ■ Is\n ■ Known\n■ The Dark Tower\n ■ The Gunslinger",
263 StyleBulletStar: "★ Game Of Thrones\n ★ Winter\n ★ Is\n ★ Coming\n ★ This\n ★ Is\n ★ Known\n★ The Dark Tower\n ★ The Gunslinger",
264 StyleBulletTriangle: "▶ Game Of Thrones\n ▶ Winter\n ▶ Is\n ▶ Coming\n ▶ This\n ▶ Is\n ▶ Known\n▶ The Dark Tower\n ▶ The Gunslinger",
265 StyleConnectedBold: "┏━ Game Of Thrones\n┃ ┣━ Winter\n┃ ┣━ Is\n┃ ┗━ Coming\n┃ ┣━ This\n┃ ┣━ Is\n┃ ┗━ Known\n┗━ The Dark Tower\n ┗━ The Gunslinger",
266 StyleConnectedDouble: "╔═ Game Of Thrones\n║ ╠═ Winter\n║ ╠═ Is\n║ ╚═ Coming\n║ ╠═ This\n║ ╠═ Is\n║ ╚═ Known\n╚═ The Dark Tower\n ╚═ The Gunslinger",
267 StyleConnectedLight: "┌─ Game Of Thrones\n│ ├─ Winter\n│ ├─ Is\n│ └─ Coming\n│ ├─ This\n│ ├─ Is\n│ └─ Known\n└─ The Dark Tower\n └─ The Gunslinger",
268 StyleConnectedRounded: "╭─ Game Of Thrones\n│ ├─ Winter\n│ ├─ Is\n│ ╰─ Coming\n│ ├─ This\n│ ├─ Is\n│ ╰─ Known\n╰─ The Dark Tower\n ╰─ The Gunslinger",
269 StyleDefault: "* Game Of Thrones\n * Winter\n * Is\n * Coming\n * This\n * Is\n * Known\n* The Dark Tower\n * The Gunslinger",
270 StyleMarkdown: " * Game Of Thrones\n * Winter\n * Is\n * Coming\n * This\n * Is\n * Known\n * The Dark Tower\n * The Gunslinger",
271 styleTest: "t Game Of Thrones\n|f Winter\n|m Is\n|b Coming\n| f This\n| m Is\n| b Known\nb The Dark Tower\n b The Gunslinger",
272 }
273 var mismatches []string
274 for style, expectedOut := range styles {
275 lw.SetStyle(style)
276 out := lw.Render()
277 assert.Equal(t, expectedOut, out)
278 if expectedOut != out {
279 mismatches = append(mismatches, fmt.Sprintf("%s: %#v,", style.Name, out))
280 fmt.Printf("// %s renders a List like below:\n", style.Name)
281 for _, line := range strings.Split(out, "\n") {
282 fmt.Printf("// %s\n", line)
283 }
284 fmt.Println()
285 }
286 }
287 sort.Strings(mismatches)
288 for _, mismatch := range mismatches {
289 fmt.Println(mismatch)
290 }
291 }
292
293 func TestList_Render_UnindentAll(t *testing.T) {
294 lw := NewWriter()
295 lw.AppendItem(testItem1)
296 lw.Indent()
297 lw.AppendItems(testItems2)
298 lw.Indent()
299 lw.AppendItems(testItems3)
300 lw.UnIndentAll()
301 lw.AppendItem(testItem4)
302 lw.Indent()
303 lw.AppendItem(testItem5)
304 lw.UnIndentAll()
305 lw.AppendItem("The Mandalorian")
306 lw.Indent()
307 lw.AppendItem("This")
308 lw.Indent()
309 lw.AppendItem("Is")
310 lw.Indent()
311 lw.AppendItem("The")
312 lw.Indent()
313 lw.AppendItem("Way")
314 lw.Indent()
315 lw.UnIndentAll()
316 lw.AppendItem("Right?")
317
318 expectedOut := `* Game Of Thrones
319 * Winter
320 * Is
321 * Coming
322 * This
323 * Is
324 * Known
325 * The Dark Tower
326 * The Gunslinger
327 * The Mandalorian
328 * This
329 * Is
330 * The
331 * Way
332 * Right?`
333 assert.Equal(t, expectedOut, lw.Render())
334
335 }
336
View as plain text