summaryrefslogtreecommitdiff
path: root/spew
diff options
context:
space:
mode:
authorDave Collins <[email protected]>2013-01-20 12:31:42 -0600
committerDave Collins <[email protected]>2013-01-20 12:31:42 -0600
commitad1d81b355a1890f4cd7476b1d1e2e1f52541dd5 (patch)
treec8f7bfe9bb3a55ac1241f7d712dd4e76240f6fab /spew
parent5c8d842977941cdb1663827b8c6a93046e211bbb (diff)
Add tests for custom type that panics in Stringer.
Diffstat (limited to 'spew')
-rw-r--r--spew/dump_test.go17
-rw-r--r--spew/format_test.go29
-rw-r--r--spew/spew_test.go8
3 files changed, 54 insertions, 0 deletions
diff --git a/spew/dump_test.go b/spew/dump_test.go
index f3c033b..1310906 100644
--- a/spew/dump_test.go
+++ b/spew/dump_test.go
@@ -50,6 +50,7 @@ base test element are also tested to ensure proper indirection across all types.
- Struct that is circular through self referencing
- Structs that are circular through cross referencing
- Structs that are indirectly circular
+- Type that panics in its Stringer interface
*/
package spew_test
@@ -748,6 +749,21 @@ func addCircularDumpTests() {
addDumpTest(&pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")("+v3s2+")\n")
}
+func addPanicDumpTests() {
+ // Type that panics in its Stringer interface.
+ v := panicer(127)
+ nv := (*panicer)(nil)
+ pv := &v
+ vAddr := fmt.Sprintf("%p", pv)
+ pvAddr := fmt.Sprintf("%p", &pv)
+ vt := "spew_test.panicer"
+ vs := "(PANIC=test panic)127"
+ addDumpTest(v, "("+vt+") "+vs+"\n")
+ addDumpTest(pv, "(*"+vt+")("+vAddr+")("+vs+")\n")
+ addDumpTest(&pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")("+vs+")\n")
+ addDumpTest(nv, "(*"+vt+")(<nil>)\n")
+}
+
// TestDump executes all of the tests described by dumpTests.
func TestDump(t *testing.T) {
// Setup tests.
@@ -767,6 +783,7 @@ func TestDump(t *testing.T) {
addChanDumpTests()
addFuncDumpTests()
addCircularDumpTests()
+ addPanicDumpTests()
t.Logf("Running %d tests", len(dumpTests))
for i, test := range dumpTests {
diff --git a/spew/format_test.go b/spew/format_test.go
index dcd54d9..a419c74 100644
--- a/spew/format_test.go
+++ b/spew/format_test.go
@@ -50,6 +50,7 @@ base test element are also tested to ensure proper indirection across all types.
- Struct that is circular through self referencing
- Structs that are circular through cross referencing
- Structs that are indirectly circular
+- Type that panics in its Stringer interface
*/
package spew_test
@@ -1222,6 +1223,33 @@ func addCircularFormatterTests() {
addFormatterTest("%#+v", &pv3, "(**"+v3t+")("+pv3Addr+"->"+v3Addr+")"+v3s8)
}
+func addPanicFormatterTests() {
+ // Type that panics in its Stringer interface.
+ v := panicer(127)
+ nv := (*panicer)(nil)
+ pv := &v
+ vAddr := fmt.Sprintf("%p", pv)
+ pvAddr := fmt.Sprintf("%p", &pv)
+ vt := "spew_test.panicer"
+ vs := "(PANIC=test panic)127"
+ addFormatterTest("%v", v, vs)
+ addFormatterTest("%v", pv, "<*>"+vs)
+ addFormatterTest("%v", &pv, "<**>"+vs)
+ addFormatterTest("%v", nv, "<nil>")
+ addFormatterTest("%+v", v, vs)
+ addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs)
+ addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs)
+ addFormatterTest("%+v", nv, "<nil>")
+ addFormatterTest("%#v", v, "("+vt+")"+vs)
+ addFormatterTest("%#v", pv, "(*"+vt+")"+vs)
+ addFormatterTest("%#v", &pv, "(**"+vt+")"+vs)
+ addFormatterTest("%#v", nv, "(*"+vt+")"+"<nil>")
+ addFormatterTest("%#+v", v, "("+vt+")"+vs)
+ addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs)
+ addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs)
+ addFormatterTest("%#+v", nv, "(*"+vt+")"+"<nil>")
+}
+
// TestFormatter executes all of the tests described by formatterTests.
func TestFormatter(t *testing.T) {
// Setup tests.
@@ -1241,6 +1269,7 @@ func TestFormatter(t *testing.T) {
addChanFormatterTests()
addFuncFormatterTests()
addCircularFormatterTests()
+ addPanicFormatterTests()
t.Logf("Running %d tests", len(formatterTests))
for i, test := range formatterTests {
diff --git a/spew/spew_test.go b/spew/spew_test.go
index 406edc1..76df103 100644
--- a/spew/spew_test.go
+++ b/spew/spew_test.go
@@ -50,6 +50,14 @@ func testFailed(result string, wants []string) bool {
return true
}
+// panicer is used to intentionally cause a panic for testing spew properly
+// handles them
+type panicer int
+
+func (p panicer) String() string {
+ panic("test panic")
+}
+
// spewFunc is used to identify which public function of the spew package or
// ConfigState a test applies to.
type spewFunc int