JAL-4167 Added OVERALL summary to bash output
authorBen Soares <b.soares@dundee.ac.uk>
Thu, 27 Apr 2023 11:36:15 +0000 (12:36 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Thu, 27 Apr 2023 11:36:15 +0000 (12:36 +0100)
build.gradle

index 3b06476..6d0eedd 100644 (file)
@@ -1735,7 +1735,6 @@ run.dependsOn compileJava
 compileTestJava.dependsOn compileJava
 
 
-ext.testsFailed = false
 /* testTask0 is the main test task */
 task testTask0(type: Test) {
   group = "Verification"
@@ -1802,18 +1801,9 @@ tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}.all { te
 
     if (desc.parent) return // Only summarize results for whole modules
 
-    def summary = [testTask.project.name, testTask.name, result, TimeCategory.minus(new Date(result.endTime), new Date(result.startTime)), testTask.reports.html.entryPoint]
+    def resultsInfo = [testTask.project.name, testTask.name, result, TimeCategory.minus(new Date(result.endTime), new Date(result.startTime)), testTask.reports.html.entryPoint]
 
-    // Add reports in `testsResults`, keep failed suites at the end
-    if (result.resultType == TestResult.ResultType.SUCCESS) {
-      rootProject.ext.testsResults.add(0, summary)
-    } else {
-      rootProject.ext.testsResults.add(summary)
-    }
-
-    if (result.resultType == TestResult.ResultType.FAILURE) {
-      testsFailed = true
-    }
+    rootProject.ext.testsResults.add(resultsInfo)
   }
 
   // from original test task
@@ -1849,49 +1839,67 @@ gradle.buildFinished {
         printResults allResults
         allResults.each {r ->
           if (r[2].resultType == TestResult.ResultType.FAILURE)
-            throw GradleException("Failed tests (buildFinished)!")
+            throw new GradleException("Failed tests!")
         }
     }
 }
 
