@@ -50,7 +50,7 @@ func (r *Runner) RunTests() ([]reports.TestResult, error) {
5050 r .rawOutputs [p ] = & bytes.Buffer {}
5151 }
5252 separator := strings .Repeat ("-" , 80 )
53- r .rawOutputs [p ].WriteString (fmt .Sprintf ("%d%s\n " , i , separator ))
53+ r .rawOutputs [p ].WriteString (fmt .Sprintf ("Run %d%s\n " , i + 1 , separator ))
5454 }
5555 jsonFilePath , passed , err := r .runTests (p )
5656 if err != nil {
@@ -193,37 +193,11 @@ func parseTestResults(filePaths []string) ([]reports.TestResult, error) {
193193 result = testDetails [key ]
194194 }
195195
196- // TODO: This is a bit of a logical mess, refactor
196+ // TODO: This is a bit of a logical mess, probably worth a refactor
197197 if entryLine .Output != "" {
198198 if panicDetectionMode || raceDetectionMode { // currently collecting panic or race output
199199 detectedEntries = append (detectedEntries , entryLine )
200- if entryLine .Action == "fail" { // End of panic output
201- if panicDetectionMode {
202- panicTest , err := attributePanicToTest (entryLine .Package , detectedEntries )
203- if err != nil {
204- return nil , err
205- }
206- panicTestKey := fmt .Sprintf ("%s/%s" , entryLine .Package , panicTest )
207- testDetails [panicTestKey ].Panicked = true
208- testDetails [panicTestKey ].Panics ++
209- testDetails [panicTestKey ].Runs ++
210- testDetails [panicTestKey ].Outputs = append (testDetails [panicTestKey ].Outputs , entryLine .Output )
211- } else if raceDetectionMode {
212- raceTest , err := attributeRaceToTest (entryLine .Package , detectedEntries )
213- if err != nil {
214- return nil , err
215- }
216- raceTestKey := fmt .Sprintf ("%s/%s" , entryLine .Package , raceTest )
217- testDetails [raceTestKey ].Races ++
218- testDetails [raceTestKey ].Runs ++
219- testDetails [raceTestKey ].Outputs = append (testDetails [raceTestKey ].Outputs , entryLine .Output )
220- }
221-
222- detectedEntries = []entry {}
223- panicDetectionMode = false
224- raceDetectionMode = false
225- }
226- continue // Don't process this entry further
200+ continue
227201 } else if startPanicRe .MatchString (entryLine .Output ) { // found a panic, start collecting output
228202 panickedPackages [entryLine .Package ] = struct {}{}
229203 detectedEntries = append (detectedEntries , entryLine )
@@ -244,6 +218,58 @@ func parseTestResults(filePaths []string) ([]reports.TestResult, error) {
244218 }
245219 }
246220
221+ if (panicDetectionMode || raceDetectionMode ) && entryLine .Action == "fail" { // End of panic or race output
222+ if panicDetectionMode {
223+ panicTest , err := attributePanicToTest (entryLine .Package , detectedEntries )
224+ if err != nil {
225+ return nil , err
226+ }
227+ panicTestKey := fmt .Sprintf ("%s/%s" , entryLine .Package , panicTest )
228+ testDetails [panicTestKey ].Panicked = true
229+ testDetails [panicTestKey ].Panics ++
230+ testDetails [panicTestKey ].Runs ++
231+ duration , err := time .ParseDuration (strconv .FormatFloat (entryLine .Elapsed , 'f' , - 1 , 64 ) + "s" )
232+ if err != nil {
233+ return nil , fmt .Errorf ("failed to parse duration: %w" , err )
234+ }
235+ testDetails [panicTestKey ].Durations = append (testDetails [panicTestKey ].Durations , duration )
236+ testDetails [panicTestKey ].Outputs = append (testDetails [panicTestKey ].Outputs , entryLine .Output )
237+ for _ , entry := range detectedEntries {
238+ if entry .Test == "" {
239+ testDetails [panicTestKey ].PackageOutputs = append (testDetails [panicTestKey ].PackageOutputs , entry .Output )
240+ } else {
241+ testDetails [panicTestKey ].Outputs = append (testDetails [panicTestKey ].Outputs , entry .Output )
242+ }
243+ }
244+ } else if raceDetectionMode {
245+ raceTest , err := attributeRaceToTest (entryLine .Package , detectedEntries )
246+ if err != nil {
247+ return nil , err
248+ }
249+ raceTestKey := fmt .Sprintf ("%s/%s" , entryLine .Package , raceTest )
250+ testDetails [raceTestKey ].Races ++
251+ testDetails [raceTestKey ].Runs ++
252+ duration , err := time .ParseDuration (strconv .FormatFloat (entryLine .Elapsed , 'f' , - 1 , 64 ) + "s" )
253+ if err != nil {
254+ return nil , fmt .Errorf ("failed to parse duration: %w" , err )
255+ }
256+ testDetails [raceTestKey ].Durations = append (testDetails [raceTestKey ].Durations , duration )
257+ testDetails [raceTestKey ].Outputs = append (testDetails [raceTestKey ].Outputs , entryLine .Output )
258+ for _ , entry := range detectedEntries {
259+ if entry .Test == "" {
260+ testDetails [raceTestKey ].PackageOutputs = append (testDetails [raceTestKey ].PackageOutputs , entry .Output )
261+ } else {
262+ testDetails [raceTestKey ].Outputs = append (testDetails [raceTestKey ].Outputs , entry .Output )
263+ }
264+ }
265+ }
266+
267+ detectedEntries = []entry {}
268+ panicDetectionMode = false
269+ raceDetectionMode = false
270+ continue
271+ }
272+
247273 switch entryLine .Action {
248274 case "pass" :
249275 if entryLine .Test != "" {
@@ -277,7 +303,7 @@ func parseTestResults(filePaths []string) ([]reports.TestResult, error) {
277303 result .Runs ++
278304 }
279305 }
280- if entryLine .Test != "" {
306+ if entryLine .Test != "" && result . Runs > 0 {
281307 result .PassRatio = float64 (result .Successes ) / float64 (result .Runs )
282308 result .PassRatioPercentage = fmt .Sprintf ("%.0f%%" , result .PassRatio * 100 )
283309 }
@@ -297,13 +323,13 @@ func parseTestResults(filePaths []string) ([]reports.TestResult, error) {
297323
298324 var results []reports.TestResult
299325 for _ , result := range testDetails {
300- results = append (results , * result )
301326 if _ , panicked := panickedPackages [result .TestPackage ]; panicked {
302327 result .PackagePanicked = true
303328 }
304329 if outputs , exists := packageLevelOutputs [result .TestPackage ]; exists {
305330 result .PackageOutputs = outputs
306331 }
332+ results = append (results , * result )
307333 }
308334
309335 return results , nil
0 commit comments