2 * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 NOTE: For each test, a nil pointer, a single pointer and double pointer to the
20 base test element are also tested to ensure proper indirection across all types.
22 - Max int8, int16, int32, int64, int
23 - Max uint8, uint16, uint32, uint64, uint
24 - Boolean true and false
25 - Standard complex64 and complex128
26 - Array containing standard ints
27 - Array containing type with custom formatter on pointer receiver only
28 - Array containing interfaces
29 - Slice containing standard float32 values
30 - Slice containing type with custom formatter on pointer receiver only
31 - Slice containing interfaces
36 - Map with string keys and int vals
37 - Map with custom formatter type on pointer receiver only keys and vals
38 - Map with interface keys and values
39 - Map with nil interface value
40 - Struct with primitives
41 - Struct that contains another struct
42 - Struct that contains custom type with Stringer pointer interface via both
43 exported and unexported fields
44 - Struct that contains embedded struct and field to same struct
45 - Uintptr to 0 (null pointer)
46 - Uintptr address of real variable
47 - Unsafe.Pointer to 0 (null pointer)
48 - Unsafe.Pointer to address of real variable
50 - Standard int channel
51 - Function with no params and no returns
52 - Function with param and no returns
53 - Function with multiple params and multiple returns
54 - Struct that is circular through self referencing
55 - Structs that are circular through cross referencing
56 - Structs that are indirectly circular
57 - Type that panics in its Stringer interface
58 - Type that has a custom Error interface
59 - %x passthrough with uint
60 - %#x passthrough with uint
61 - %f passthrough with precision
62 - %f passthrough with width and precision
63 - %d passthrough with width
64 - %q passthrough with string
75 "github.com/davecgh/go-spew/spew"
78 // formatterTest is used to describe a test to be performed against NewFormatter.
79 type formatterTest struct {
85 // formatterTests houses all of the tests to be performed against NewFormatter.
86 var formatterTests = make([]formatterTest, 0)
88 // addFormatterTest is a helper method to append the passed input and desired
89 // result to formatterTests.
90 func addFormatterTest(format string, in interface{}, wants ...string) {
91 test := formatterTest{format, in, wants}
92 formatterTests = append(formatterTests, test)
95 func addIntFormatterTests() {
100 vAddr := fmt.Sprintf("%p", pv)
101 pvAddr := fmt.Sprintf("%p", &pv)
104 addFormatterTest("%v", v, vs)
105 addFormatterTest("%v", pv, "<*>"+vs)
106 addFormatterTest("%v", &pv, "<**>"+vs)
107 addFormatterTest("%v", nv, "<nil>")
108 addFormatterTest("%+v", v, vs)
109 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
110 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
111 addFormatterTest("%+v", nv, "<nil>")
112 addFormatterTest("%#v", v, "("+vt+")"+vs)
113 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
114 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
115 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
116 addFormatterTest("%#+v", v, "("+vt+")"+vs)
117 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
118 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
119 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
125 v2Addr := fmt.Sprintf("%p", pv2)
126 pv2Addr := fmt.Sprintf("%p", &pv2)
129 addFormatterTest("%v", v2, v2s)
130 addFormatterTest("%v", pv2, "<*>"+v2s)
131 addFormatterTest("%v", &pv2, "<**>"+v2s)
132 addFormatterTest("%v", nv2, "<nil>")
133 addFormatterTest("%+v", v2, v2s)
134 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
135 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
136 addFormatterTest("%+v", nv2, "<nil>")
137 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
138 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
139 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
140 addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
141 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
142 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
143 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
144 addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
147 v3 := int32(2147483647)
150 v3Addr := fmt.Sprintf("%p", pv3)
151 pv3Addr := fmt.Sprintf("%p", &pv3)
154 addFormatterTest("%v", v3, v3s)
155 addFormatterTest("%v", pv3, "<*>"+v3s)
156 addFormatterTest("%v", &pv3, "<**>"+v3s)
157 addFormatterTest("%v", nv3, "<nil>")
158 addFormatterTest("%+v", v3, v3s)
159 addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
160 addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
161 addFormatterTest("%+v", nv3, "<nil>")
162 addFormatterTest("%#v", v3, "("+v3t+")"+v3s)
163 addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s)
164 addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s)
165 addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
166 addFormatterTest("%#+v", v3, "("+v3t+")"+v3s)
167 addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s)
168 addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s)
169 addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
172 v4 := int64(9223372036854775807)
175 v4Addr := fmt.Sprintf("%p", pv4)
176 pv4Addr := fmt.Sprintf("%p", &pv4)
178 v4s := "9223372036854775807"
179 addFormatterTest("%v", v4, v4s)
180 addFormatterTest("%v", pv4, "<*>"+v4s)
181 addFormatterTest("%v", &pv4, "<**>"+v4s)
182 addFormatterTest("%v", nv4, "<nil>")
183 addFormatterTest("%+v", v4, v4s)
184 addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s)
185 addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s)
186 addFormatterTest("%+v", nv4, "<nil>")
187 addFormatterTest("%#v", v4, "("+v4t+")"+v4s)
188 addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s)
189 addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s)
190 addFormatterTest("%#v", nv4, "(*"+v4t+")"+"<nil>")
191 addFormatterTest("%#+v", v4, "("+v4t+")"+v4s)
192 addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s)
193 addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s)
194 addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"<nil>")
197 v5 := int(2147483647)
200 v5Addr := fmt.Sprintf("%p", pv5)
201 pv5Addr := fmt.Sprintf("%p", &pv5)
204 addFormatterTest("%v", v5, v5s)
205 addFormatterTest("%v", pv5, "<*>"+v5s)
206 addFormatterTest("%v", &pv5, "<**>"+v5s)
207 addFormatterTest("%v", nv5, "<nil>")
208 addFormatterTest("%+v", v5, v5s)
209 addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s)
210 addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s)
211 addFormatterTest("%+v", nv5, "<nil>")
212 addFormatterTest("%#v", v5, "("+v5t+")"+v5s)
213 addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s)
214 addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s)
215 addFormatterTest("%#v", nv5, "(*"+v5t+")"+"<nil>")
216 addFormatterTest("%#+v", v5, "("+v5t+")"+v5s)
217 addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s)
218 addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s)
219 addFormatterTest("%#+v", nv5, "(*"+v5t+")"+"<nil>")
222 func addUintFormatterTests() {
227 vAddr := fmt.Sprintf("%p", pv)
228 pvAddr := fmt.Sprintf("%p", &pv)
231 addFormatterTest("%v", v, vs)
232 addFormatterTest("%v", pv, "<*>"+vs)
233 addFormatterTest("%v", &pv, "<**>"+vs)
234 addFormatterTest("%v", nv, "<nil>")
235 addFormatterTest("%+v", v, vs)
236 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
237 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
238 addFormatterTest("%+v", nv, "<nil>")
239 addFormatterTest("%#v", v, "("+vt+")"+vs)
240 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
241 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
242 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
243 addFormatterTest("%#+v", v, "("+vt+")"+vs)
244 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
245 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
246 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
250 nv2 := (*uint16)(nil)
252 v2Addr := fmt.Sprintf("%p", pv2)
253 pv2Addr := fmt.Sprintf("%p", &pv2)
256 addFormatterTest("%v", v2, v2s)
257 addFormatterTest("%v", pv2, "<*>"+v2s)
258 addFormatterTest("%v", &pv2, "<**>"+v2s)
259 addFormatterTest("%v", nv2, "<nil>")
260 addFormatterTest("%+v", v2, v2s)
261 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
262 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
263 addFormatterTest("%+v", nv2, "<nil>")
264 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
265 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
266 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
267 addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
268 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
269 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
270 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
271 addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
274 v3 := uint32(4294967295)
275 nv3 := (*uint32)(nil)
277 v3Addr := fmt.Sprintf("%p", pv3)
278 pv3Addr := fmt.Sprintf("%p", &pv3)
281 addFormatterTest("%v", v3, v3s)
282 addFormatterTest("%v", pv3, "<*>"+v3s)
283 addFormatterTest("%v", &pv3, "<**>"+v3s)
284 addFormatterTest("%v", nv3, "<nil>")
285 addFormatterTest("%+v", v3, v3s)
286 addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
287 addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
288 addFormatterTest("%+v", nv3, "<nil>")
289 addFormatterTest("%#v", v3, "("+v3t+")"+v3s)
290 addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s)
291 addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s)
292 addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
293 addFormatterTest("%#+v", v3, "("+v3t+")"+v3s)
294 addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s)
295 addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s)
296 addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
299 v4 := uint64(18446744073709551615)
300 nv4 := (*uint64)(nil)
302 v4Addr := fmt.Sprintf("%p", pv4)
303 pv4Addr := fmt.Sprintf("%p", &pv4)
305 v4s := "18446744073709551615"
306 addFormatterTest("%v", v4, v4s)
307 addFormatterTest("%v", pv4, "<*>"+v4s)
308 addFormatterTest("%v", &pv4, "<**>"+v4s)
309 addFormatterTest("%v", nv4, "<nil>")
310 addFormatterTest("%+v", v4, v4s)
311 addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s)
312 addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s)
313 addFormatterTest("%+v", nv4, "<nil>")
314 addFormatterTest("%#v", v4, "("+v4t+")"+v4s)
315 addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s)
316 addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s)
317 addFormatterTest("%#v", nv4, "(*"+v4t+")"+"<nil>")
318 addFormatterTest("%#+v", v4, "("+v4t+")"+v4s)
319 addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s)
320 addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s)
321 addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"<nil>")
324 v5 := uint(4294967295)
327 v5Addr := fmt.Sprintf("%p", pv5)
328 pv5Addr := fmt.Sprintf("%p", &pv5)
331 addFormatterTest("%v", v5, v5s)
332 addFormatterTest("%v", pv5, "<*>"+v5s)
333 addFormatterTest("%v", &pv5, "<**>"+v5s)
334 addFormatterTest("%v", nv5, "<nil>")
335 addFormatterTest("%+v", v5, v5s)
336 addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s)
337 addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s)
338 addFormatterTest("%+v", nv5, "<nil>")
339 addFormatterTest("%#v", v5, "("+v5t+")"+v5s)
340 addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s)
341 addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s)
342 addFormatterTest("%#v", nv5, "(*"+v5t+")"+"<nil>")
343 addFormatterTest("%#+v", v5, "("+v5t+")"+v5s)
344 addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s)
345 addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s)
346 addFormatterTest("%#v", nv5, "(*"+v5t+")"+"<nil>")
349 func addBoolFormatterTests() {
354 vAddr := fmt.Sprintf("%p", pv)
355 pvAddr := fmt.Sprintf("%p", &pv)
358 addFormatterTest("%v", v, vs)
359 addFormatterTest("%v", pv, "<*>"+vs)
360 addFormatterTest("%v", &pv, "<**>"+vs)
361 addFormatterTest("%v", nv, "<nil>")
362 addFormatterTest("%+v", v, vs)
363 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
364 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
365 addFormatterTest("%+v", nv, "<nil>")
366 addFormatterTest("%#v", v, "("+vt+")"+vs)
367 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
368 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
369 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
370 addFormatterTest("%#+v", v, "("+vt+")"+vs)
371 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
372 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
373 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
378 v2Addr := fmt.Sprintf("%p", pv2)
379 pv2Addr := fmt.Sprintf("%p", &pv2)
382 addFormatterTest("%v", v2, v2s)
383 addFormatterTest("%v", pv2, "<*>"+v2s)
384 addFormatterTest("%v", &pv2, "<**>"+v2s)
385 addFormatterTest("%+v", v2, v2s)
386 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
387 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
388 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
389 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
390 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
391 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
392 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
393 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
396 func addFloatFormatterTests() {
399 nv := (*float32)(nil)
401 vAddr := fmt.Sprintf("%p", pv)
402 pvAddr := fmt.Sprintf("%p", &pv)
405 addFormatterTest("%v", v, vs)
406 addFormatterTest("%v", pv, "<*>"+vs)
407 addFormatterTest("%v", &pv, "<**>"+vs)
408 addFormatterTest("%v", nv, "<nil>")
409 addFormatterTest("%+v", v, vs)
410 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
411 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
412 addFormatterTest("%+v", nv, "<nil>")
413 addFormatterTest("%#v", v, "("+vt+")"+vs)
414 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
415 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
416 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
417 addFormatterTest("%#+v", v, "("+vt+")"+vs)
418 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
419 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
420 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
423 v2 := float64(3.1415926)
424 nv2 := (*float64)(nil)
426 v2Addr := fmt.Sprintf("%p", pv2)
427 pv2Addr := fmt.Sprintf("%p", &pv2)
430 addFormatterTest("%v", v2, v2s)
431 addFormatterTest("%v", pv2, "<*>"+v2s)
432 addFormatterTest("%v", &pv2, "<**>"+v2s)
433 addFormatterTest("%+v", nv2, "<nil>")
434 addFormatterTest("%+v", v2, v2s)
435 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
436 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
437 addFormatterTest("%+v", nv2, "<nil>")
438 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
439 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
440 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
441 addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
442 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
443 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
444 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
445 addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
448 func addComplexFormatterTests() {
449 // Standard complex64.
450 v := complex(float32(6), -2)
451 nv := (*complex64)(nil)
453 vAddr := fmt.Sprintf("%p", pv)
454 pvAddr := fmt.Sprintf("%p", &pv)
457 addFormatterTest("%v", v, vs)
458 addFormatterTest("%v", pv, "<*>"+vs)
459 addFormatterTest("%v", &pv, "<**>"+vs)
460 addFormatterTest("%+v", nv, "<nil>")
461 addFormatterTest("%+v", v, vs)
462 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
463 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
464 addFormatterTest("%+v", nv, "<nil>")
465 addFormatterTest("%#v", v, "("+vt+")"+vs)
466 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
467 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
468 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
469 addFormatterTest("%#+v", v, "("+vt+")"+vs)
470 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
471 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
472 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
474 // Standard complex128.
475 v2 := complex(float64(-6), 2)
476 nv2 := (*complex128)(nil)
478 v2Addr := fmt.Sprintf("%p", pv2)
479 pv2Addr := fmt.Sprintf("%p", &pv2)
482 addFormatterTest("%v", v2, v2s)
483 addFormatterTest("%v", pv2, "<*>"+v2s)
484 addFormatterTest("%v", &pv2, "<**>"+v2s)
485 addFormatterTest("%+v", nv2, "<nil>")
486 addFormatterTest("%+v", v2, v2s)
487 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
488 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
489 addFormatterTest("%+v", nv2, "<nil>")
490 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
491 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
492 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
493 addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
494 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
495 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
496 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
497 addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
500 func addArrayFormatterTests() {
501 // Array containing standard ints.
505 vAddr := fmt.Sprintf("%p", pv)
506 pvAddr := fmt.Sprintf("%p", &pv)
509 addFormatterTest("%v", v, vs)
510 addFormatterTest("%v", pv, "<*>"+vs)
511 addFormatterTest("%v", &pv, "<**>"+vs)
512 addFormatterTest("%+v", nv, "<nil>")
513 addFormatterTest("%+v", v, vs)
514 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
515 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
516 addFormatterTest("%+v", nv, "<nil>")
517 addFormatterTest("%#v", v, "("+vt+")"+vs)
518 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
519 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
520 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
521 addFormatterTest("%#+v", v, "("+vt+")"+vs)
522 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
523 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
524 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
526 // Array containing type with custom formatter on pointer receiver only.
527 v2 := [3]pstringer{"1", "2", "3"}
528 nv2 := (*[3]pstringer)(nil)
530 v2Addr := fmt.Sprintf("%p", pv2)
531 pv2Addr := fmt.Sprintf("%p", &pv2)
532 v2t := "[3]spew_test.pstringer"
533 v2sp := "[stringer 1 stringer 2 stringer 3]"
535 if spew.UnsafeDisabled {
538 addFormatterTest("%v", v2, v2s)
539 addFormatterTest("%v", pv2, "<*>"+v2sp)
540 addFormatterTest("%v", &pv2, "<**>"+v2sp)
541 addFormatterTest("%+v", nv2, "<nil>")
542 addFormatterTest("%+v", v2, v2s)
543 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2sp)
544 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2sp)
545 addFormatterTest("%+v", nv2, "<nil>")
546 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
547 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2sp)
548 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2sp)
549 addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
550 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
551 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2sp)
552 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2sp)
553 addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
555 // Array containing interfaces.
556 v3 := [3]interface{}{"one", int(2), uint(3)}
557 nv3 := (*[3]interface{})(nil)
559 v3Addr := fmt.Sprintf("%p", pv3)
560 pv3Addr := fmt.Sprintf("%p", &pv3)
561 v3t := "[3]interface {}"
566 v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3]"
567 addFormatterTest("%v", v3, v3s)
568 addFormatterTest("%v", pv3, "<*>"+v3s)
569 addFormatterTest("%v", &pv3, "<**>"+v3s)
570 addFormatterTest("%+v", nv3, "<nil>")
571 addFormatterTest("%+v", v3, v3s)
572 addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
573 addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
574 addFormatterTest("%+v", nv3, "<nil>")
575 addFormatterTest("%#v", v3, "("+v3t+")"+v3s2)
576 addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2)
577 addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2)
578 addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
579 addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2)
580 addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2)
581 addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2)
582 addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
585 func addSliceFormatterTests() {
586 // Slice containing standard float32 values.
587 v := []float32{3.14, 6.28, 12.56}
588 nv := (*[]float32)(nil)
590 vAddr := fmt.Sprintf("%p", pv)
591 pvAddr := fmt.Sprintf("%p", &pv)
593 vs := "[3.14 6.28 12.56]"
594 addFormatterTest("%v", v, vs)
595 addFormatterTest("%v", pv, "<*>"+vs)
596 addFormatterTest("%v", &pv, "<**>"+vs)
597 addFormatterTest("%+v", nv, "<nil>")
598 addFormatterTest("%+v", v, vs)
599 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
600 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
601 addFormatterTest("%+v", nv, "<nil>")
602 addFormatterTest("%#v", v, "("+vt+")"+vs)
603 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
604 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
605 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
606 addFormatterTest("%#+v", v, "("+vt+")"+vs)
607 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
608 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
609 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
611 // Slice containing type with custom formatter on pointer receiver only.
612 v2 := []pstringer{"1", "2", "3"}
613 nv2 := (*[]pstringer)(nil)
615 v2Addr := fmt.Sprintf("%p", pv2)
616 pv2Addr := fmt.Sprintf("%p", &pv2)
617 v2t := "[]spew_test.pstringer"
618 v2s := "[stringer 1 stringer 2 stringer 3]"
619 addFormatterTest("%v", v2, v2s)
620 addFormatterTest("%v", pv2, "<*>"+v2s)
621 addFormatterTest("%v", &pv2, "<**>"+v2s)
622 addFormatterTest("%+v", nv2, "<nil>")
623 addFormatterTest("%+v", v2, v2s)
624 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
625 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
626 addFormatterTest("%+v", nv2, "<nil>")
627 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
628 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
629 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
630 addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
631 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
632 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
633 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
634 addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
636 // Slice containing interfaces.
637 v3 := []interface{}{"one", int(2), uint(3), nil}
638 nv3 := (*[]interface{})(nil)
640 v3Addr := fmt.Sprintf("%p", pv3)
641 pv3Addr := fmt.Sprintf("%p", &pv3)
642 v3t := "[]interface {}"
646 v3t5 := "interface {}"
647 v3s := "[one 2 3 <nil>]"
648 v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3 (" + v3t5 +
650 addFormatterTest("%v", v3, v3s)
651 addFormatterTest("%v", pv3, "<*>"+v3s)
652 addFormatterTest("%v", &pv3, "<**>"+v3s)
653 addFormatterTest("%+v", nv3, "<nil>")
654 addFormatterTest("%+v", v3, v3s)
655 addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
656 addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
657 addFormatterTest("%+v", nv3, "<nil>")
658 addFormatterTest("%#v", v3, "("+v3t+")"+v3s2)
659 addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2)
660 addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2)
661 addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
662 addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2)
663 addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2)
664 addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2)
665 addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
671 v4Addr := fmt.Sprintf("%p", pv4)
672 pv4Addr := fmt.Sprintf("%p", &pv4)
675 addFormatterTest("%v", v4, v4s)
676 addFormatterTest("%v", pv4, "<*>"+v4s)
677 addFormatterTest("%v", &pv4, "<**>"+v4s)
678 addFormatterTest("%+v", nv4, "<nil>")
679 addFormatterTest("%+v", v4, v4s)
680 addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s)
681 addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s)
682 addFormatterTest("%+v", nv4, "<nil>")
683 addFormatterTest("%#v", v4, "("+v4t+")"+v4s)
684 addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s)
685 addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s)
686 addFormatterTest("%#v", nv4, "(*"+v4t+")"+"<nil>")
687 addFormatterTest("%#+v", v4, "("+v4t+")"+v4s)
688 addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s)
689 addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s)
690 addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"<nil>")
693 func addStringFormatterTests() {
698 vAddr := fmt.Sprintf("%p", pv)
699 pvAddr := fmt.Sprintf("%p", &pv)
702 addFormatterTest("%v", v, vs)
703 addFormatterTest("%v", pv, "<*>"+vs)
704 addFormatterTest("%v", &pv, "<**>"+vs)
705 addFormatterTest("%+v", nv, "<nil>")
706 addFormatterTest("%+v", v, vs)
707 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
708 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
709 addFormatterTest("%+v", nv, "<nil>")
710 addFormatterTest("%#v", v, "("+vt+")"+vs)
711 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
712 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
713 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
714 addFormatterTest("%#+v", v, "("+vt+")"+vs)
715 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
716 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
717 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
720 func addInterfaceFormatterTests() {
723 nv := (*interface{})(nil)
725 vAddr := fmt.Sprintf("%p", pv)
726 pvAddr := fmt.Sprintf("%p", &pv)
729 addFormatterTest("%v", v, vs)
730 addFormatterTest("%v", pv, "<*>"+vs)
731 addFormatterTest("%v", &pv, "<**>"+vs)
732 addFormatterTest("%+v", nv, "<nil>")
733 addFormatterTest("%+v", v, vs)
734 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
735 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
736 addFormatterTest("%+v", nv, "<nil>")
737 addFormatterTest("%#v", v, "("+vt+")"+vs)
738 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
739 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
740 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
741 addFormatterTest("%#+v", v, "("+vt+")"+vs)
742 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
743 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
744 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
747 v2 := interface{}(uint16(65535))
749 v2Addr := fmt.Sprintf("%p", pv2)
750 pv2Addr := fmt.Sprintf("%p", &pv2)
753 addFormatterTest("%v", v2, v2s)
754 addFormatterTest("%v", pv2, "<*>"+v2s)
755 addFormatterTest("%v", &pv2, "<**>"+v2s)
756 addFormatterTest("%+v", v2, v2s)
757 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
758 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
759 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
760 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
761 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
762 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
763 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
764 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
767 func addMapFormatterTests() {
768 // Map with string keys and int vals.
769 v := map[string]int{"one": 1, "two": 2}
770 nilMap := map[string]int(nil)
771 nv := (*map[string]int)(nil)
773 vAddr := fmt.Sprintf("%p", pv)
774 pvAddr := fmt.Sprintf("%p", &pv)
775 vt := "map[string]int"
776 vs := "map[one:1 two:2]"
777 vs2 := "map[two:2 one:1]"
778 addFormatterTest("%v", v, vs, vs2)
779 addFormatterTest("%v", pv, "<*>"+vs, "<*>"+vs2)
780 addFormatterTest("%v", &pv, "<**>"+vs, "<**>"+vs2)
781 addFormatterTest("%+v", nilMap, "<nil>")
782 addFormatterTest("%+v", nv, "<nil>")
783 addFormatterTest("%+v", v, vs, vs2)
784 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs, "<*>("+vAddr+")"+vs2)
785 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs,
786 "<**>("+pvAddr+"->"+vAddr+")"+vs2)
787 addFormatterTest("%+v", nilMap, "<nil>")
788 addFormatterTest("%+v", nv, "<nil>")
789 addFormatterTest("%#v", v, "("+vt+")"+vs, "("+vt+")"+vs2)
790 addFormatterTest("%#v", pv, "(*"+vt+")"+vs, "(*"+vt+")"+vs2)
791 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs, "(**"+vt+")"+vs2)
792 addFormatterTest("%#v", nilMap, "("+vt+")"+"<nil>")
793 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
794 addFormatterTest("%#+v", v, "("+vt+")"+vs, "("+vt+")"+vs2)
795 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs,
796 "(*"+vt+")("+vAddr+")"+vs2)
797 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs,
798 "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs2)
799 addFormatterTest("%#+v", nilMap, "("+vt+")"+"<nil>")
800 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
802 // Map with custom formatter type on pointer receiver only keys and vals.
803 v2 := map[pstringer]pstringer{"one": "1"}
804 nv2 := (*map[pstringer]pstringer)(nil)
806 v2Addr := fmt.Sprintf("%p", pv2)
807 pv2Addr := fmt.Sprintf("%p", &pv2)
808 v2t := "map[spew_test.pstringer]spew_test.pstringer"
809 v2s := "map[stringer one:stringer 1]"
810 if spew.UnsafeDisabled {
813 addFormatterTest("%v", v2, v2s)
814 addFormatterTest("%v", pv2, "<*>"+v2s)
815 addFormatterTest("%v", &pv2, "<**>"+v2s)
816 addFormatterTest("%+v", nv2, "<nil>")
817 addFormatterTest("%+v", v2, v2s)
818 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
819 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
820 addFormatterTest("%+v", nv2, "<nil>")
821 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
822 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
823 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
824 addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
825 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
826 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
827 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
828 addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
830 // Map with interface keys and values.
831 v3 := map[interface{}]interface{}{"one": 1}
832 nv3 := (*map[interface{}]interface{})(nil)
834 v3Addr := fmt.Sprintf("%p", pv3)
835 pv3Addr := fmt.Sprintf("%p", &pv3)
836 v3t := "map[interface {}]interface {}"
840 v3s2 := "map[(" + v3t1 + ")one:(" + v3t2 + ")1]"
841 addFormatterTest("%v", v3, v3s)
842 addFormatterTest("%v", pv3, "<*>"+v3s)
843 addFormatterTest("%v", &pv3, "<**>"+v3s)
844 addFormatterTest("%+v", nv3, "<nil>")
845 addFormatterTest("%+v", v3, v3s)
846 addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
847 addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
848 addFormatterTest("%+v", nv3, "<nil>")
849 addFormatterTest("%#v", v3, "("+v3t+")"+v3s2)
850 addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2)
851 addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2)
852 addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
853 addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2)
854 addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2)
855 addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2)
856 addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
858 // Map with nil interface value
859 v4 := map[string]interface{}{"nil": nil}
860 nv4 := (*map[string]interface{})(nil)
862 v4Addr := fmt.Sprintf("%p", pv4)
863 pv4Addr := fmt.Sprintf("%p", &pv4)
864 v4t := "map[string]interface {}"
865 v4t1 := "interface {}"
866 v4s := "map[nil:<nil>]"
867 v4s2 := "map[nil:(" + v4t1 + ")<nil>]"
868 addFormatterTest("%v", v4, v4s)
869 addFormatterTest("%v", pv4, "<*>"+v4s)
870 addFormatterTest("%v", &pv4, "<**>"+v4s)
871 addFormatterTest("%+v", nv4, "<nil>")
872 addFormatterTest("%+v", v4, v4s)
873 addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s)
874 addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s)
875 addFormatterTest("%+v", nv4, "<nil>")
876 addFormatterTest("%#v", v4, "("+v4t+")"+v4s2)
877 addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s2)
878 addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s2)
879 addFormatterTest("%#v", nv4, "(*"+v4t+")"+"<nil>")
880 addFormatterTest("%#+v", v4, "("+v4t+")"+v4s2)
881 addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s2)
882 addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s2)
883 addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"<nil>")
886 func addStructFormatterTests() {
887 // Struct with primitives.
895 vAddr := fmt.Sprintf("%p", pv)
896 pvAddr := fmt.Sprintf("%p", &pv)
901 vs2 := "{a:127 b:255}"
902 vs3 := "{a:(" + vt2 + ")127 b:(" + vt3 + ")255}"
903 addFormatterTest("%v", v, vs)
904 addFormatterTest("%v", pv, "<*>"+vs)
905 addFormatterTest("%v", &pv, "<**>"+vs)
906 addFormatterTest("%+v", nv, "<nil>")
907 addFormatterTest("%+v", v, vs2)
908 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs2)
909 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs2)
910 addFormatterTest("%+v", nv, "<nil>")
911 addFormatterTest("%#v", v, "("+vt+")"+vs3)
912 addFormatterTest("%#v", pv, "(*"+vt+")"+vs3)
913 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs3)
914 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
915 addFormatterTest("%#+v", v, "("+vt+")"+vs3)
916 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs3)
917 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs3)
918 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
920 // Struct that contains another struct.
925 v2 := s2{s1{127, 255}, true}
928 v2Addr := fmt.Sprintf("%p", pv2)
929 pv2Addr := fmt.Sprintf("%p", &pv2)
930 v2t := "spew_test.s2"
931 v2t2 := "spew_test.s1"
935 v2s := "{{127 255} true}"
936 v2s2 := "{s1:{a:127 b:255} b:true}"
937 v2s3 := "{s1:(" + v2t2 + "){a:(" + v2t3 + ")127 b:(" + v2t4 + ")255} b:(" +
939 addFormatterTest("%v", v2, v2s)
940 addFormatterTest("%v", pv2, "<*>"+v2s)
941 addFormatterTest("%v", &pv2, "<**>"+v2s)
942 addFormatterTest("%+v", nv2, "<nil>")
943 addFormatterTest("%+v", v2, v2s2)
944 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s2)
945 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s2)
946 addFormatterTest("%+v", nv2, "<nil>")
947 addFormatterTest("%#v", v2, "("+v2t+")"+v2s3)
948 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s3)
949 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s3)
950 addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
951 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s3)
952 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s3)
953 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s3)
954 addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
956 // Struct that contains custom type with Stringer pointer interface via both
957 // exported and unexported fields.
962 v3 := s3{"test", "test2"}
965 v3Addr := fmt.Sprintf("%p", pv3)
966 pv3Addr := fmt.Sprintf("%p", &pv3)
967 v3t := "spew_test.s3"
968 v3t2 := "spew_test.pstringer"
969 v3s := "{stringer test stringer test2}"
971 v3s2 := "{s:stringer test S:stringer test2}"
973 v3s3 := "{s:(" + v3t2 + ")stringer test S:(" + v3t2 + ")stringer test2}"
975 if spew.UnsafeDisabled {
977 v3sp = "{test stringer test2}"
978 v3s2 = "{s:test S:test2}"
979 v3s2p = "{s:test S:stringer test2}"
980 v3s3 = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")test2}"
981 v3s3p = "{s:(" + v3t2 + ")test S:(" + v3t2 + ")stringer test2}"
983 addFormatterTest("%v", v3, v3s)
984 addFormatterTest("%v", pv3, "<*>"+v3sp)
985 addFormatterTest("%v", &pv3, "<**>"+v3sp)
986 addFormatterTest("%+v", nv3, "<nil>")
987 addFormatterTest("%+v", v3, v3s2)
988 addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s2p)
989 addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s2p)
990 addFormatterTest("%+v", nv3, "<nil>")
991 addFormatterTest("%#v", v3, "("+v3t+")"+v3s3)
992 addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s3p)
993 addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s3p)
994 addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
995 addFormatterTest("%#+v", v3, "("+v3t+")"+v3s3)
996 addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s3p)
997 addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s3p)
998 addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
1000 // Struct that contains embedded struct and field to same struct.
1001 e := embed{"embedstr"}
1002 v4 := embedwrap{embed: &e, e: &e}
1003 nv4 := (*embedwrap)(nil)
1005 eAddr := fmt.Sprintf("%p", &e)
1006 v4Addr := fmt.Sprintf("%p", pv4)
1007 pv4Addr := fmt.Sprintf("%p", &pv4)
1008 v4t := "spew_test.embedwrap"
1009 v4t2 := "spew_test.embed"
1011 v4s := "{<*>{embedstr} <*>{embedstr}}"
1012 v4s2 := "{embed:<*>(" + eAddr + "){a:embedstr} e:<*>(" + eAddr +
1014 v4s3 := "{embed:(*" + v4t2 + "){a:(" + v4t3 + ")embedstr} e:(*" + v4t2 +
1015 "){a:(" + v4t3 + ")embedstr}}"
1016 v4s4 := "{embed:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 +
1017 ")embedstr} e:(*" + v4t2 + ")(" + eAddr + "){a:(" + v4t3 + ")embedstr}}"
1018 addFormatterTest("%v", v4, v4s)
1019 addFormatterTest("%v", pv4, "<*>"+v4s)
1020 addFormatterTest("%v", &pv4, "<**>"+v4s)
1021 addFormatterTest("%+v", nv4, "<nil>")
1022 addFormatterTest("%+v", v4, v4s2)
1023 addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s2)
1024 addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s2)
1025 addFormatterTest("%+v", nv4, "<nil>")
1026 addFormatterTest("%#v", v4, "("+v4t+")"+v4s3)
1027 addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s3)
1028 addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s3)
1029 addFormatterTest("%#v", nv4, "(*"+v4t+")"+"<nil>")
1030 addFormatterTest("%#+v", v4, "("+v4t+")"+v4s4)
1031 addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s4)
1032 addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s4)
1033 addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"<nil>")
1036 func addUintptrFormatterTests() {
1039 nv := (*uintptr)(nil)
1041 vAddr := fmt.Sprintf("%p", pv)
1042 pvAddr := fmt.Sprintf("%p", &pv)
1045 addFormatterTest("%v", v, vs)
1046 addFormatterTest("%v", pv, "<*>"+vs)
1047 addFormatterTest("%v", &pv, "<**>"+vs)
1048 addFormatterTest("%+v", nv, "<nil>")
1049 addFormatterTest("%+v", v, vs)
1050 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
1051 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
1052 addFormatterTest("%+v", nv, "<nil>")
1053 addFormatterTest("%#v", v, "("+vt+")"+vs)
1054 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
1055 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
1056 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
1057 addFormatterTest("%#+v", v, "("+vt+")"+vs)
1058 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
1059 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
1060 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
1062 // Address of real variable.
1064 v2 := uintptr(unsafe.Pointer(&i))
1066 v2Addr := fmt.Sprintf("%p", pv2)
1067 pv2Addr := fmt.Sprintf("%p", &pv2)
1069 v2s := fmt.Sprintf("%p", &i)
1070 addFormatterTest("%v", v2, v2s)
1071 addFormatterTest("%v", pv2, "<*>"+v2s)
1072 addFormatterTest("%v", &pv2, "<**>"+v2s)
1073 addFormatterTest("%+v", v2, v2s)
1074 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
1075 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
1076 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
1077 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
1078 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
1079 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
1080 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
1081 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
1084 func addUnsafePointerFormatterTests() {
1086 v := unsafe.Pointer(uintptr(0))
1087 nv := (*unsafe.Pointer)(nil)
1089 vAddr := fmt.Sprintf("%p", pv)
1090 pvAddr := fmt.Sprintf("%p", &pv)
1091 vt := "unsafe.Pointer"
1093 addFormatterTest("%v", v, vs)
1094 addFormatterTest("%v", pv, "<*>"+vs)
1095 addFormatterTest("%v", &pv, "<**>"+vs)
1096 addFormatterTest("%+v", nv, "<nil>")
1097 addFormatterTest("%+v", v, vs)
1098 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
1099 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
1100 addFormatterTest("%+v", nv, "<nil>")
1101 addFormatterTest("%#v", v, "("+vt+")"+vs)
1102 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
1103 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
1104 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
1105 addFormatterTest("%#+v", v, "("+vt+")"+vs)
1106 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
1107 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
1108 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
1110 // Address of real variable.
1112 v2 := unsafe.Pointer(&i)
1114 v2Addr := fmt.Sprintf("%p", pv2)
1115 pv2Addr := fmt.Sprintf("%p", &pv2)
1116 v2t := "unsafe.Pointer"
1117 v2s := fmt.Sprintf("%p", &i)
1118 addFormatterTest("%v", v2, v2s)
1119 addFormatterTest("%v", pv2, "<*>"+v2s)
1120 addFormatterTest("%v", &pv2, "<**>"+v2s)
1121 addFormatterTest("%+v", v2, v2s)
1122 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
1123 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
1124 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
1125 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
1126 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
1127 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
1128 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
1129 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
1132 func addChanFormatterTests() {
1136 nv := (*chan int)(nil)
1137 vAddr := fmt.Sprintf("%p", pv)
1138 pvAddr := fmt.Sprintf("%p", &pv)
1141 addFormatterTest("%v", v, vs)
1142 addFormatterTest("%v", pv, "<*>"+vs)
1143 addFormatterTest("%v", &pv, "<**>"+vs)
1144 addFormatterTest("%+v", nv, "<nil>")
1145 addFormatterTest("%+v", v, vs)
1146 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
1147 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
1148 addFormatterTest("%+v", nv, "<nil>")
1149 addFormatterTest("%#v", v, "("+vt+")"+vs)
1150 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
1151 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
1152 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
1153 addFormatterTest("%#+v", v, "("+vt+")"+vs)
1154 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
1155 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
1156 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
1159 v2 := make(chan int)
1161 v2Addr := fmt.Sprintf("%p", pv2)
1162 pv2Addr := fmt.Sprintf("%p", &pv2)
1164 v2s := fmt.Sprintf("%p", v2)
1165 addFormatterTest("%v", v2, v2s)
1166 addFormatterTest("%v", pv2, "<*>"+v2s)
1167 addFormatterTest("%v", &pv2, "<**>"+v2s)
1168 addFormatterTest("%+v", v2, v2s)
1169 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
1170 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
1171 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
1172 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
1173 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
1174 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
1175 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
1176 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
1179 func addFuncFormatterTests() {
1180 // Function with no params and no returns.
1181 v := addIntFormatterTests
1182 nv := (*func())(nil)
1184 vAddr := fmt.Sprintf("%p", pv)
1185 pvAddr := fmt.Sprintf("%p", &pv)
1187 vs := fmt.Sprintf("%p", v)
1188 addFormatterTest("%v", v, vs)
1189 addFormatterTest("%v", pv, "<*>"+vs)
1190 addFormatterTest("%v", &pv, "<**>"+vs)
1191 addFormatterTest("%+v", nv, "<nil>")
1192 addFormatterTest("%+v", v, vs)
1193 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
1194 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
1195 addFormatterTest("%+v", nv, "<nil>")
1196 addFormatterTest("%#v", v, "("+vt+")"+vs)
1197 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
1198 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
1199 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
1200 addFormatterTest("%#+v", v, "("+vt+")"+vs)
1201 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
1202 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
1203 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
1205 // Function with param and no returns.
1207 nv2 := (*func(*testing.T))(nil)
1209 v2Addr := fmt.Sprintf("%p", pv2)
1210 pv2Addr := fmt.Sprintf("%p", &pv2)
1211 v2t := "func(*testing.T)"
1212 v2s := fmt.Sprintf("%p", v2)
1213 addFormatterTest("%v", v2, v2s)
1214 addFormatterTest("%v", pv2, "<*>"+v2s)
1215 addFormatterTest("%v", &pv2, "<**>"+v2s)
1216 addFormatterTest("%+v", nv2, "<nil>")
1217 addFormatterTest("%+v", v2, v2s)
1218 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
1219 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
1220 addFormatterTest("%+v", nv2, "<nil>")
1221 addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
1222 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
1223 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
1224 addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
1225 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
1226 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
1227 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
1228 addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
1230 // Function with multiple params and multiple returns.
1231 var v3 = func(i int, s string) (b bool, err error) {
1234 nv3 := (*func(int, string) (bool, error))(nil)
1236 v3Addr := fmt.Sprintf("%p", pv3)
1237 pv3Addr := fmt.Sprintf("%p", &pv3)
1238 v3t := "func(int, string) (bool, error)"
1239 v3s := fmt.Sprintf("%p", v3)
1240 addFormatterTest("%v", v3, v3s)
1241 addFormatterTest("%v", pv3, "<*>"+v3s)
1242 addFormatterTest("%v", &pv3, "<**>"+v3s)
1243 addFormatterTest("%+v", nv3, "<nil>")
1244 addFormatterTest("%+v", v3, v3s)
1245 addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
1246 addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
1247 addFormatterTest("%+v", nv3, "<nil>")
1248 addFormatterTest("%#v", v3, "("+v3t+")"+v3s)
1249 addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s)
1250 addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s)
1251 addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
1252 addFormatterTest("%#+v", v3, "("+v3t+")"+v3s)
1253 addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s)
1254 addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s)
1255 addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
1258 func addCircularFormatterTests() {
1259 // Struct that is circular through self referencing.
1260 type circular struct {
1266 vAddr := fmt.Sprintf("%p", pv)
1267 pvAddr := fmt.Sprintf("%p", &pv)
1268 vt := "spew_test.circular"
1269 vs := "{<*>{<*><shown>}}"
1270 vs2 := "{<*><shown>}"
1271 vs3 := "{c:<*>(" + vAddr + "){c:<*>(" + vAddr + ")<shown>}}"
1272 vs4 := "{c:<*>(" + vAddr + ")<shown>}"
1273 vs5 := "{c:(*" + vt + "){c:(*" + vt + ")<shown>}}"
1274 vs6 := "{c:(*" + vt + ")<shown>}"
1275 vs7 := "{c:(*" + vt + ")(" + vAddr + "){c:(*" + vt + ")(" + vAddr +
1277 vs8 := "{c:(*" + vt + ")(" + vAddr + ")<shown>}"
1278 addFormatterTest("%v", v, vs)
1279 addFormatterTest("%v", pv, "<*>"+vs2)
1280 addFormatterTest("%v", &pv, "<**>"+vs2)
1281 addFormatterTest("%+v", v, vs3)
1282 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs4)
1283 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs4)
1284 addFormatterTest("%#v", v, "("+vt+")"+vs5)
1285 addFormatterTest("%#v", pv, "(*"+vt+")"+vs6)
1286 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs6)
1287 addFormatterTest("%#+v", v, "("+vt+")"+vs7)
1288 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs8)
1289 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs8)
1291 // Structs that are circular through cross referencing.
1296 ts2Addr := fmt.Sprintf("%p", &ts2)
1297 v2Addr := fmt.Sprintf("%p", pv2)
1298 pv2Addr := fmt.Sprintf("%p", &pv2)
1299 v2t := "spew_test.xref1"
1300 v2t2 := "spew_test.xref2"
1301 v2s := "{<*>{<*>{<*><shown>}}}"
1302 v2s2 := "{<*>{<*><shown>}}"
1303 v2s3 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + "){ps2:<*>(" +
1304 ts2Addr + ")<shown>}}}"
1305 v2s4 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + ")<shown>}}"
1306 v2s5 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + "){ps2:(*" + v2t2 +
1308 v2s6 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + ")<shown>}}"
1309 v2s7 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t +
1310 ")(" + v2Addr + "){ps2:(*" + v2t2 + ")(" + ts2Addr +
1312 v2s8 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t +
1313 ")(" + v2Addr + ")<shown>}}"
1314 addFormatterTest("%v", v2, v2s)
1315 addFormatterTest("%v", pv2, "<*>"+v2s2)
1316 addFormatterTest("%v", &pv2, "<**>"+v2s2)
1317 addFormatterTest("%+v", v2, v2s3)
1318 addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s4)
1319 addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s4)
1320 addFormatterTest("%#v", v2, "("+v2t+")"+v2s5)
1321 addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s6)
1322 addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s6)
1323 addFormatterTest("%#+v", v2, "("+v2t+")"+v2s7)
1324 addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s8)
1325 addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s8)
1327 // Structs that are indirectly circular.
1328 v3 := indirCir1{nil}
1329 tic2 := indirCir2{nil}
1330 tic3 := indirCir3{&v3}
1334 tic2Addr := fmt.Sprintf("%p", &tic2)
1335 tic3Addr := fmt.Sprintf("%p", &tic3)
1336 v3Addr := fmt.Sprintf("%p", pv3)
1337 pv3Addr := fmt.Sprintf("%p", &pv3)
1338 v3t := "spew_test.indirCir1"
1339 v3t2 := "spew_test.indirCir2"
1340 v3t3 := "spew_test.indirCir3"
1341 v3s := "{<*>{<*>{<*>{<*><shown>}}}}"
1342 v3s2 := "{<*>{<*>{<*><shown>}}}"
1343 v3s3 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" +
1344 v3Addr + "){ps2:<*>(" + tic2Addr + ")<shown>}}}}"
1345 v3s4 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" +
1346 v3Addr + ")<shown>}}}"
1347 v3s5 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t +
1348 "){ps2:(*" + v3t2 + ")<shown>}}}}"
1349 v3s6 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t +
1351 v3s7 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" +
1352 tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + "){ps2:(*" + v3t2 +
1353 ")(" + tic2Addr + ")<shown>}}}}"
1354 v3s8 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" +
1355 tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + ")<shown>}}}"
1356 addFormatterTest("%v", v3, v3s)
1357 addFormatterTest("%v", pv3, "<*>"+v3s2)
1358 addFormatterTest("%v", &pv3, "<**>"+v3s2)
1359 addFormatterTest("%+v", v3, v3s3)
1360 addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s4)
1361 addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s4)
1362 addFormatterTest("%#v", v3, "("+v3t+")"+v3s5)
1363 addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s6)
1364 addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s6)
1365 addFormatterTest("%#+v", v3, "("+v3t+")"+v3s7)
1366 addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s8)
1367 addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s8)
1370 func addPanicFormatterTests() {
1371 // Type that panics in its Stringer interface.
1373 nv := (*panicer)(nil)
1375 vAddr := fmt.Sprintf("%p", pv)
1376 pvAddr := fmt.Sprintf("%p", &pv)
1377 vt := "spew_test.panicer"
1378 vs := "(PANIC=test panic)127"
1379 addFormatterTest("%v", v, vs)
1380 addFormatterTest("%v", pv, "<*>"+vs)
1381 addFormatterTest("%v", &pv, "<**>"+vs)
1382 addFormatterTest("%v", nv, "<nil>")
1383 addFormatterTest("%+v", v, vs)
1384 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
1385 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
1386 addFormatterTest("%+v", nv, "<nil>")
1387 addFormatterTest("%#v", v, "("+vt+")"+vs)
1388 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
1389 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
1390 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
1391 addFormatterTest("%#+v", v, "("+vt+")"+vs)
1392 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
1393 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
1394 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
1397 func addErrorFormatterTests() {
1398 // Type that has a custom Error interface.
1399 v := customError(127)
1400 nv := (*customError)(nil)
1402 vAddr := fmt.Sprintf("%p", pv)
1403 pvAddr := fmt.Sprintf("%p", &pv)
1404 vt := "spew_test.customError"
1406 addFormatterTest("%v", v, vs)
1407 addFormatterTest("%v", pv, "<*>"+vs)
1408 addFormatterTest("%v", &pv, "<**>"+vs)
1409 addFormatterTest("%v", nv, "<nil>")
1410 addFormatterTest("%+v", v, vs)
1411 addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
1412 addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
1413 addFormatterTest("%+v", nv, "<nil>")
1414 addFormatterTest("%#v", v, "("+vt+")"+vs)
1415 addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
1416 addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
1417 addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
1418 addFormatterTest("%#+v", v, "("+vt+")"+vs)
1419 addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
1420 addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
1421 addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
1424 func addPassthroughFormatterTests() {
1425 // %x passthrough with uint.
1426 v := uint(4294967295)
1428 vAddr := fmt.Sprintf("%x", pv)
1429 pvAddr := fmt.Sprintf("%x", &pv)
1431 addFormatterTest("%x", v, vs)
1432 addFormatterTest("%x", pv, vAddr)
1433 addFormatterTest("%x", &pv, pvAddr)
1435 // %#x passthrough with uint.
1436 v2 := int(2147483647)
1438 v2Addr := fmt.Sprintf("%#x", pv2)
1439 pv2Addr := fmt.Sprintf("%#x", &pv2)
1441 addFormatterTest("%#x", v2, v2s)
1442 addFormatterTest("%#x", pv2, v2Addr)
1443 addFormatterTest("%#x", &pv2, pv2Addr)
1445 // %f passthrough with precision.
1446 addFormatterTest("%.2f", 3.1415, "3.14")
1447 addFormatterTest("%.3f", 3.1415, "3.142")
1448 addFormatterTest("%.4f", 3.1415, "3.1415")
1450 // %f passthrough with width and precision.
1451 addFormatterTest("%5.2f", 3.1415, " 3.14")
1452 addFormatterTest("%6.3f", 3.1415, " 3.142")
1453 addFormatterTest("%7.4f", 3.1415, " 3.1415")
1455 // %d passthrough with width.
1456 addFormatterTest("%3d", 127, "127")
1457 addFormatterTest("%4d", 127, " 127")
1458 addFormatterTest("%5d", 127, " 127")
1460 // %q passthrough with string.
1461 addFormatterTest("%q", "test", "\"test\"")
1464 // TestFormatter executes all of the tests described by formatterTests.
1465 func TestFormatter(t *testing.T) {
1467 addIntFormatterTests()
1468 addUintFormatterTests()
1469 addBoolFormatterTests()
1470 addFloatFormatterTests()
1471 addComplexFormatterTests()
1472 addArrayFormatterTests()
1473 addSliceFormatterTests()
1474 addStringFormatterTests()
1475 addInterfaceFormatterTests()
1476 addMapFormatterTests()
1477 addStructFormatterTests()
1478 addUintptrFormatterTests()
1479 addUnsafePointerFormatterTests()
1480 addChanFormatterTests()
1481 addFuncFormatterTests()
1482 addCircularFormatterTests()
1483 addPanicFormatterTests()
1484 addErrorFormatterTests()
1485 addPassthroughFormatterTests()
1487 t.Logf("Running %d tests", len(formatterTests))
1488 for i, test := range formatterTests {
1489 buf := new(bytes.Buffer)
1490 spew.Fprintf(buf, test.format, test.in)
1492 if testFailed(s, test.wants) {
1493 t.Errorf("Formatter #%d format: %s got: %s %s", i, test.format, s,
1494 stringizeWants(test.wants))
1500 type testStruct struct {
1504 func (ts testStruct) String() string {
1505 return fmt.Sprintf("ts.%d", ts.x)
1508 type testStructP struct {
1512 func (ts *testStructP) String() string {
1513 return fmt.Sprintf("ts.%d", ts.x)
1516 func TestPrintSortedKeys(t *testing.T) {
1517 cfg := spew.ConfigState{SortKeys: true}
1518 s := cfg.Sprint(map[int]string{1: "1", 3: "3", 2: "2"})
1519 expected := "map[1:1 2:2 3:3]"
1521 t.Errorf("Sorted keys mismatch 1:\n %v %v", s, expected)
1524 s = cfg.Sprint(map[stringer]int{"1": 1, "3": 3, "2": 2})
1525 expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]"
1527 t.Errorf("Sorted keys mismatch 2:\n %v %v", s, expected)
1530 s = cfg.Sprint(map[pstringer]int{pstringer("1"): 1, pstringer("3"): 3, pstringer("2"): 2})
1531 expected = "map[stringer 1:1 stringer 2:2 stringer 3:3]"
1532 if spew.UnsafeDisabled {
1533 expected = "map[1:1 2:2 3:3]"
1536 t.Errorf("Sorted keys mismatch 3:\n %v %v", s, expected)
1539 s = cfg.Sprint(map[testStruct]int{{1}: 1, {3}: 3, {2}: 2})
1540 expected = "map[ts.1:1 ts.2:2 ts.3:3]"
1542 t.Errorf("Sorted keys mismatch 4:\n %v %v", s, expected)
1545 if !spew.UnsafeDisabled {
1546 s = cfg.Sprint(map[testStructP]int{{1}: 1, {3}: 3, {2}: 2})
1547 expected = "map[ts.1:1 ts.2:2 ts.3:3]"
1549 t.Errorf("Sorted keys mismatch 5:\n %v %v", s, expected)
1553 s = cfg.Sprint(map[customError]int{customError(1): 1, customError(3): 3, customError(2): 2})
1554 expected = "map[error: 1:1 error: 2:2 error: 3:3]"
1556 t.Errorf("Sorted keys mismatch 6:\n %v %v", s, expected)