Regres: Include an example test for each of top N failures

Bug: b/129056755
Change-Id: I01518b3cb802c45f2b3cc14e6e2c2f81416b4cd4
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/27782
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/tests/regres/main.go b/tests/regres/main.go
index ce3361c..310b354 100644
--- a/tests/regres/main.go
+++ b/tests/regres/main.go
@@ -190,7 +190,7 @@
 	}
 
 	changes := map[string]*changeInfo{} // Change ID -> changeInfo
-	lastUpdatedTestLists := toDate(time.Now())
+	lastUpdatedTestLists := date{}      // toDate(time.Now())
 	lastQueriedChanges := time.Time{}
 
 	for {
@@ -483,18 +483,20 @@
 		if len(lines) == 1 {
 			line := lines[0]
 			if line != "" {
-				sb.WriteString(fmt.Sprintf("  %d occurrences: %v: %v\n", f.count, f.status, line))
+				sb.WriteString(fmt.Sprintf(" • %d occurrences: %v: %v\n", f.count, f.status, line))
 			} else {
-				sb.WriteString(fmt.Sprintf("  %d occurrences: %v\n", f.count, f.status))
+				sb.WriteString(fmt.Sprintf(" • %d occurrences: %v\n", f.count, f.status))
 			}
 		} else {
-			sb.WriteString(fmt.Sprintf("  %d occurrences: %v:\n", f.count, f.status))
+			sb.WriteString(fmt.Sprintf(" • %d occurrences: %v:\n", f.count, f.status))
 			for _, l := range lines {
 				sb.WriteString("    > ")
 				sb.WriteString(l)
 				sb.WriteString("\n")
 			}
 		}
+		sb.WriteString(fmt.Sprintf("    Example test: %v\n", f.exampleTest))
+
 	}
 	msg := sb.String()
 
@@ -907,20 +909,27 @@
 type commonFailure struct {
 	count int
 	testStatusAndError
+	exampleTest string
 }
 
 func (r *CommitTestResults) commonFailures() []commonFailure {
 	failures := map[testStatusAndError]int{}
-	for _, test := range r.Tests {
+	examples := map[testStatusAndError]string{}
+	for name, test := range r.Tests {
 		if !test.Status.Failing() {
 			continue
 		}
 		key := testStatusAndError{test.Status, test.Err}
-		failures[key] = failures[key] + 1
+		if count, ok := failures[key]; ok {
+			failures[key] = count + 1
+		} else {
+			failures[key] = 1
+			examples[key] = name
+		}
 	}
 	out := make([]commonFailure, 0, len(failures))
 	for failure, count := range failures {
-		out = append(out, commonFailure{count, failure})
+		out = append(out, commonFailure{count, failure, examples[failure]})
 	}
 	sort.Slice(out, func(i, j int) bool { return out[i].count > out[j].count })
 	return out