format_test.go 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285
  1. /*
  2. * Copyright (c) 2013 Dave Collins <dave@davec.name>
  3. *
  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.
  7. *
  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.
  15. */
  16. /*
  17. Test Summary:
  18. NOTE: For each test, a nil pointer, a single pointer and double pointer to the
  19. base test element are also tested to ensure proper indirection across all types.
  20. - Max int8, int16, int32, int64, int
  21. - Max uint8, uint16, uint32, uint64, uint
  22. - Boolean true and false
  23. - Standard complex64 and complex128
  24. - Array containing standard ints
  25. - Array containing type with custom formatter on pointer receiver only
  26. - Array containing interfaces
  27. - Slice containing standard float32 values
  28. - Slice containing type with custom formatter on pointer receiver only
  29. - Slice containing interfaces
  30. - Standard string
  31. - Nil interface
  32. - Map with string keys and int vals
  33. - Map with custom formatter type on pointer receiver only keys and vals
  34. - Map with interface keys and values
  35. - Struct with primitives
  36. - Struct that contains another struct
  37. - Struct that contains custom type with Stringer pointer interface via both
  38. exported and unexported fields
  39. - Uintptr to 0 (null pointer)
  40. - Uintptr address of real variable
  41. - Unsafe.Pointer to 0 (null pointer)
  42. - Unsafe.Pointer to address of real variable
  43. - Nil channel
  44. - Standard int channel
  45. - Function with no params and no returns
  46. - Function with param and no returns
  47. - Function with multiple params and multiple returns
  48. - Struct that is circular through self referencing
  49. - Structs that are circular through cross referencing
  50. - Structs that are indirectly circular
  51. - Type that panics in its Stringer interface
  52. */
  53. package spew_test
  54. import (
  55. "bytes"
  56. "fmt"
  57. "github.com/davecgh/go-spew/spew"
  58. "testing"
  59. "unsafe"
  60. )
  61. // formatterTest is used to describe a test to be perfomed against NewFormatter.
  62. type formatterTest struct {
  63. format string
  64. in interface{}
  65. wants []string
  66. }
  67. // formatterTests houses all of the tests to be performed against NewFormatter.
  68. var formatterTests = make([]formatterTest, 0)
  69. // addFormatterTest is a helper method to append the passed input and desired
  70. // result to formatterTests.
  71. func addFormatterTest(format string, in interface{}, wants ...string) {
  72. test := formatterTest{format, in, wants}
  73. formatterTests = append(formatterTests, test)
  74. }
  75. func addIntFormatterTests() {
  76. // Max int8.
  77. v := int8(127)
  78. nv := (*int8)(nil)
  79. pv := &v
  80. vAddr := fmt.Sprintf("%p", pv)
  81. pvAddr := fmt.Sprintf("%p", &pv)
  82. vt := "int8"
  83. vs := "127"
  84. addFormatterTest("%v", v, vs)
  85. addFormatterTest("%v", pv, "<*>"+vs)
  86. addFormatterTest("%v", &pv, "<**>"+vs)
  87. addFormatterTest("%v", nv, "<nil>")
  88. addFormatterTest("%+v", v, vs)
  89. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  90. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  91. addFormatterTest("%+v", nv, "<nil>")
  92. addFormatterTest("%#v", v, "("+vt+")"+vs)
  93. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  94. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  95. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  96. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  97. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  98. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  99. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  100. // Max int16.
  101. v2 := int16(32767)
  102. nv2 := (*int16)(nil)
  103. pv2 := &v2
  104. v2Addr := fmt.Sprintf("%p", pv2)
  105. pv2Addr := fmt.Sprintf("%p", &pv2)
  106. v2t := "int16"
  107. v2s := "32767"
  108. addFormatterTest("%v", v2, v2s)
  109. addFormatterTest("%v", pv2, "<*>"+v2s)
  110. addFormatterTest("%v", &pv2, "<**>"+v2s)
  111. addFormatterTest("%v", nv2, "<nil>")
  112. addFormatterTest("%+v", v2, v2s)
  113. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  114. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  115. addFormatterTest("%+v", nv2, "<nil>")
  116. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  117. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  118. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  119. addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
  120. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  121. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  122. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  123. addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
  124. // Max int32.
  125. v3 := int32(2147483647)
  126. nv3 := (*int32)(nil)
  127. pv3 := &v3
  128. v3Addr := fmt.Sprintf("%p", pv3)
  129. pv3Addr := fmt.Sprintf("%p", &pv3)
  130. v3t := "int32"
  131. v3s := "2147483647"
  132. addFormatterTest("%v", v3, v3s)
  133. addFormatterTest("%v", pv3, "<*>"+v3s)
  134. addFormatterTest("%v", &pv3, "<**>"+v3s)
  135. addFormatterTest("%v", nv3, "<nil>")
  136. addFormatterTest("%+v", v3, v3s)
  137. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  138. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  139. addFormatterTest("%+v", nv3, "<nil>")
  140. addFormatterTest("%#v", v3, "("+v3t+")"+v3s)
  141. addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s)
  142. addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s)
  143. addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
  144. addFormatterTest("%#+v", v3, "("+v3t+")"+v3s)
  145. addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s)
  146. addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s)
  147. addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
  148. // Max int64.
  149. v4 := int64(9223372036854775807)
  150. nv4 := (*int64)(nil)
  151. pv4 := &v4
  152. v4Addr := fmt.Sprintf("%p", pv4)
  153. pv4Addr := fmt.Sprintf("%p", &pv4)
  154. v4t := "int64"
  155. v4s := "9223372036854775807"
  156. addFormatterTest("%v", v4, v4s)
  157. addFormatterTest("%v", pv4, "<*>"+v4s)
  158. addFormatterTest("%v", &pv4, "<**>"+v4s)
  159. addFormatterTest("%v", nv4, "<nil>")
  160. addFormatterTest("%+v", v4, v4s)
  161. addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s)
  162. addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s)
  163. addFormatterTest("%+v", nv4, "<nil>")
  164. addFormatterTest("%#v", v4, "("+v4t+")"+v4s)
  165. addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s)
  166. addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s)
  167. addFormatterTest("%#v", nv4, "(*"+v4t+")"+"<nil>")
  168. addFormatterTest("%#+v", v4, "("+v4t+")"+v4s)
  169. addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s)
  170. addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s)
  171. addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"<nil>")
  172. // Max int.
  173. v5 := int(2147483647)
  174. nv5 := (*int)(nil)
  175. pv5 := &v5
  176. v5Addr := fmt.Sprintf("%p", pv5)
  177. pv5Addr := fmt.Sprintf("%p", &pv5)
  178. v5t := "int"
  179. v5s := "2147483647"
  180. addFormatterTest("%v", v5, v5s)
  181. addFormatterTest("%v", pv5, "<*>"+v5s)
  182. addFormatterTest("%v", &pv5, "<**>"+v5s)
  183. addFormatterTest("%v", nv5, "<nil>")
  184. addFormatterTest("%+v", v5, v5s)
  185. addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s)
  186. addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s)
  187. addFormatterTest("%+v", nv5, "<nil>")
  188. addFormatterTest("%#v", v5, "("+v5t+")"+v5s)
  189. addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s)
  190. addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s)
  191. addFormatterTest("%#v", nv5, "(*"+v5t+")"+"<nil>")
  192. addFormatterTest("%#+v", v5, "("+v5t+")"+v5s)
  193. addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s)
  194. addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s)
  195. addFormatterTest("%#+v", nv5, "(*"+v5t+")"+"<nil>")
  196. }
  197. func addUintFormatterTests() {
  198. // Max uint8.
  199. v := uint8(255)
  200. nv := (*uint8)(nil)
  201. pv := &v
  202. vAddr := fmt.Sprintf("%p", pv)
  203. pvAddr := fmt.Sprintf("%p", &pv)
  204. vt := "uint8"
  205. vs := "255"
  206. addFormatterTest("%v", v, vs)
  207. addFormatterTest("%v", pv, "<*>"+vs)
  208. addFormatterTest("%v", &pv, "<**>"+vs)
  209. addFormatterTest("%v", nv, "<nil>")
  210. addFormatterTest("%+v", v, vs)
  211. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  212. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  213. addFormatterTest("%+v", nv, "<nil>")
  214. addFormatterTest("%#v", v, "("+vt+")"+vs)
  215. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  216. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  217. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  218. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  219. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  220. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  221. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  222. // Max uint16.
  223. v2 := uint16(65535)
  224. nv2 := (*uint16)(nil)
  225. pv2 := &v2
  226. v2Addr := fmt.Sprintf("%p", pv2)
  227. pv2Addr := fmt.Sprintf("%p", &pv2)
  228. v2t := "uint16"
  229. v2s := "65535"
  230. addFormatterTest("%v", v2, v2s)
  231. addFormatterTest("%v", pv2, "<*>"+v2s)
  232. addFormatterTest("%v", &pv2, "<**>"+v2s)
  233. addFormatterTest("%v", nv2, "<nil>")
  234. addFormatterTest("%+v", v2, v2s)
  235. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  236. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  237. addFormatterTest("%+v", nv2, "<nil>")
  238. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  239. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  240. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  241. addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
  242. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  243. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  244. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  245. addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
  246. // Max uint32.
  247. v3 := uint32(4294967295)
  248. nv3 := (*uint32)(nil)
  249. pv3 := &v3
  250. v3Addr := fmt.Sprintf("%p", pv3)
  251. pv3Addr := fmt.Sprintf("%p", &pv3)
  252. v3t := "uint32"
  253. v3s := "4294967295"
  254. addFormatterTest("%v", v3, v3s)
  255. addFormatterTest("%v", pv3, "<*>"+v3s)
  256. addFormatterTest("%v", &pv3, "<**>"+v3s)
  257. addFormatterTest("%v", nv3, "<nil>")
  258. addFormatterTest("%+v", v3, v3s)
  259. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  260. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  261. addFormatterTest("%+v", nv3, "<nil>")
  262. addFormatterTest("%#v", v3, "("+v3t+")"+v3s)
  263. addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s)
  264. addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s)
  265. addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
  266. addFormatterTest("%#+v", v3, "("+v3t+")"+v3s)
  267. addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s)
  268. addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s)
  269. addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
  270. // Max uint64.
  271. v4 := uint64(18446744073709551615)
  272. nv4 := (*uint64)(nil)
  273. pv4 := &v4
  274. v4Addr := fmt.Sprintf("%p", pv4)
  275. pv4Addr := fmt.Sprintf("%p", &pv4)
  276. v4t := "uint64"
  277. v4s := "18446744073709551615"
  278. addFormatterTest("%v", v4, v4s)
  279. addFormatterTest("%v", pv4, "<*>"+v4s)
  280. addFormatterTest("%v", &pv4, "<**>"+v4s)
  281. addFormatterTest("%v", nv4, "<nil>")
  282. addFormatterTest("%+v", v4, v4s)
  283. addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s)
  284. addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s)
  285. addFormatterTest("%+v", nv4, "<nil>")
  286. addFormatterTest("%#v", v4, "("+v4t+")"+v4s)
  287. addFormatterTest("%#v", pv4, "(*"+v4t+")"+v4s)
  288. addFormatterTest("%#v", &pv4, "(**"+v4t+")"+v4s)
  289. addFormatterTest("%#v", nv4, "(*"+v4t+")"+"<nil>")
  290. addFormatterTest("%#+v", v4, "("+v4t+")"+v4s)
  291. addFormatterTest("%#+v", pv4, "(*"+v4t+")("+v4Addr+")"+v4s)
  292. addFormatterTest("%#+v", &pv4, "(**"+v4t+")("+pv4Addr+"->"+v4Addr+")"+v4s)
  293. addFormatterTest("%#+v", nv4, "(*"+v4t+")"+"<nil>")
  294. // Max uint.
  295. v5 := uint(4294967295)
  296. nv5 := (*uint)(nil)
  297. pv5 := &v5
  298. v5Addr := fmt.Sprintf("%p", pv5)
  299. pv5Addr := fmt.Sprintf("%p", &pv5)
  300. v5t := "uint"
  301. v5s := "4294967295"
  302. addFormatterTest("%v", v5, v5s)
  303. addFormatterTest("%v", pv5, "<*>"+v5s)
  304. addFormatterTest("%v", &pv5, "<**>"+v5s)
  305. addFormatterTest("%v", nv5, "<nil>")
  306. addFormatterTest("%+v", v5, v5s)
  307. addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s)
  308. addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s)
  309. addFormatterTest("%+v", nv5, "<nil>")
  310. addFormatterTest("%#v", v5, "("+v5t+")"+v5s)
  311. addFormatterTest("%#v", pv5, "(*"+v5t+")"+v5s)
  312. addFormatterTest("%#v", &pv5, "(**"+v5t+")"+v5s)
  313. addFormatterTest("%#v", nv5, "(*"+v5t+")"+"<nil>")
  314. addFormatterTest("%#+v", v5, "("+v5t+")"+v5s)
  315. addFormatterTest("%#+v", pv5, "(*"+v5t+")("+v5Addr+")"+v5s)
  316. addFormatterTest("%#+v", &pv5, "(**"+v5t+")("+pv5Addr+"->"+v5Addr+")"+v5s)
  317. addFormatterTest("%#v", nv5, "(*"+v5t+")"+"<nil>")
  318. }
  319. func addBoolFormatterTests() {
  320. // Boolean true.
  321. v := bool(true)
  322. nv := (*bool)(nil)
  323. pv := &v
  324. vAddr := fmt.Sprintf("%p", pv)
  325. pvAddr := fmt.Sprintf("%p", &pv)
  326. vt := "bool"
  327. vs := "true"
  328. addFormatterTest("%v", v, vs)
  329. addFormatterTest("%v", pv, "<*>"+vs)
  330. addFormatterTest("%v", &pv, "<**>"+vs)
  331. addFormatterTest("%v", nv, "<nil>")
  332. addFormatterTest("%+v", v, vs)
  333. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  334. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  335. addFormatterTest("%+v", nv, "<nil>")
  336. addFormatterTest("%#v", v, "("+vt+")"+vs)
  337. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  338. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  339. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  340. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  341. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  342. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  343. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  344. // Boolean false.
  345. v2 := bool(false)
  346. pv2 := &v2
  347. v2Addr := fmt.Sprintf("%p", pv2)
  348. pv2Addr := fmt.Sprintf("%p", &pv2)
  349. v2t := "bool"
  350. v2s := "false"
  351. addFormatterTest("%v", v2, v2s)
  352. addFormatterTest("%v", pv2, "<*>"+v2s)
  353. addFormatterTest("%v", &pv2, "<**>"+v2s)
  354. addFormatterTest("%+v", v2, v2s)
  355. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  356. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  357. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  358. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  359. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  360. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  361. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  362. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  363. }
  364. func addFloatFormatterTests() {
  365. // Standard float32.
  366. v := float32(3.1415)
  367. nv := (*float32)(nil)
  368. pv := &v
  369. vAddr := fmt.Sprintf("%p", pv)
  370. pvAddr := fmt.Sprintf("%p", &pv)
  371. vt := "float32"
  372. vs := "3.1415"
  373. addFormatterTest("%v", v, vs)
  374. addFormatterTest("%v", pv, "<*>"+vs)
  375. addFormatterTest("%v", &pv, "<**>"+vs)
  376. addFormatterTest("%v", nv, "<nil>")
  377. addFormatterTest("%+v", v, vs)
  378. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  379. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  380. addFormatterTest("%+v", nv, "<nil>")
  381. addFormatterTest("%#v", v, "("+vt+")"+vs)
  382. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  383. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  384. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  385. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  386. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  387. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  388. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  389. // Standard float64.
  390. v2 := float64(3.1415926)
  391. nv2 := (*float64)(nil)
  392. pv2 := &v2
  393. v2Addr := fmt.Sprintf("%p", pv2)
  394. pv2Addr := fmt.Sprintf("%p", &pv2)
  395. v2t := "float64"
  396. v2s := "3.1415926"
  397. addFormatterTest("%v", v2, v2s)
  398. addFormatterTest("%v", pv2, "<*>"+v2s)
  399. addFormatterTest("%v", &pv2, "<**>"+v2s)
  400. addFormatterTest("%+v", nv2, "<nil>")
  401. addFormatterTest("%+v", v2, v2s)
  402. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  403. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  404. addFormatterTest("%+v", nv2, "<nil>")
  405. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  406. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  407. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  408. addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
  409. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  410. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  411. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  412. addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
  413. }
  414. func addComplexFormatterTests() {
  415. // Standard complex64.
  416. v := complex(float32(6), -2)
  417. nv := (*complex64)(nil)
  418. pv := &v
  419. vAddr := fmt.Sprintf("%p", pv)
  420. pvAddr := fmt.Sprintf("%p", &pv)
  421. vt := "complex64"
  422. vs := "(6-2i)"
  423. addFormatterTest("%v", v, vs)
  424. addFormatterTest("%v", pv, "<*>"+vs)
  425. addFormatterTest("%v", &pv, "<**>"+vs)
  426. addFormatterTest("%+v", nv, "<nil>")
  427. addFormatterTest("%+v", v, vs)
  428. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  429. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  430. addFormatterTest("%+v", nv, "<nil>")
  431. addFormatterTest("%#v", v, "("+vt+")"+vs)
  432. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  433. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  434. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  435. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  436. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  437. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  438. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  439. // Standard complex128.
  440. v2 := complex(float64(-6), 2)
  441. nv2 := (*complex128)(nil)
  442. pv2 := &v2
  443. v2Addr := fmt.Sprintf("%p", pv2)
  444. pv2Addr := fmt.Sprintf("%p", &pv2)
  445. v2t := "complex128"
  446. v2s := "(-6+2i)"
  447. addFormatterTest("%v", v2, v2s)
  448. addFormatterTest("%v", pv2, "<*>"+v2s)
  449. addFormatterTest("%v", &pv2, "<**>"+v2s)
  450. addFormatterTest("%+v", nv2, "<nil>")
  451. addFormatterTest("%+v", v2, v2s)
  452. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  453. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  454. addFormatterTest("%+v", nv2, "<nil>")
  455. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  456. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  457. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  458. addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
  459. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  460. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  461. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  462. addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
  463. }
  464. func addArrayFormatterTests() {
  465. // Array containing standard ints.
  466. v := [3]int{1, 2, 3}
  467. nv := (*[3]int)(nil)
  468. pv := &v
  469. vAddr := fmt.Sprintf("%p", pv)
  470. pvAddr := fmt.Sprintf("%p", &pv)
  471. vt := "[3]int"
  472. vs := "[1 2 3]"
  473. addFormatterTest("%v", v, vs)
  474. addFormatterTest("%v", pv, "<*>"+vs)
  475. addFormatterTest("%v", &pv, "<**>"+vs)
  476. addFormatterTest("%+v", nv, "<nil>")
  477. addFormatterTest("%+v", v, vs)
  478. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  479. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  480. addFormatterTest("%+v", nv, "<nil>")
  481. addFormatterTest("%#v", v, "("+vt+")"+vs)
  482. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  483. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  484. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  485. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  486. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  487. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  488. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  489. // Array containing type with custom formatter on pointer receiver only.
  490. v2 := [3]pstringer{"1", "2", "3"}
  491. nv2 := (*[3]pstringer)(nil)
  492. pv2 := &v2
  493. v2Addr := fmt.Sprintf("%p", pv2)
  494. pv2Addr := fmt.Sprintf("%p", &pv2)
  495. v2t := "[3]spew_test.pstringer"
  496. v2s := "[stringer 1 stringer 2 stringer 3]"
  497. addFormatterTest("%v", v2, v2s)
  498. addFormatterTest("%v", pv2, "<*>"+v2s)
  499. addFormatterTest("%v", &pv2, "<**>"+v2s)
  500. addFormatterTest("%+v", nv2, "<nil>")
  501. addFormatterTest("%+v", v2, v2s)
  502. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  503. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  504. addFormatterTest("%+v", nv2, "<nil>")
  505. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  506. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  507. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  508. addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
  509. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  510. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  511. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  512. addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
  513. // Array containing interfaces.
  514. v3 := [3]interface{}{"one", int(2), uint(3)}
  515. nv3 := (*[3]interface{})(nil)
  516. pv3 := &v3
  517. v3Addr := fmt.Sprintf("%p", pv3)
  518. pv3Addr := fmt.Sprintf("%p", &pv3)
  519. v3t := "[3]interface {}"
  520. v3t2 := "string"
  521. v3t3 := "int"
  522. v3t4 := "uint"
  523. v3s := "[one 2 3]"
  524. v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3]"
  525. addFormatterTest("%v", v3, v3s)
  526. addFormatterTest("%v", pv3, "<*>"+v3s)
  527. addFormatterTest("%v", &pv3, "<**>"+v3s)
  528. addFormatterTest("%+v", nv3, "<nil>")
  529. addFormatterTest("%+v", v3, v3s)
  530. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  531. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  532. addFormatterTest("%+v", nv3, "<nil>")
  533. addFormatterTest("%#v", v3, "("+v3t+")"+v3s2)
  534. addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2)
  535. addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2)
  536. addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
  537. addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2)
  538. addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2)
  539. addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2)
  540. addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
  541. }
  542. func addSliceFormatterTests() {
  543. // Slice containing standard float32 values.
  544. v := []float32{3.14, 6.28, 12.56}
  545. nv := (*[]float32)(nil)
  546. pv := &v
  547. vAddr := fmt.Sprintf("%p", pv)
  548. pvAddr := fmt.Sprintf("%p", &pv)
  549. vt := "[]float32"
  550. vs := "[3.14 6.28 12.56]"
  551. addFormatterTest("%v", v, vs)
  552. addFormatterTest("%v", pv, "<*>"+vs)
  553. addFormatterTest("%v", &pv, "<**>"+vs)
  554. addFormatterTest("%+v", nv, "<nil>")
  555. addFormatterTest("%+v", v, vs)
  556. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  557. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  558. addFormatterTest("%+v", nv, "<nil>")
  559. addFormatterTest("%#v", v, "("+vt+")"+vs)
  560. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  561. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  562. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  563. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  564. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  565. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  566. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  567. // Slice containing type with custom formatter on pointer receiver only.
  568. v2 := []pstringer{"1", "2", "3"}
  569. nv2 := (*[]pstringer)(nil)
  570. pv2 := &v2
  571. v2Addr := fmt.Sprintf("%p", pv2)
  572. pv2Addr := fmt.Sprintf("%p", &pv2)
  573. v2t := "[]spew_test.pstringer"
  574. v2s := "[stringer 1 stringer 2 stringer 3]"
  575. addFormatterTest("%v", v2, v2s)
  576. addFormatterTest("%v", pv2, "<*>"+v2s)
  577. addFormatterTest("%v", &pv2, "<**>"+v2s)
  578. addFormatterTest("%+v", nv2, "<nil>")
  579. addFormatterTest("%+v", v2, v2s)
  580. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  581. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  582. addFormatterTest("%+v", nv2, "<nil>")
  583. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  584. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  585. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  586. addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
  587. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  588. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  589. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  590. addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
  591. // Slice containing interfaces.
  592. v3 := []interface{}{"one", int(2), uint(3)}
  593. nv3 := (*[]interface{})(nil)
  594. pv3 := &v3
  595. v3Addr := fmt.Sprintf("%p", pv3)
  596. pv3Addr := fmt.Sprintf("%p", &pv3)
  597. v3t := "[]interface {}"
  598. v3t2 := "string"
  599. v3t3 := "int"
  600. v3t4 := "uint"
  601. v3s := "[one 2 3]"
  602. v3s2 := "[(" + v3t2 + ")one (" + v3t3 + ")2 (" + v3t4 + ")3]"
  603. addFormatterTest("%v", v3, v3s)
  604. addFormatterTest("%v", pv3, "<*>"+v3s)
  605. addFormatterTest("%v", &pv3, "<**>"+v3s)
  606. addFormatterTest("%+v", nv3, "<nil>")
  607. addFormatterTest("%+v", v3, v3s)
  608. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  609. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  610. addFormatterTest("%+v", nv3, "<nil>")
  611. addFormatterTest("%#v", v3, "("+v3t+")"+v3s2)
  612. addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2)
  613. addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2)
  614. addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
  615. addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2)
  616. addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2)
  617. addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2)
  618. addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
  619. }
  620. func addStringFormatterTests() {
  621. // Standard string.
  622. v := "test"
  623. nv := (*string)(nil)
  624. pv := &v
  625. vAddr := fmt.Sprintf("%p", pv)
  626. pvAddr := fmt.Sprintf("%p", &pv)
  627. vt := "string"
  628. vs := "test"
  629. addFormatterTest("%v", v, vs)
  630. addFormatterTest("%v", pv, "<*>"+vs)
  631. addFormatterTest("%v", &pv, "<**>"+vs)
  632. addFormatterTest("%+v", nv, "<nil>")
  633. addFormatterTest("%+v", v, vs)
  634. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  635. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  636. addFormatterTest("%+v", nv, "<nil>")
  637. addFormatterTest("%#v", v, "("+vt+")"+vs)
  638. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  639. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  640. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  641. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  642. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  643. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  644. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  645. }
  646. func addNilInterfaceFormatterTests() {
  647. // Nil interface.
  648. var v interface{}
  649. nv := (*interface{})(nil)
  650. pv := &v
  651. vAddr := fmt.Sprintf("%p", pv)
  652. pvAddr := fmt.Sprintf("%p", &pv)
  653. vt := "interface {}"
  654. vs := "<nil>"
  655. addFormatterTest("%v", v, vs)
  656. addFormatterTest("%v", pv, "<*>"+vs)
  657. addFormatterTest("%v", &pv, "<**>"+vs)
  658. addFormatterTest("%+v", nv, "<nil>")
  659. addFormatterTest("%+v", v, vs)
  660. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  661. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  662. addFormatterTest("%+v", nv, "<nil>")
  663. addFormatterTest("%#v", v, "("+vt+")"+vs)
  664. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  665. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  666. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  667. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  668. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  669. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  670. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  671. }
  672. func addMapFormatterTests() {
  673. // Map with string keys and int vals.
  674. v := map[string]int{"one": 1, "two": 2}
  675. nv := (*map[string]int)(nil)
  676. pv := &v
  677. vAddr := fmt.Sprintf("%p", pv)
  678. pvAddr := fmt.Sprintf("%p", &pv)
  679. vt := "map[string]int"
  680. vs := "map[one:1 two:2]"
  681. vs2 := "map[two:2 one:1]"
  682. addFormatterTest("%v", v, vs, vs2)
  683. addFormatterTest("%v", pv, "<*>"+vs, "<*>"+vs2)
  684. addFormatterTest("%v", &pv, "<**>"+vs, "<**>"+vs2)
  685. addFormatterTest("%+v", nv, "<nil>")
  686. addFormatterTest("%+v", v, vs, vs2)
  687. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs, "<*>("+vAddr+")"+vs2)
  688. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs,
  689. "<**>("+pvAddr+"->"+vAddr+")"+vs2)
  690. addFormatterTest("%+v", nv, "<nil>")
  691. addFormatterTest("%#v", v, "("+vt+")"+vs, "("+vt+")"+vs2)
  692. addFormatterTest("%#v", pv, "(*"+vt+")"+vs, "(*"+vt+")"+vs2)
  693. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs, "(**"+vt+")"+vs2)
  694. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  695. addFormatterTest("%#+v", v, "("+vt+")"+vs, "("+vt+")"+vs2)
  696. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs,
  697. "(*"+vt+")("+vAddr+")"+vs2)
  698. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs,
  699. "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs2)
  700. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  701. // Map with custom formatter type on pointer receiver only keys and vals.
  702. v2 := map[pstringer]pstringer{"one": "1"}
  703. nv2 := (*map[pstringer]pstringer)(nil)
  704. pv2 := &v2
  705. v2Addr := fmt.Sprintf("%p", pv2)
  706. pv2Addr := fmt.Sprintf("%p", &pv2)
  707. v2t := "map[spew_test.pstringer]spew_test.pstringer"
  708. v2s := "map[stringer one:stringer 1]"
  709. addFormatterTest("%v", v2, v2s)
  710. addFormatterTest("%v", pv2, "<*>"+v2s)
  711. addFormatterTest("%v", &pv2, "<**>"+v2s)
  712. addFormatterTest("%+v", nv2, "<nil>")
  713. addFormatterTest("%+v", v2, v2s)
  714. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  715. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  716. addFormatterTest("%+v", nv2, "<nil>")
  717. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  718. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  719. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  720. addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
  721. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  722. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  723. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  724. addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
  725. // Map with interface keys and values.
  726. v3 := map[interface{}]interface{}{"one": 1}
  727. nv3 := (*map[interface{}]interface{})(nil)
  728. pv3 := &v3
  729. v3Addr := fmt.Sprintf("%p", pv3)
  730. pv3Addr := fmt.Sprintf("%p", &pv3)
  731. v3t := "map[interface {}]interface {}"
  732. v3t1 := "string"
  733. v3t2 := "int"
  734. v3s := "map[one:1]"
  735. v3s2 := "map[(" + v3t1 + ")one:(" + v3t2 + ")1]"
  736. addFormatterTest("%v", v3, v3s)
  737. addFormatterTest("%v", pv3, "<*>"+v3s)
  738. addFormatterTest("%v", &pv3, "<**>"+v3s)
  739. addFormatterTest("%+v", nv3, "<nil>")
  740. addFormatterTest("%+v", v3, v3s)
  741. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  742. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  743. addFormatterTest("%+v", nv3, "<nil>")
  744. addFormatterTest("%#v", v3, "("+v3t+")"+v3s2)
  745. addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s2)
  746. addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s2)
  747. addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
  748. addFormatterTest("%#+v", v3, "("+v3t+")"+v3s2)
  749. addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s2)
  750. addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s2)
  751. addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
  752. }
  753. func addStructFormatterTests() {
  754. // Struct with primitives.
  755. type s1 struct {
  756. a int8
  757. b uint8
  758. }
  759. v := s1{127, 255}
  760. nv := (*s1)(nil)
  761. pv := &v
  762. vAddr := fmt.Sprintf("%p", pv)
  763. pvAddr := fmt.Sprintf("%p", &pv)
  764. vt := "spew_test.s1"
  765. vt2 := "int8"
  766. vt3 := "uint8"
  767. vs := "{127 255}"
  768. vs2 := "{a:127 b:255}"
  769. vs3 := "{a:(" + vt2 + ")127 b:(" + vt3 + ")255}"
  770. addFormatterTest("%v", v, vs)
  771. addFormatterTest("%v", pv, "<*>"+vs)
  772. addFormatterTest("%v", &pv, "<**>"+vs)
  773. addFormatterTest("%+v", nv, "<nil>")
  774. addFormatterTest("%+v", v, vs2)
  775. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs2)
  776. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs2)
  777. addFormatterTest("%+v", nv, "<nil>")
  778. addFormatterTest("%#v", v, "("+vt+")"+vs3)
  779. addFormatterTest("%#v", pv, "(*"+vt+")"+vs3)
  780. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs3)
  781. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  782. addFormatterTest("%#+v", v, "("+vt+")"+vs3)
  783. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs3)
  784. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs3)
  785. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  786. // Struct that contains another struct.
  787. type s2 struct {
  788. s1 s1
  789. b bool
  790. }
  791. v2 := s2{s1{127, 255}, true}
  792. nv2 := (*s2)(nil)
  793. pv2 := &v2
  794. v2Addr := fmt.Sprintf("%p", pv2)
  795. pv2Addr := fmt.Sprintf("%p", &pv2)
  796. v2t := "spew_test.s2"
  797. v2t2 := "spew_test.s1"
  798. v2t3 := "int8"
  799. v2t4 := "uint8"
  800. v2t5 := "bool"
  801. v2s := "{{127 255} true}"
  802. v2s2 := "{s1:{a:127 b:255} b:true}"
  803. v2s3 := "{s1:(" + v2t2 + "){a:(" + v2t3 + ")127 b:(" + v2t4 + ")255} b:(" +
  804. v2t5 + ")true}"
  805. addFormatterTest("%v", v2, v2s)
  806. addFormatterTest("%v", pv2, "<*>"+v2s)
  807. addFormatterTest("%v", &pv2, "<**>"+v2s)
  808. addFormatterTest("%+v", nv2, "<nil>")
  809. addFormatterTest("%+v", v2, v2s2)
  810. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s2)
  811. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s2)
  812. addFormatterTest("%+v", nv2, "<nil>")
  813. addFormatterTest("%#v", v2, "("+v2t+")"+v2s3)
  814. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s3)
  815. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s3)
  816. addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
  817. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s3)
  818. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s3)
  819. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s3)
  820. addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
  821. // Struct that contains custom type with Stringer pointer interface via both
  822. // exported and unexported fields.
  823. type s3 struct {
  824. s pstringer
  825. S pstringer
  826. }
  827. v3 := s3{"test", "test2"}
  828. nv3 := (*s3)(nil)
  829. pv3 := &v3
  830. v3Addr := fmt.Sprintf("%p", pv3)
  831. pv3Addr := fmt.Sprintf("%p", &pv3)
  832. v3t := "spew_test.s3"
  833. v3t2 := "spew_test.pstringer"
  834. v3s := "{stringer test stringer test2}"
  835. v3s2 := "{s:stringer test S:stringer test2}"
  836. v3s3 := "{s:(" + v3t2 + ")stringer test S:(" + v3t2 + ")stringer test2}"
  837. addFormatterTest("%v", v3, v3s)
  838. addFormatterTest("%v", pv3, "<*>"+v3s)
  839. addFormatterTest("%v", &pv3, "<**>"+v3s)
  840. addFormatterTest("%+v", nv3, "<nil>")
  841. addFormatterTest("%+v", v3, v3s2)
  842. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s2)
  843. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s2)
  844. addFormatterTest("%+v", nv3, "<nil>")
  845. addFormatterTest("%#v", v3, "("+v3t+")"+v3s3)
  846. addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s3)
  847. addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s3)
  848. addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
  849. addFormatterTest("%#+v", v3, "("+v3t+")"+v3s3)
  850. addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s3)
  851. addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s3)
  852. addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
  853. }
  854. func addUintptrFormatterTests() {
  855. // Null pointer.
  856. v := uintptr(0)
  857. nv := (*uintptr)(nil)
  858. pv := &v
  859. vAddr := fmt.Sprintf("%p", pv)
  860. pvAddr := fmt.Sprintf("%p", &pv)
  861. vt := "uintptr"
  862. vs := "<nil>"
  863. addFormatterTest("%v", v, vs)
  864. addFormatterTest("%v", pv, "<*>"+vs)
  865. addFormatterTest("%v", &pv, "<**>"+vs)
  866. addFormatterTest("%+v", nv, "<nil>")
  867. addFormatterTest("%+v", v, vs)
  868. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  869. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  870. addFormatterTest("%+v", nv, "<nil>")
  871. addFormatterTest("%#v", v, "("+vt+")"+vs)
  872. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  873. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  874. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  875. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  876. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  877. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  878. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  879. // Address of real variable.
  880. i := 1
  881. v2 := uintptr(unsafe.Pointer(&i))
  882. pv2 := &v2
  883. v2Addr := fmt.Sprintf("%p", pv2)
  884. pv2Addr := fmt.Sprintf("%p", &pv2)
  885. v2t := "uintptr"
  886. v2s := fmt.Sprintf("%p", &i)
  887. addFormatterTest("%v", v2, v2s)
  888. addFormatterTest("%v", pv2, "<*>"+v2s)
  889. addFormatterTest("%v", &pv2, "<**>"+v2s)
  890. addFormatterTest("%+v", v2, v2s)
  891. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  892. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  893. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  894. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  895. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  896. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  897. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  898. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  899. }
  900. func addUnsafePointerFormatterTests() {
  901. // Null pointer.
  902. v := unsafe.Pointer(uintptr(0))
  903. nv := (*unsafe.Pointer)(nil)
  904. pv := &v
  905. vAddr := fmt.Sprintf("%p", pv)
  906. pvAddr := fmt.Sprintf("%p", &pv)
  907. vt := "unsafe.Pointer"
  908. vs := "<nil>"
  909. addFormatterTest("%v", v, vs)
  910. addFormatterTest("%v", pv, "<*>"+vs)
  911. addFormatterTest("%v", &pv, "<**>"+vs)
  912. addFormatterTest("%+v", nv, "<nil>")
  913. addFormatterTest("%+v", v, vs)
  914. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  915. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  916. addFormatterTest("%+v", nv, "<nil>")
  917. addFormatterTest("%#v", v, "("+vt+")"+vs)
  918. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  919. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  920. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  921. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  922. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  923. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  924. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  925. // Address of real variable.
  926. i := 1
  927. v2 := unsafe.Pointer(&i)
  928. pv2 := &v2
  929. v2Addr := fmt.Sprintf("%p", pv2)
  930. pv2Addr := fmt.Sprintf("%p", &pv2)
  931. v2t := "unsafe.Pointer"
  932. v2s := fmt.Sprintf("%p", &i)
  933. addFormatterTest("%v", v2, v2s)
  934. addFormatterTest("%v", pv2, "<*>"+v2s)
  935. addFormatterTest("%v", &pv2, "<**>"+v2s)
  936. addFormatterTest("%+v", v2, v2s)
  937. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  938. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  939. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  940. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  941. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  942. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  943. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  944. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  945. }
  946. func addChanFormatterTests() {
  947. // Nil channel.
  948. var v chan int
  949. pv := &v
  950. nv := (*chan int)(nil)
  951. vAddr := fmt.Sprintf("%p", pv)
  952. pvAddr := fmt.Sprintf("%p", &pv)
  953. vt := "chan int"
  954. vs := "<nil>"
  955. addFormatterTest("%v", v, vs)
  956. addFormatterTest("%v", pv, "<*>"+vs)
  957. addFormatterTest("%v", &pv, "<**>"+vs)
  958. addFormatterTest("%+v", nv, "<nil>")
  959. addFormatterTest("%+v", v, vs)
  960. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  961. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  962. addFormatterTest("%+v", nv, "<nil>")
  963. addFormatterTest("%#v", v, "("+vt+")"+vs)
  964. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  965. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  966. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  967. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  968. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  969. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  970. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  971. // Real channel.
  972. v2 := make(chan int)
  973. pv2 := &v2
  974. v2Addr := fmt.Sprintf("%p", pv2)
  975. pv2Addr := fmt.Sprintf("%p", &pv2)
  976. v2t := "chan int"
  977. v2s := fmt.Sprintf("%p", v2)
  978. addFormatterTest("%v", v2, v2s)
  979. addFormatterTest("%v", pv2, "<*>"+v2s)
  980. addFormatterTest("%v", &pv2, "<**>"+v2s)
  981. addFormatterTest("%+v", v2, v2s)
  982. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  983. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  984. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  985. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  986. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  987. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  988. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  989. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  990. }
  991. func addFuncFormatterTests() {
  992. // Function with no params and no returns.
  993. v := addIntFormatterTests
  994. nv := (*func())(nil)
  995. pv := &v
  996. vAddr := fmt.Sprintf("%p", pv)
  997. pvAddr := fmt.Sprintf("%p", &pv)
  998. vt := "func()"
  999. vs := fmt.Sprintf("%p", v)
  1000. addFormatterTest("%v", v, vs)
  1001. addFormatterTest("%v", pv, "<*>"+vs)
  1002. addFormatterTest("%v", &pv, "<**>"+vs)
  1003. addFormatterTest("%+v", nv, "<nil>")
  1004. addFormatterTest("%+v", v, vs)
  1005. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  1006. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  1007. addFormatterTest("%+v", nv, "<nil>")
  1008. addFormatterTest("%#v", v, "("+vt+")"+vs)
  1009. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  1010. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  1011. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  1012. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  1013. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  1014. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  1015. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  1016. // Function with param and no returns.
  1017. v2 := TestFormatter
  1018. nv2 := (*func(*testing.T))(nil)
  1019. pv2 := &v2
  1020. v2Addr := fmt.Sprintf("%p", pv2)
  1021. pv2Addr := fmt.Sprintf("%p", &pv2)
  1022. v2t := "func(*testing.T)"
  1023. v2s := fmt.Sprintf("%p", v2)
  1024. addFormatterTest("%v", v2, v2s)
  1025. addFormatterTest("%v", pv2, "<*>"+v2s)
  1026. addFormatterTest("%v", &pv2, "<**>"+v2s)
  1027. addFormatterTest("%+v", nv2, "<nil>")
  1028. addFormatterTest("%+v", v2, v2s)
  1029. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  1030. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  1031. addFormatterTest("%+v", nv2, "<nil>")
  1032. addFormatterTest("%#v", v2, "("+v2t+")"+v2s)
  1033. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s)
  1034. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s)
  1035. addFormatterTest("%#v", nv2, "(*"+v2t+")"+"<nil>")
  1036. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s)
  1037. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s)
  1038. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s)
  1039. addFormatterTest("%#+v", nv2, "(*"+v2t+")"+"<nil>")
  1040. // Function with multiple params and multiple returns.
  1041. var v3 = func(i int, s string) (b bool, err error) {
  1042. return true, nil
  1043. }
  1044. nv3 := (*func(int, string) (bool, error))(nil)
  1045. pv3 := &v3
  1046. v3Addr := fmt.Sprintf("%p", pv3)
  1047. pv3Addr := fmt.Sprintf("%p", &pv3)
  1048. v3t := "func(int, string) (bool, error)"
  1049. v3s := fmt.Sprintf("%p", v3)
  1050. addFormatterTest("%v", v3, v3s)
  1051. addFormatterTest("%v", pv3, "<*>"+v3s)
  1052. addFormatterTest("%v", &pv3, "<**>"+v3s)
  1053. addFormatterTest("%+v", nv3, "<nil>")
  1054. addFormatterTest("%+v", v3, v3s)
  1055. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  1056. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  1057. addFormatterTest("%+v", nv3, "<nil>")
  1058. addFormatterTest("%#v", v3, "("+v3t+")"+v3s)
  1059. addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s)
  1060. addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s)
  1061. addFormatterTest("%#v", nv3, "(*"+v3t+")"+"<nil>")
  1062. addFormatterTest("%#+v", v3, "("+v3t+")"+v3s)
  1063. addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s)
  1064. addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s)
  1065. addFormatterTest("%#+v", nv3, "(*"+v3t+")"+"<nil>")
  1066. }
  1067. func addCircularFormatterTests() {
  1068. // Struct that is circular through self referencing.
  1069. type circular struct {
  1070. c *circular
  1071. }
  1072. v := circular{nil}
  1073. v.c = &v
  1074. pv := &v
  1075. vAddr := fmt.Sprintf("%p", pv)
  1076. pvAddr := fmt.Sprintf("%p", &pv)
  1077. vt := "spew_test.circular"
  1078. vs := "{<*>{<*><shown>}}"
  1079. vs2 := "{<*><shown>}"
  1080. vs3 := "{c:<*>(" + vAddr + "){c:<*>(" + vAddr + ")<shown>}}"
  1081. vs4 := "{c:<*>(" + vAddr + ")<shown>}"
  1082. vs5 := "{c:(*" + vt + "){c:(*" + vt + ")<shown>}}"
  1083. vs6 := "{c:(*" + vt + ")<shown>}"
  1084. vs7 := "{c:(*" + vt + ")(" + vAddr + "){c:(*" + vt + ")(" + vAddr +
  1085. ")<shown>}}"
  1086. vs8 := "{c:(*" + vt + ")(" + vAddr + ")<shown>}"
  1087. addFormatterTest("%v", v, vs)
  1088. addFormatterTest("%v", pv, "<*>"+vs2)
  1089. addFormatterTest("%v", &pv, "<**>"+vs2)
  1090. addFormatterTest("%+v", v, vs3)
  1091. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs4)
  1092. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs4)
  1093. addFormatterTest("%#v", v, "("+vt+")"+vs5)
  1094. addFormatterTest("%#v", pv, "(*"+vt+")"+vs6)
  1095. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs6)
  1096. addFormatterTest("%#+v", v, "("+vt+")"+vs7)
  1097. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs8)
  1098. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs8)
  1099. // Structs that are circular through cross referencing.
  1100. v2 := xref1{nil}
  1101. ts2 := xref2{&v2}
  1102. v2.ps2 = &ts2
  1103. pv2 := &v2
  1104. ts2Addr := fmt.Sprintf("%p", &ts2)
  1105. v2Addr := fmt.Sprintf("%p", pv2)
  1106. pv2Addr := fmt.Sprintf("%p", &pv2)
  1107. v2t := "spew_test.xref1"
  1108. v2t2 := "spew_test.xref2"
  1109. v2s := "{<*>{<*>{<*><shown>}}}"
  1110. v2s2 := "{<*>{<*><shown>}}"
  1111. v2s3 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + "){ps2:<*>(" +
  1112. ts2Addr + ")<shown>}}}"
  1113. v2s4 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + ")<shown>}}"
  1114. v2s5 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + "){ps2:(*" + v2t2 +
  1115. ")<shown>}}}"
  1116. v2s6 := "{ps2:(*" + v2t2 + "){ps1:(*" + v2t + ")<shown>}}"
  1117. v2s7 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t +
  1118. ")(" + v2Addr + "){ps2:(*" + v2t2 + ")(" + ts2Addr +
  1119. ")<shown>}}}"
  1120. v2s8 := "{ps2:(*" + v2t2 + ")(" + ts2Addr + "){ps1:(*" + v2t +
  1121. ")(" + v2Addr + ")<shown>}}"
  1122. addFormatterTest("%v", v2, v2s)
  1123. addFormatterTest("%v", pv2, "<*>"+v2s2)
  1124. addFormatterTest("%v", &pv2, "<**>"+v2s2)
  1125. addFormatterTest("%+v", v2, v2s3)
  1126. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s4)
  1127. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s4)
  1128. addFormatterTest("%#v", v2, "("+v2t+")"+v2s5)
  1129. addFormatterTest("%#v", pv2, "(*"+v2t+")"+v2s6)
  1130. addFormatterTest("%#v", &pv2, "(**"+v2t+")"+v2s6)
  1131. addFormatterTest("%#+v", v2, "("+v2t+")"+v2s7)
  1132. addFormatterTest("%#+v", pv2, "(*"+v2t+")("+v2Addr+")"+v2s8)
  1133. addFormatterTest("%#+v", &pv2, "(**"+v2t+")("+pv2Addr+"->"+v2Addr+")"+v2s8)
  1134. // Structs that are indirectly circular.
  1135. v3 := indirCir1{nil}
  1136. tic2 := indirCir2{nil}
  1137. tic3 := indirCir3{&v3}
  1138. tic2.ps3 = &tic3
  1139. v3.ps2 = &tic2
  1140. pv3 := &v3
  1141. tic2Addr := fmt.Sprintf("%p", &tic2)
  1142. tic3Addr := fmt.Sprintf("%p", &tic3)
  1143. v3Addr := fmt.Sprintf("%p", pv3)
  1144. pv3Addr := fmt.Sprintf("%p", &pv3)
  1145. v3t := "spew_test.indirCir1"
  1146. v3t2 := "spew_test.indirCir2"
  1147. v3t3 := "spew_test.indirCir3"
  1148. v3s := "{<*>{<*>{<*>{<*><shown>}}}}"
  1149. v3s2 := "{<*>{<*>{<*><shown>}}}"
  1150. v3s3 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" +
  1151. v3Addr + "){ps2:<*>(" + tic2Addr + ")<shown>}}}}"
  1152. v3s4 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" +
  1153. v3Addr + ")<shown>}}}"
  1154. v3s5 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t +
  1155. "){ps2:(*" + v3t2 + ")<shown>}}}}"
  1156. v3s6 := "{ps2:(*" + v3t2 + "){ps3:(*" + v3t3 + "){ps1:(*" + v3t +
  1157. ")<shown>}}}"
  1158. v3s7 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" +
  1159. tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + "){ps2:(*" + v3t2 +
  1160. ")(" + tic2Addr + ")<shown>}}}}"
  1161. v3s8 := "{ps2:(*" + v3t2 + ")(" + tic2Addr + "){ps3:(*" + v3t3 + ")(" +
  1162. tic3Addr + "){ps1:(*" + v3t + ")(" + v3Addr + ")<shown>}}}"
  1163. addFormatterTest("%v", v3, v3s)
  1164. addFormatterTest("%v", pv3, "<*>"+v3s2)
  1165. addFormatterTest("%v", &pv3, "<**>"+v3s2)
  1166. addFormatterTest("%+v", v3, v3s3)
  1167. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s4)
  1168. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s4)
  1169. addFormatterTest("%#v", v3, "("+v3t+")"+v3s5)
  1170. addFormatterTest("%#v", pv3, "(*"+v3t+")"+v3s6)
  1171. addFormatterTest("%#v", &pv3, "(**"+v3t+")"+v3s6)
  1172. addFormatterTest("%#+v", v3, "("+v3t+")"+v3s7)
  1173. addFormatterTest("%#+v", pv3, "(*"+v3t+")("+v3Addr+")"+v3s8)
  1174. addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s8)
  1175. }
  1176. func addPanicFormatterTests() {
  1177. // Type that panics in its Stringer interface.
  1178. v := panicer(127)
  1179. nv := (*panicer)(nil)
  1180. pv := &v
  1181. vAddr := fmt.Sprintf("%p", pv)
  1182. pvAddr := fmt.Sprintf("%p", &pv)
  1183. vt := "spew_test.panicer"
  1184. vs := "(PANIC=test panic)127"
  1185. addFormatterTest("%v", v, vs)
  1186. addFormatterTest("%v", pv, "<*>"+vs)
  1187. addFormatterTest("%v", &pv, "<**>"+vs)
  1188. addFormatterTest("%v", nv, "<nil>")
  1189. addFormatterTest("%+v", v, vs)
  1190. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  1191. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  1192. addFormatterTest("%+v", nv, "<nil>")
  1193. addFormatterTest("%#v", v, "("+vt+")"+vs)
  1194. addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
  1195. addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
  1196. addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
  1197. addFormatterTest("%#+v", v, "("+vt+")"+vs)
  1198. addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
  1199. addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
  1200. addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
  1201. }
  1202. // TestFormatter executes all of the tests described by formatterTests.
  1203. func TestFormatter(t *testing.T) {
  1204. // Setup tests.
  1205. addIntFormatterTests()
  1206. addUintFormatterTests()
  1207. addBoolFormatterTests()
  1208. addFloatFormatterTests()
  1209. addComplexFormatterTests()
  1210. addArrayFormatterTests()
  1211. addSliceFormatterTests()
  1212. addStringFormatterTests()
  1213. addNilInterfaceFormatterTests()
  1214. addMapFormatterTests()
  1215. addStructFormatterTests()
  1216. addUintptrFormatterTests()
  1217. addUnsafePointerFormatterTests()
  1218. addChanFormatterTests()
  1219. addFuncFormatterTests()
  1220. addCircularFormatterTests()
  1221. addPanicFormatterTests()
  1222. t.Logf("Running %d tests", len(formatterTests))
  1223. for i, test := range formatterTests {
  1224. buf := new(bytes.Buffer)
  1225. spew.Fprintf(buf, test.format, test.in)
  1226. s := buf.String()
  1227. if testFailed(s, test.wants) {
  1228. t.Errorf("Formatter #%d format: %s got: %s %s", i, test.format, s,
  1229. stringizeWants(test.wants))
  1230. continue
  1231. }
  1232. }
  1233. }