format_test.go 46 KB

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