format_test.go 48 KB

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