+private static String colString(styler, col, colour, text) {
+  return col?"${styler[colour](text)}":text
+}
+
+private static String getSummaryLine(s, pn, tn, rt, rc, rs, rf, rsk, t, col) {
+  def colour = 'black'
+  def nocol = false
+  switch(rt) {
+    case TestResult.ResultType.SUCCESS:
+      colour = 'green'
+      break;
+    case TestResult.ResultType.FAILURE:
+      colour = 'red'
+      break;
+    default:
+      nocol = true
+      break;
+  }
+  StringBuilder sb = new StringBuilder()
+  sb.append("${pn}")
+  if (tn != null)
+    sb.append(":${tn}")
+  sb.append(" results: ")
+  sb.append(colString(s, col && !nocol, colour, rt))
+  sb.append(" (")
+  sb.append("${rc} tests, ")
+  sb.append(colString(s, col && rs > 0, 'green', rs))
+  sb.append(" successes, ")
+  sb.append(colString(s, col && rf > 0, 'red', rf))
+  sb.append(" failures, ")
+  sb.append("${rsk} skipped) in ${t}")
+  return sb.toString()
+}
+
 private static void printResults(allResults) {
+
     // styler from https://stackoverflow.com/a/56139852
     def styler = 'black red green yellow blue magenta cyan white'.split().toList().withIndex(30).collectEntries { key, val -> [(key) : { "\033[${val}m${it}\033[0m" }] }
 
     def maxLength = 0
     def failedTests = false
     def summaryLines = []
-    allResults.each {
+    def totalcount = 0
+    def totalsuccess = 0
+    def totalfail = 0
+    def totalskip = 0
+    def totaltime = TimeCategory.getSeconds(0)
+    // sort on project name then task name
+    allResults.sort {a, b -> a[0] == b[0]? a[1]<=>b[1]:a[0] <=> b[0]}.each {
       def projectName = it[0]
       def taskName = it[1]
       def result = it[2]
       def time = it[3]
       def report = it[4]
-      def colour = 'black'
-      switch(result.resultType) {
-        case TestResult.ResultType.SUCCESS:
-          colour = 'green'
-          break;
-        case TestResult.ResultType.FAILURE:
-          colour = 'red'
-          failedTests = true
-          break;
-        default:
-          colour = 'yellow'
-          break;
-      }
-      def summaryCol = "${projectName}:${taskName} results: ${styler[colour](result.resultType)} (" +
-      "${result.testCount} tests, " +
-      (result.successfulTestCount > 0 ? "${styler['green'](result.successfulTestCount)} successes" : "${result.successfulTestCount} successes") + ", " +
-      (result.failedTestCount > 0 ? "${styler['red'](result.failedTestCount)} failures" : "${result.failedTestCount} failures") + ", " +
-      "${result.skippedTestCount} skipped" +
-      ") " + "in ${time}"
-      def summaryPlain = "${projectName}:${taskName} results: ${result.resultType} (" +
-      "${result.testCount} tests, " +
-      "${result.successfulTestCount} successes, " +
-      "${result.failedTestCount} failures, " +
-      "${result.skippedTestCount} skipped" +
-      ") " + "in ${time}"
+      def summaryCol = getSummaryLine(styler, projectName, taskName, result.resultType, result.testCount, result.successfulTestCount, result.failedTestCount, result.skippedTestCount, time, true)
+      def summaryPlain = getSummaryLine(styler, projectName, taskName, result.resultType, result.testCount, result.successfulTestCount, result.failedTestCount, result.skippedTestCount, time, false)
       def reportLine = "Report file: ${report}"
       def ls = summaryPlain.length()
       def lr = reportLine.length()
@@ -1900,34 +1908,41 @@ private static void printResults(allResults) {
         maxLength = m
       def info = [ls, summaryCol, reportLine]
       summaryLines.add(info)
+      failedTests |= result.resultType == TestResult.ResultType.FAILURE
+      totalcount += result.testCount
+      totalsuccess += result.successfulTestCount
+      totalfail += result.failedTestCount
+      totalskip += result.skippedTestCount
+      totaltime += time
+    }
+    def totalSummaryCol = getSummaryLine(styler, "OVERALL", "", failedTests?TestResult.ResultType.FAILURE:TestResult.ResultType.SUCCESS, totalcount, totalsuccess, totalfail, totalskip, totaltime, true)
+    def totalSummaryPlain = getSummaryLine(styler, "OVERALL", "", failedTests?TestResult.ResultType.FAILURE:TestResult.ResultType.SUCCESS, totalcount, totalsuccess, totalfail, totalskip, totaltime, false)
+    def tls = totalSummaryPlain.length()
+    if (tls > maxLength)
+      maxLength = tls
+    def info = [tls, totalSummaryCol, null]
+    summaryLines.add(info)
+
+    def allSummaries = []
+    for(sInfo : summaryLines) {
+      def ls = sInfo[0]
+      def summary = sInfo[1]
+      def report = sInfo[2]
+
+      StringBuilder sb = new StringBuilder()
+      sb.append("│" + summary + " " * (maxLength - ls) + "│")
+      if (report != null) {
+        sb.append("\n│" + report + " " * (maxLength - report.length()) + "│")
+      }
+      allSummaries += sb.toString()
     }
 
     println "┌${"${"─" * maxLength}"}┐"
-
-    println summaryLines.collect {info ->
-      def ls = info[0]
-      def summary = info[1]
-      def report = info[2]
-
-      return "│" + summary + " " * (maxLength - ls) + "│" + "\n" +
-      "│" + report + " " * (maxLength - report.length()) + "│"
-
-      }.join("\n├${"${"─" * maxLength}"}┤\n")
-
+    println allSummaries.join("\n├${"${"─" * maxLength}"}┤\n")
     println "└${"${"─" * maxLength}"}┘"
 }
 /* END of test tasks results summary */
 
-task verifyTestStatus {
-  group = "Verification"
-  description = "Task that FAILs the build if any tests failed"
-  doLast {
-    if (testsFailed) {
-      throw new GradleException("There were failing tests!")
-    }
-  }
-}
-
 test {
   // from original test task
   if (useClover) {
@@ -1936,8 +1951,6 @@ test {
     dependsOn testClasses
   }
   dependsOn tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}
-  finalizedBy verifyTestStatus
-
 
   // not running tests in this task
   exclude "**/*"