format_test.go 50 KB

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