format_test.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807
  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. - Slice containing standard float32 values
  27. - Slice containing type with custom formatter on pointer receiver only
  28. - Standard string
  29. - Nil interface
  30. - Map with string keys and int vals
  31. - Map with custom formatter type on pointer receiver only keys and vals
  32. - Map with interface keys and values
  33. - Struct with primitives
  34. - Struct that contains another struct
  35. - Struct that contains custom type with Stringer pointer interface via both
  36. exported and unexported fields
  37. - Uintptr to 0 (null pointer)
  38. - Uintptr address of real variable
  39. - Unsafe.Pointer to 0 (null pointer)
  40. - Unsafe.Pointer to address of real variable
  41. - Nil channel
  42. - Standard int channel
  43. - Function with no params and no returns
  44. - Function with param and no returns
  45. - Function with multiple params and multiple returns
  46. - Struct that is circular through self referencing
  47. - Structs that are circular through cross referencing
  48. - Structs that are indirectly circular
  49. */
  50. package spew_test
  51. import (
  52. "bytes"
  53. "fmt"
  54. "github.com/davecgh/go-spew/spew"
  55. "testing"
  56. "unsafe"
  57. )
  58. // formatterTest is used to describe a test to be perfomed against NewFormatter.
  59. type formatterTest struct {
  60. format string
  61. in interface{}
  62. want string
  63. }
  64. // formatterTests houses all of the tests to be performed against NewFormatter.
  65. var formatterTests = make([]formatterTest, 0)
  66. // addFormatterTest is a helper method to append the passed input and desired
  67. // result to formatterTests.
  68. func addFormatterTest(format string, in interface{}, want string) {
  69. test := formatterTest{format, in, want}
  70. formatterTests = append(formatterTests, test)
  71. }
  72. func addIntFormatterTests() {
  73. // Max int8.
  74. v := int8(127)
  75. nv := (*int8)(nil)
  76. pv := &v
  77. vAddr := fmt.Sprintf("%p", pv)
  78. pvAddr := fmt.Sprintf("%p", &pv)
  79. vs := "127"
  80. addFormatterTest("%v", v, vs)
  81. addFormatterTest("%v", pv, "<*>"+vs)
  82. addFormatterTest("%v", &pv, "<**>"+vs)
  83. addFormatterTest("%v", nv, "<nil>")
  84. addFormatterTest("%+v", v, vs)
  85. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  86. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  87. addFormatterTest("%+v", nv, "<nil>")
  88. // Max int16.
  89. v2 := int16(32767)
  90. nv2 := (*int16)(nil)
  91. pv2 := &v2
  92. v2Addr := fmt.Sprintf("%p", pv2)
  93. pv2Addr := fmt.Sprintf("%p", &pv2)
  94. v2s := "32767"
  95. addFormatterTest("%v", v2, v2s)
  96. addFormatterTest("%v", pv2, "<*>"+v2s)
  97. addFormatterTest("%v", &pv2, "<**>"+v2s)
  98. addFormatterTest("%v", nv2, "<nil>")
  99. addFormatterTest("%+v", v2, v2s)
  100. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  101. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  102. addFormatterTest("%+v", nv2, "<nil>")
  103. // Max int32.
  104. v3 := int32(2147483647)
  105. nv3 := (*int32)(nil)
  106. pv3 := &v3
  107. v3Addr := fmt.Sprintf("%p", pv3)
  108. pv3Addr := fmt.Sprintf("%p", &pv3)
  109. v3s := "2147483647"
  110. addFormatterTest("%v", v3, v3s)
  111. addFormatterTest("%v", pv3, "<*>"+v3s)
  112. addFormatterTest("%v", &pv3, "<**>"+v3s)
  113. addFormatterTest("%v", nv3, "<nil>")
  114. addFormatterTest("%+v", v3, v3s)
  115. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  116. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  117. addFormatterTest("%+v", nv3, "<nil>")
  118. // Max int64.
  119. v4 := int64(9223372036854775807)
  120. nv4 := (*int64)(nil)
  121. pv4 := &v4
  122. v4Addr := fmt.Sprintf("%p", pv4)
  123. pv4Addr := fmt.Sprintf("%p", &pv4)
  124. v4s := "9223372036854775807"
  125. addFormatterTest("%v", v4, v4s)
  126. addFormatterTest("%v", pv4, "<*>"+v4s)
  127. addFormatterTest("%v", &pv4, "<**>"+v4s)
  128. addFormatterTest("%v", nv4, "<nil>")
  129. addFormatterTest("%+v", v4, v4s)
  130. addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s)
  131. addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s)
  132. addFormatterTest("%+v", nv4, "<nil>")
  133. // Max int.
  134. v5 := int(2147483647)
  135. nv5 := (*int)(nil)
  136. pv5 := &v5
  137. v5Addr := fmt.Sprintf("%p", pv5)
  138. pv5Addr := fmt.Sprintf("%p", &pv5)
  139. v5s := "2147483647"
  140. addFormatterTest("%v", v5, v5s)
  141. addFormatterTest("%v", pv5, "<*>"+v5s)
  142. addFormatterTest("%v", &pv5, "<**>"+v5s)
  143. addFormatterTest("%v", nv5, "<nil>")
  144. addFormatterTest("%+v", v5, v5s)
  145. addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s)
  146. addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s)
  147. addFormatterTest("%+v", nv5, "<nil>")
  148. }
  149. func addUintFormatterTests() {
  150. // Max uint8.
  151. v := uint8(255)
  152. nv := (*uint8)(nil)
  153. pv := &v
  154. vAddr := fmt.Sprintf("%p", pv)
  155. pvAddr := fmt.Sprintf("%p", &pv)
  156. vs := "255"
  157. addFormatterTest("%v", v, vs)
  158. addFormatterTest("%v", pv, "<*>"+vs)
  159. addFormatterTest("%v", &pv, "<**>"+vs)
  160. addFormatterTest("%v", nv, "<nil>")
  161. addFormatterTest("%+v", v, vs)
  162. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  163. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  164. addFormatterTest("%+v", nv, "<nil>")
  165. // Max uint16.
  166. v2 := uint16(65535)
  167. nv2 := (*uint16)(nil)
  168. pv2 := &v2
  169. v2Addr := fmt.Sprintf("%p", pv2)
  170. pv2Addr := fmt.Sprintf("%p", &pv2)
  171. v2s := "65535"
  172. addFormatterTest("%v", v2, v2s)
  173. addFormatterTest("%v", pv2, "<*>"+v2s)
  174. addFormatterTest("%v", &pv2, "<**>"+v2s)
  175. addFormatterTest("%v", nv2, "<nil>")
  176. addFormatterTest("%+v", v2, v2s)
  177. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  178. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  179. addFormatterTest("%+v", nv2, "<nil>")
  180. // Max uint32.
  181. v3 := uint32(4294967295)
  182. nv3 := (*uint32)(nil)
  183. pv3 := &v3
  184. v3Addr := fmt.Sprintf("%p", pv3)
  185. pv3Addr := fmt.Sprintf("%p", &pv3)
  186. v3s := "4294967295"
  187. addFormatterTest("%v", v3, v3s)
  188. addFormatterTest("%v", pv3, "<*>"+v3s)
  189. addFormatterTest("%v", &pv3, "<**>"+v3s)
  190. addFormatterTest("%v", nv3, "<nil>")
  191. addFormatterTest("%+v", v3, v3s)
  192. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  193. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  194. addFormatterTest("%+v", nv3, "<nil>")
  195. // Max uint64.
  196. v4 := uint64(18446744073709551615)
  197. nv4 := (*uint64)(nil)
  198. pv4 := &v4
  199. v4Addr := fmt.Sprintf("%p", pv4)
  200. pv4Addr := fmt.Sprintf("%p", &pv4)
  201. v4s := "18446744073709551615"
  202. addFormatterTest("%v", v4, v4s)
  203. addFormatterTest("%v", pv4, "<*>"+v4s)
  204. addFormatterTest("%v", &pv4, "<**>"+v4s)
  205. addFormatterTest("%v", nv4, "<nil>")
  206. addFormatterTest("%+v", v4, v4s)
  207. addFormatterTest("%+v", pv4, "<*>("+v4Addr+")"+v4s)
  208. addFormatterTest("%+v", &pv4, "<**>("+pv4Addr+"->"+v4Addr+")"+v4s)
  209. addFormatterTest("%+v", nv4, "<nil>")
  210. // Max uint.
  211. v5 := uint(4294967295)
  212. nv5 := (*uint)(nil)
  213. pv5 := &v5
  214. v5Addr := fmt.Sprintf("%p", pv5)
  215. pv5Addr := fmt.Sprintf("%p", &pv5)
  216. v5s := "4294967295"
  217. addFormatterTest("%v", v5, v5s)
  218. addFormatterTest("%v", pv5, "<*>"+v5s)
  219. addFormatterTest("%v", &pv5, "<**>"+v5s)
  220. addFormatterTest("%v", nv5, "<nil>")
  221. addFormatterTest("%+v", v5, v5s)
  222. addFormatterTest("%+v", pv5, "<*>("+v5Addr+")"+v5s)
  223. addFormatterTest("%+v", &pv5, "<**>("+pv5Addr+"->"+v5Addr+")"+v5s)
  224. addFormatterTest("%+v", nv5, "<nil>")
  225. }
  226. func addBoolFormatterTests() {
  227. // Boolean true.
  228. v := bool(true)
  229. nv := (*bool)(nil)
  230. pv := &v
  231. vAddr := fmt.Sprintf("%p", pv)
  232. pvAddr := fmt.Sprintf("%p", &pv)
  233. vs := "true"
  234. addFormatterTest("%v", v, vs)
  235. addFormatterTest("%v", pv, "<*>"+vs)
  236. addFormatterTest("%v", &pv, "<**>"+vs)
  237. addFormatterTest("%v", nv, "<nil>")
  238. addFormatterTest("%+v", v, vs)
  239. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  240. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  241. addFormatterTest("%+v", nv, "<nil>")
  242. // Boolean false.
  243. v2 := bool(false)
  244. pv2 := &v2
  245. v2Addr := fmt.Sprintf("%p", pv2)
  246. pv2Addr := fmt.Sprintf("%p", &pv2)
  247. v2s := "false"
  248. addFormatterTest("%v", v2, v2s)
  249. addFormatterTest("%v", pv2, "<*>"+v2s)
  250. addFormatterTest("%v", &pv2, "<**>"+v2s)
  251. addFormatterTest("%+v", v2, v2s)
  252. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  253. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  254. }
  255. func addFloatFormatterTests() {
  256. // Standard float32.
  257. v := float32(3.1415)
  258. nv := (*float32)(nil)
  259. pv := &v
  260. vAddr := fmt.Sprintf("%p", pv)
  261. pvAddr := fmt.Sprintf("%p", &pv)
  262. vs := "3.1415"
  263. addFormatterTest("%v", v, vs)
  264. addFormatterTest("%v", pv, "<*>"+vs)
  265. addFormatterTest("%v", &pv, "<**>"+vs)
  266. addFormatterTest("%v", nv, "<nil>")
  267. addFormatterTest("%+v", v, vs)
  268. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  269. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  270. addFormatterTest("%+v", nv, "<nil>")
  271. // Standard float64.
  272. v2 := float64(3.1415926)
  273. nv2 := (*float64)(nil)
  274. pv2 := &v2
  275. v2Addr := fmt.Sprintf("%p", pv2)
  276. pv2Addr := fmt.Sprintf("%p", &pv2)
  277. v2s := "3.1415926"
  278. addFormatterTest("%v", v2, v2s)
  279. addFormatterTest("%v", pv2, "<*>"+v2s)
  280. addFormatterTest("%v", &pv2, "<**>"+v2s)
  281. addFormatterTest("%+v", nv2, "<nil>")
  282. addFormatterTest("%+v", v2, v2s)
  283. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  284. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  285. addFormatterTest("%+v", nv2, "<nil>")
  286. }
  287. func addComplexFormatterTests() {
  288. // Standard complex64.
  289. v := complex(float32(6), -2)
  290. nv := (*complex64)(nil)
  291. pv := &v
  292. vAddr := fmt.Sprintf("%p", pv)
  293. pvAddr := fmt.Sprintf("%p", &pv)
  294. vs := "(6-2i)"
  295. addFormatterTest("%v", v, vs)
  296. addFormatterTest("%v", pv, "<*>"+vs)
  297. addFormatterTest("%v", &pv, "<**>"+vs)
  298. addFormatterTest("%+v", nv, "<nil>")
  299. addFormatterTest("%+v", v, vs)
  300. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  301. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  302. addFormatterTest("%+v", nv, "<nil>")
  303. // Standard complex128.
  304. v2 := complex(float64(-6), 2)
  305. nv2 := (*complex128)(nil)
  306. pv2 := &v2
  307. v2Addr := fmt.Sprintf("%p", pv2)
  308. pv2Addr := fmt.Sprintf("%p", &pv2)
  309. v2s := "(-6+2i)"
  310. addFormatterTest("%v", v2, v2s)
  311. addFormatterTest("%v", pv2, "<*>"+v2s)
  312. addFormatterTest("%v", &pv2, "<**>"+v2s)
  313. addFormatterTest("%+v", nv2, "<nil>")
  314. addFormatterTest("%+v", v2, v2s)
  315. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  316. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  317. addFormatterTest("%+v", nv2, "<nil>")
  318. }
  319. func addArrayFormatterTests() {
  320. // Array containing standard ints.
  321. v := [3]int{1, 2, 3}
  322. nv := (*[3]int)(nil)
  323. pv := &v
  324. vAddr := fmt.Sprintf("%p", pv)
  325. pvAddr := fmt.Sprintf("%p", &pv)
  326. vs := "[1 2 3]"
  327. addFormatterTest("%v", v, vs)
  328. addFormatterTest("%v", pv, "<*>"+vs)
  329. addFormatterTest("%v", &pv, "<**>"+vs)
  330. addFormatterTest("%+v", nv, "<nil>")
  331. addFormatterTest("%+v", v, vs)
  332. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  333. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  334. addFormatterTest("%+v", nv, "<nil>")
  335. // Array containing type with custom formatter on pointer receiver only.
  336. v2 := [3]pstringer{"1", "2", "3"}
  337. nv2 := (*[3]pstringer)(nil)
  338. pv2 := &v2
  339. v2Addr := fmt.Sprintf("%p", pv2)
  340. pv2Addr := fmt.Sprintf("%p", &pv2)
  341. v2s := "[stringer 1 stringer 2 stringer 3]"
  342. addFormatterTest("%v", v2, v2s)
  343. addFormatterTest("%v", pv2, "<*>"+v2s)
  344. addFormatterTest("%v", &pv2, "<**>"+v2s)
  345. addFormatterTest("%+v", nv2, "<nil>")
  346. addFormatterTest("%+v", v2, v2s)
  347. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  348. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  349. addFormatterTest("%+v", nv2, "<nil>")
  350. }
  351. func addSliceFormatterTests() {
  352. // Slice containing standard float32 values.
  353. v := []float32{3.14, 6.28, 12.56}
  354. nv := (*[]float32)(nil)
  355. pv := &v
  356. vAddr := fmt.Sprintf("%p", pv)
  357. pvAddr := fmt.Sprintf("%p", &pv)
  358. vs := "[3.14 6.28 12.56]"
  359. addFormatterTest("%v", v, vs)
  360. addFormatterTest("%v", pv, "<*>"+vs)
  361. addFormatterTest("%v", &pv, "<**>"+vs)
  362. addFormatterTest("%+v", nv, "<nil>")
  363. addFormatterTest("%+v", v, vs)
  364. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  365. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  366. addFormatterTest("%+v", nv, "<nil>")
  367. // Slice containing type with custom formatter on pointer receiver only.
  368. v2 := []pstringer{"1", "2", "3"}
  369. nv2 := (*[]pstringer)(nil)
  370. pv2 := &v2
  371. v2Addr := fmt.Sprintf("%p", pv2)
  372. pv2Addr := fmt.Sprintf("%p", &pv2)
  373. v2s := "[stringer 1 stringer 2 stringer 3]"
  374. addFormatterTest("%v", v2, v2s)
  375. addFormatterTest("%v", pv2, "<*>"+v2s)
  376. addFormatterTest("%v", &pv2, "<**>"+v2s)
  377. addFormatterTest("%+v", nv2, "<nil>")
  378. addFormatterTest("%+v", v2, v2s)
  379. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  380. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  381. addFormatterTest("%+v", nv2, "<nil>")
  382. }
  383. func addStringFormatterTests() {
  384. // Standard string.
  385. v := "test"
  386. nv := (*string)(nil)
  387. pv := &v
  388. vAddr := fmt.Sprintf("%p", pv)
  389. pvAddr := fmt.Sprintf("%p", &pv)
  390. vs := "test"
  391. addFormatterTest("%v", v, vs)
  392. addFormatterTest("%v", pv, "<*>"+vs)
  393. addFormatterTest("%v", &pv, "<**>"+vs)
  394. addFormatterTest("%+v", nv, "<nil>")
  395. addFormatterTest("%+v", v, vs)
  396. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  397. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  398. addFormatterTest("%+v", nv, "<nil>")
  399. }
  400. func addNilInterfaceFormatterTests() {
  401. // Nil interface.
  402. var v interface{}
  403. nv := (*interface{})(nil)
  404. pv := &v
  405. vAddr := fmt.Sprintf("%p", pv)
  406. pvAddr := fmt.Sprintf("%p", &pv)
  407. vs := "<nil>"
  408. addFormatterTest("%v", v, vs)
  409. addFormatterTest("%v", pv, "<*>"+vs)
  410. addFormatterTest("%v", &pv, "<**>"+vs)
  411. addFormatterTest("%+v", nv, "<nil>")
  412. addFormatterTest("%+v", v, vs)
  413. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  414. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  415. addFormatterTest("%+v", nv, "<nil>")
  416. }
  417. func addMapFormatterTests() {
  418. // Map with string keys and int vals.
  419. v := map[string]int{"one": 1}
  420. nv := (*map[string]int)(nil)
  421. pv := &v
  422. vAddr := fmt.Sprintf("%p", pv)
  423. pvAddr := fmt.Sprintf("%p", &pv)
  424. vs := "map[one:1]"
  425. addFormatterTest("%v", v, vs)
  426. addFormatterTest("%v", pv, "<*>"+vs)
  427. addFormatterTest("%v", &pv, "<**>"+vs)
  428. addFormatterTest("%+v", nv, "<nil>")
  429. addFormatterTest("%+v", v, vs)
  430. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  431. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  432. addFormatterTest("%+v", nv, "<nil>")
  433. // Map with custom formatter type on pointer receiver only keys and vals.
  434. v2 := map[pstringer]pstringer{"one": "1"}
  435. nv2 := (*map[pstringer]pstringer)(nil)
  436. pv2 := &v2
  437. v2Addr := fmt.Sprintf("%p", pv2)
  438. pv2Addr := fmt.Sprintf("%p", &pv2)
  439. v2s := "map[stringer one:stringer 1]"
  440. addFormatterTest("%v", v2, v2s)
  441. addFormatterTest("%v", pv2, "<*>"+v2s)
  442. addFormatterTest("%v", &pv2, "<**>"+v2s)
  443. addFormatterTest("%+v", nv2, "<nil>")
  444. addFormatterTest("%+v", v2, v2s)
  445. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  446. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  447. addFormatterTest("%+v", nv2, "<nil>")
  448. // Map with interface keys and values.
  449. v3 := map[interface{}]interface{}{"one": 1}
  450. nv3 := (*map[interface{}]interface{})(nil)
  451. pv3 := &v3
  452. v3Addr := fmt.Sprintf("%p", pv3)
  453. pv3Addr := fmt.Sprintf("%p", &pv3)
  454. v3s := "map[one:1]"
  455. addFormatterTest("%v", v3, v3s)
  456. addFormatterTest("%v", pv3, "<*>"+v3s)
  457. addFormatterTest("%v", &pv3, "<**>"+v3s)
  458. addFormatterTest("%+v", nv3, "<nil>")
  459. addFormatterTest("%+v", v3, v3s)
  460. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  461. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  462. addFormatterTest("%+v", nv3, "<nil>")
  463. }
  464. func addStructFormatterTests() {
  465. // Struct with primitives.
  466. type s1 struct {
  467. a int8
  468. b uint8
  469. }
  470. v := s1{127, 255}
  471. nv := (*s1)(nil)
  472. pv := &v
  473. vAddr := fmt.Sprintf("%p", pv)
  474. pvAddr := fmt.Sprintf("%p", &pv)
  475. vs := "{127 255}"
  476. vs2 := "{a:127 b:255}"
  477. addFormatterTest("%v", v, vs)
  478. addFormatterTest("%v", pv, "<*>"+vs)
  479. addFormatterTest("%v", &pv, "<**>"+vs)
  480. addFormatterTest("%+v", nv, "<nil>")
  481. addFormatterTest("%+v", v, vs2)
  482. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs2)
  483. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs2)
  484. addFormatterTest("%+v", nv, "<nil>")
  485. // Struct that contains another struct.
  486. type s2 struct {
  487. s1 s1
  488. b bool
  489. }
  490. v2 := s2{s1{127, 255}, true}
  491. nv2 := (*s2)(nil)
  492. pv2 := &v2
  493. v2Addr := fmt.Sprintf("%p", pv2)
  494. pv2Addr := fmt.Sprintf("%p", &pv2)
  495. v2s := "{{127 255} true}"
  496. v2s2 := "{s1:{a:127 b:255} b:true}"
  497. addFormatterTest("%v", v2, v2s)
  498. addFormatterTest("%v", pv2, "<*>"+v2s)
  499. addFormatterTest("%v", &pv2, "<**>"+v2s)
  500. addFormatterTest("%+v", nv2, "<nil>")
  501. addFormatterTest("%+v", v2, v2s2)
  502. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s2)
  503. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s2)
  504. addFormatterTest("%+v", nv2, "<nil>")
  505. // Struct that contains custom type with Stringer pointer interface via both
  506. // exported and unexported fields.
  507. type s3 struct {
  508. s pstringer
  509. S pstringer
  510. }
  511. v3 := s3{"test", "test2"}
  512. nv3 := (*s3)(nil)
  513. pv3 := &v3
  514. v3Addr := fmt.Sprintf("%p", pv3)
  515. pv3Addr := fmt.Sprintf("%p", &pv3)
  516. v3s := "{stringer test stringer test2}"
  517. v3s2 := "{s:stringer test S:stringer test2}"
  518. addFormatterTest("%v", v3, v3s)
  519. addFormatterTest("%v", pv3, "<*>"+v3s)
  520. addFormatterTest("%v", &pv3, "<**>"+v3s)
  521. addFormatterTest("%+v", nv3, "<nil>")
  522. addFormatterTest("%+v", v3, v3s2)
  523. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s2)
  524. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s2)
  525. addFormatterTest("%+v", nv3, "<nil>")
  526. }
  527. func addUintptrFormatterTests() {
  528. // Null pointer.
  529. v := uintptr(0)
  530. nv := (*uintptr)(nil)
  531. pv := &v
  532. vAddr := fmt.Sprintf("%p", pv)
  533. pvAddr := fmt.Sprintf("%p", &pv)
  534. vs := "<nil>"
  535. addFormatterTest("%v", v, vs)
  536. addFormatterTest("%v", pv, "<*>"+vs)
  537. addFormatterTest("%v", &pv, "<**>"+vs)
  538. addFormatterTest("%+v", nv, "<nil>")
  539. addFormatterTest("%+v", v, vs)
  540. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  541. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  542. addFormatterTest("%+v", nv, "<nil>")
  543. // Address of real variable.
  544. i := 1
  545. v2 := uintptr(unsafe.Pointer(&i))
  546. pv2 := &v2
  547. v2Addr := fmt.Sprintf("%p", pv2)
  548. pv2Addr := fmt.Sprintf("%p", &pv2)
  549. v2s := fmt.Sprintf("%p", &i)
  550. addFormatterTest("%v", v2, v2s)
  551. addFormatterTest("%v", pv2, "<*>"+v2s)
  552. addFormatterTest("%v", &pv2, "<**>"+v2s)
  553. addFormatterTest("%+v", v2, v2s)
  554. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  555. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  556. }
  557. func addUnsafePointerFormatterTests() {
  558. // Null pointer.
  559. v := unsafe.Pointer(uintptr(0))
  560. nv := (*unsafe.Pointer)(nil)
  561. pv := &v
  562. vAddr := fmt.Sprintf("%p", pv)
  563. pvAddr := fmt.Sprintf("%p", &pv)
  564. vs := "<nil>"
  565. addFormatterTest("%v", v, vs)
  566. addFormatterTest("%v", pv, "<*>"+vs)
  567. addFormatterTest("%v", &pv, "<**>"+vs)
  568. addFormatterTest("%+v", nv, "<nil>")
  569. addFormatterTest("%+v", v, vs)
  570. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  571. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  572. addFormatterTest("%+v", nv, "<nil>")
  573. // Address of real variable.
  574. i := 1
  575. v2 := unsafe.Pointer(&i)
  576. pv2 := &v2
  577. v2Addr := fmt.Sprintf("%p", pv2)
  578. pv2Addr := fmt.Sprintf("%p", &pv2)
  579. v2s := fmt.Sprintf("%p", &i)
  580. addFormatterTest("%v", v2, v2s)
  581. addFormatterTest("%v", pv2, "<*>"+v2s)
  582. addFormatterTest("%v", &pv2, "<**>"+v2s)
  583. addFormatterTest("%+v", v2, v2s)
  584. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  585. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  586. }
  587. func addChanFormatterTests() {
  588. // Nil channel.
  589. var v chan int
  590. pv := &v
  591. nv := (*chan int)(nil)
  592. vAddr := fmt.Sprintf("%p", pv)
  593. pvAddr := fmt.Sprintf("%p", &pv)
  594. vs := "<nil>"
  595. addFormatterTest("%v", v, vs)
  596. addFormatterTest("%v", pv, "<*>"+vs)
  597. addFormatterTest("%v", &pv, "<**>"+vs)
  598. addFormatterTest("%+v", nv, "<nil>")
  599. addFormatterTest("%+v", v, vs)
  600. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  601. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  602. addFormatterTest("%+v", nv, "<nil>")
  603. // Real channel.
  604. v2 := make(chan int)
  605. pv2 := &v2
  606. v2Addr := fmt.Sprintf("%p", pv2)
  607. pv2Addr := fmt.Sprintf("%p", &pv2)
  608. v2s := fmt.Sprintf("%p", v2)
  609. addFormatterTest("%v", v2, v2s)
  610. addFormatterTest("%v", pv2, "<*>"+v2s)
  611. addFormatterTest("%v", &pv2, "<**>"+v2s)
  612. addFormatterTest("%+v", v2, v2s)
  613. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  614. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  615. }
  616. func addFuncFormatterTests() {
  617. // Function with no params and no returns.
  618. v := addIntFormatterTests
  619. nv := (*func())(nil)
  620. pv := &v
  621. vAddr := fmt.Sprintf("%p", pv)
  622. pvAddr := fmt.Sprintf("%p", &pv)
  623. vs := fmt.Sprintf("%p", v)
  624. addFormatterTest("%v", v, vs)
  625. addFormatterTest("%v", pv, "<*>"+vs)
  626. addFormatterTest("%v", &pv, "<**>"+vs)
  627. addFormatterTest("%+v", nv, "<nil>")
  628. addFormatterTest("%+v", v, vs)
  629. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
  630. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
  631. addFormatterTest("%+v", nv, "<nil>")
  632. // Function with param and no returns.
  633. v2 := TestFormatter
  634. nv2 := (*func(*testing.T))(nil)
  635. pv2 := &v2
  636. v2Addr := fmt.Sprintf("%p", pv2)
  637. pv2Addr := fmt.Sprintf("%p", &pv2)
  638. v2s := fmt.Sprintf("%p", v2)
  639. addFormatterTest("%v", v2, v2s)
  640. addFormatterTest("%v", pv2, "<*>"+v2s)
  641. addFormatterTest("%v", &pv2, "<**>"+v2s)
  642. addFormatterTest("%+v", nv2, "<nil>")
  643. addFormatterTest("%+v", v2, v2s)
  644. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s)
  645. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s)
  646. addFormatterTest("%+v", nv2, "<nil>")
  647. // Function with multiple params and multiple returns.
  648. var v3 = func(i int, s string) (b bool, err error) {
  649. return true, nil
  650. }
  651. nv3 := (*func(int, string) (bool, error))(nil)
  652. pv3 := &v3
  653. v3Addr := fmt.Sprintf("%p", pv3)
  654. pv3Addr := fmt.Sprintf("%p", &pv3)
  655. v3s := fmt.Sprintf("%p", v3)
  656. addFormatterTest("%v", v3, v3s)
  657. addFormatterTest("%v", pv3, "<*>"+v3s)
  658. addFormatterTest("%v", &pv3, "<**>"+v3s)
  659. addFormatterTest("%+v", nv3, "<nil>")
  660. addFormatterTest("%+v", v3, v3s)
  661. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s)
  662. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s)
  663. addFormatterTest("%+v", nv3, "<nil>")
  664. }
  665. func addCircularFormatterTests() {
  666. // Struct that is circular through self referencing.
  667. type circular struct {
  668. c *circular
  669. }
  670. v := circular{nil}
  671. v.c = &v
  672. pv := &v
  673. vAddr := fmt.Sprintf("%p", pv)
  674. pvAddr := fmt.Sprintf("%p", &pv)
  675. vs := "{<*>{<*><shown>}}"
  676. vs2 := "{<*><shown>}"
  677. vs3 := "{c:<*>(" + vAddr + "){c:<*>(" + vAddr + ")<shown>}}"
  678. vs4 := "{c:<*>(" + vAddr + ")<shown>}"
  679. addFormatterTest("%v", v, vs)
  680. addFormatterTest("%v", pv, "<*>"+vs2)
  681. addFormatterTest("%v", &pv, "<**>"+vs2)
  682. addFormatterTest("%+v", v, vs3)
  683. addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs4)
  684. addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs4)
  685. // Structs that are circular through cross referencing.
  686. v2 := xref1{nil}
  687. ts2 := xref2{&v2}
  688. v2.ps2 = &ts2
  689. pv2 := &v2
  690. ts2Addr := fmt.Sprintf("%p", &ts2)
  691. v2Addr := fmt.Sprintf("%p", pv2)
  692. pv2Addr := fmt.Sprintf("%p", &pv2)
  693. v2s := "{<*>{<*>{<*><shown>}}}"
  694. v2s2 := "{<*>{<*><shown>}}"
  695. v2s3 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + "){ps2:<*>(" +
  696. ts2Addr + ")<shown>}}}"
  697. v2s4 := "{ps2:<*>(" + ts2Addr + "){ps1:<*>(" + v2Addr + ")<shown>}}"
  698. addFormatterTest("%v", v2, v2s)
  699. addFormatterTest("%v", pv2, "<*>"+v2s2)
  700. addFormatterTest("%v", &pv2, "<**>"+v2s2)
  701. addFormatterTest("%+v", v2, v2s3)
  702. addFormatterTest("%+v", pv2, "<*>("+v2Addr+")"+v2s4)
  703. addFormatterTest("%+v", &pv2, "<**>("+pv2Addr+"->"+v2Addr+")"+v2s4)
  704. // Structs that are indirectly circular.
  705. v3 := indirCir1{nil}
  706. tic2 := indirCir2{nil}
  707. tic3 := indirCir3{&v3}
  708. tic2.ps3 = &tic3
  709. v3.ps2 = &tic2
  710. pv3 := &v3
  711. tic2Addr := fmt.Sprintf("%p", &tic2)
  712. tic3Addr := fmt.Sprintf("%p", &tic3)
  713. v3Addr := fmt.Sprintf("%p", pv3)
  714. pv3Addr := fmt.Sprintf("%p", &pv3)
  715. v3s := "{<*>{<*>{<*>{<*><shown>}}}}"
  716. v3s2 := "{<*>{<*>{<*><shown>}}}"
  717. v3s3 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" +
  718. v3Addr + "){ps2:<*>(" + tic2Addr + ")<shown>}}}}"
  719. v3s4 := "{ps2:<*>(" + tic2Addr + "){ps3:<*>(" + tic3Addr + "){ps1:<*>(" +
  720. v3Addr + ")<shown>}}}"
  721. addFormatterTest("%v", v3, v3s)
  722. addFormatterTest("%v", pv3, "<*>"+v3s2)
  723. addFormatterTest("%v", &pv3, "<**>"+v3s2)
  724. addFormatterTest("%+v", v3, v3s3)
  725. addFormatterTest("%+v", pv3, "<*>("+v3Addr+")"+v3s4)
  726. addFormatterTest("%+v", &pv3, "<**>("+pv3Addr+"->"+v3Addr+")"+v3s4)
  727. }
  728. // TestFormatter executes all of the tests described by formatterTests.
  729. func TestFormatter(t *testing.T) {
  730. // Setup tests.
  731. addIntFormatterTests()
  732. addUintFormatterTests()
  733. addBoolFormatterTests()
  734. addFloatFormatterTests()
  735. addComplexFormatterTests()
  736. addArrayFormatterTests()
  737. addSliceFormatterTests()
  738. addStringFormatterTests()
  739. addNilInterfaceFormatterTests()
  740. addMapFormatterTests()
  741. addStructFormatterTests()
  742. addUintptrFormatterTests()
  743. addUnsafePointerFormatterTests()
  744. addChanFormatterTests()
  745. addFuncFormatterTests()
  746. addCircularFormatterTests()
  747. t.Logf("Running %d tests", len(formatterTests))
  748. for i, test := range formatterTests {
  749. buf := new(bytes.Buffer)
  750. spew.Fprintf(buf, test.format, test.in)
  751. s := buf.String()
  752. if test.want != s {
  753. t.Errorf("Formatter #%d format: %s got: %s want: %s", i,
  754. test.format, s, test.want)
  755. continue
  756. }
  757. }
  758. }