@@ -25,64 +25,92 @@ func init() {
2525}
2626
2727// stripTrace removes go-testdeep useless calls in a trace returned by
28- // trace.Retrieve().
29- //
30- // Remove (*T).Run() call:
31- // A() zz.go:20
32- // TestSubtestTd.func1() zz_test.go:24
33- // →(*T).Run.func1() github.com/maxatome/go-testdeep@xxx/td/t_struct.go:554
34- //
35- // Remove (*T).RunAssertRequire() call:
36- // A() zz.go:20
37- // TestSubtestTd.func1() zz_test.go:24
38- // →(*T).RunAssertRequire.func1() github.com/maxatome/go-testdeep@xxx/td/t_struct.go:554
39- //
40- // Remove (*TestAPI).Run() call:
41- // Subtest.func1() zz.go:20
42- // →(*TestAPI).Run.func1() github.com/maxatome/go-testdeep@xxx/helpers/tdhttp/test_api.go:119
43- // ⇒(*T).Run.func1() github.com/maxatome/go-testdeep@xxx/td/t_struct.go:554
44- //
45- // Remove github.com/maxatome/go-testdeep/helpers/tdsuite calls:
46- // A() zz.go:20
47- // Suite.TestSuite() zz_test.go:35
48- // →Value.call() $GOROOT/src/reflect/value.go:476
49- // →Value.Call() $GOROOT/src/reflect/value.go:337
50- // →run.func2() github.com/maxatome/go-testdeep@xxx/helpers/tdsuite/suite.go:301
51- // ⇒(*T).Run.func1() github.com/maxatome/go-testdeep@xxx/td/t_struct.go:554
52- func stripTrace (tce []trace.Level ) []trace.Level {
53- if len (tce ) <= 1 {
54- return tce
28+ // trace.Retrieve() to make it clearer for the reader.
29+ func stripTrace (s trace.Stack ) trace.Stack {
30+ if len (s ) <= 1 {
31+ return s
5532 }
5633
34+ const (
35+ tdPkg = "github.com/maxatome/go-testdeep/td"
36+ tdhttpPkg = "github.com/maxatome/go-testdeep/helpers/tdhttp"
37+ tdsuitePkg = "github.com/maxatome/go-testdeep/helpers/tdsuite"
38+ )
39+
5740 // Remove useless possible (*T).Run() or (*T).RunAssertRequire() first call
58- first := tce [len (tce )- 1 ]
59- if first .Package != "github.com/maxatome/go-testdeep/td" ||
60- (first .Func != "(*T).Run.func1" &&
61- first .Func != "(*T).RunAssertRequire.func1" ) {
62- return tce
63- }
41+ if s .Match (- 1 , tdPkg , "(*T).Run.func1" , "(*T).RunAssertRequire.func1" ) {
42+ // Remove useless tdhttp (*TestAPI).Run() call
43+ //
44+ // ✓ xxx Subtest.func1()
45+ // ✗ …/tdhttp (*TestAPI).Run.func1
46+ // ✗ …/td (*T).Run.func1()
47+ if s .Match (- 2 , tdhttpPkg , "(*TestAPI).Run.func1" ) {
48+ return s [:len (s )- 2 ]
49+ }
6450
65- tce = tce [:len (tce )- 1 ]
66- first = tce [len (tce )- 1 ]
51+ // Remove useless tdsuite calls
52+ //
53+ // ✓ xxx Suite.TestSuite
54+ // ✗ reflect Value.call
55+ // ✗ reflect Value.Call
56+ // ✗ …/tdsuite run.func2
57+ // ✗ …/td (*T).Run.func1() or (*T).RunAssertRequire.func1()
58+ //
59+ // or for PostTest
60+ // ✓ xxx Suite.PostTest
61+ // ✗ …/tdsuite run.func2.1
62+ // ✗ …/tdsuite run.func2
63+ // ✗ …/td (*T).Run.func1() or (*T).RunAssertRequire.func1()
64+ if s .Match (- 2 , tdsuitePkg , "run.func*" ) {
65+ // PostTest
66+ if s .Match (- 3 , tdsuitePkg , "run.func*" ) &&
67+ len (s ) > 4 &&
68+ strings .HasSuffix (s [len (s )- 4 ].Func , ".PostTest" ) {
69+ return s [:len (s )- 3 ]
70+ }
71+
72+ for i := len (s ) - 3 ; i >= 1 ; i -- {
73+ if ! s .Match (i , "reflect" ) {
74+ return s [:i + 1 ]
75+ }
76+ }
77+ return nil
78+ }
6779
68- // Remove useless tdhttp (*TestAPI).Run() call
69- if first .Package == "github.com/maxatome/go-testdeep/helpers/tdhttp" &&
70- first .Func == "(*TestAPI).Run.func1" {
71- return tce [:len (tce )- 1 ]
80+ return s [:len (s )- 1 ]
7281 }
7382
74- // Remove useless tdsuite calls
75- if first .Package != "github.com/maxatome/go-testdeep/helpers/tdsuite" ||
76- ! strings .HasPrefix (first .Func , "run.func" ) {
77- return tce
83+ // Remove testing.Cleanup() stack
84+ //
85+ // ✓ xxx TestCleanup.func2
86+ // ✗ testing (*common).Cleanup.func1
87+ // ✗ testing (*common).runCleanup
88+ // ✗ testing tRunner.func2
89+ if s .Match (- 1 , "testing" , "tRunner.func*" ) &&
90+ s .Match (- 2 , "testing" , "(*common).runCleanup" ) &&
91+ s .Match (- 3 , "testing" , "(*common).Cleanup.func1" ) {
92+ return s [:len (s )- 3 ]
7893 }
7994
80- for i := len (tce ) - 2 ; i >= 1 ; i -- {
81- if tce [i ].Package != "reflect" {
82- return tce [:i + 1 ]
95+ // Remove tdsuite pre-Setup/BetweenTests/Destroy stack
96+ //
97+ // ✓ xxx Suite.Destroy
98+ // ✗ …/tdsuite run.func1
99+ // ✗ …/tdsuite run
100+ // ✗ …/tdsuite Run
101+ // ✓ xxx TestSuiteDestroy
102+ if ! s .Match (- 1 , tdsuitePkg ) &&
103+ s .Match (- 2 , tdsuitePkg , "Run" ) {
104+ for i := len (s ) - 3 ; i >= 0 ; i -- {
105+ if ! s .Match (i , tdsuitePkg ) {
106+ s [i + 1 ] = s [len (s )- 1 ]
107+ return s [:i + 2 ]
108+ }
83109 }
110+ return s [:1 ]
84111 }
85- return nil
112+
113+ return s
86114}
87115
88116func formatError (t TestingT , isFatal bool , err * ctxerr.Error , args ... interface {}) {
@@ -106,19 +134,19 @@ func formatError(t TestingT, isFatal bool, err *ctxerr.Error, args ...interface{
106134 err .Append (& buf , "" )
107135
108136 // Stask trace
109- if tce := stripTrace (trace .Retrieve (0 , "testing.tRunner" )); len (tce ) > 1 {
137+ if s := stripTrace (trace .Retrieve (0 , "testing.tRunner" )); len (s ) > 1 {
110138 buf .WriteString ("\n This is how we got here:\n " )
111139
112140 fnMaxLen := 0
113- for _ , level := range tce {
141+ for _ , level := range s {
114142 if len (level .Func ) > fnMaxLen {
115143 fnMaxLen = len (level .Func )
116144 }
117145 }
118146 fnMaxLen += 2
119147
120148 nl := ""
121- for _ , level := range tce {
149+ for _ , level := range s {
122150 fmt .Fprintf (& buf , "%s\t %-*s %s" , nl , fnMaxLen , level .Func + "()" , level .FileLine )
123151 nl = "\n "
124152 }
0 commit comments