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+")()\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, "") + addFormatterTest("%+v", v, vs) + addFormatterTest("%+v", pv, "<*>("+vAddr+")"+vs) + addFormatterTest("%+v", &pv, "<**>("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%+v", nv, "") + addFormatterTest("%#v", v, "("+vt+")"+vs) + addFormatterTest("%#v", pv, "(*"+vt+")"+vs) + addFormatterTest("%#v", &pv, "(**"+vt+")"+vs) + addFormatterTest("%#v", nv, "(*"+vt+")"+"") + addFormatterTest("%#+v", v, "("+vt+")"+vs) + addFormatterTest("%#+v", pv, "(*"+vt+")("+vAddr+")"+vs) + addFormatterTest("%#+v", &pv, "(**"+vt+")("+pvAddr+"->"+vAddr+")"+vs) + addFormatterTest("%#+v", nv, "(*"+vt+")"+"") +} + // 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