JAL-4167 Added colours to bash output
authorBen Soares <b.soares@dundee.ac.uk>
Wed, 26 Apr 2023 16:39:10 +0000 (17:39 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Wed, 26 Apr 2023 16:39:10 +0000 (17:39 +0100)
build.gradle

index c23ba06..3b06476 100644 (file)
@@ -1769,7 +1769,6 @@ task testTask1(type: Test) {
 import groovy.time.TimeCategory
 import org.gradle.api.tasks.testing.logging.TestExceptionFormat
 import org.gradle.api.tasks.testing.logging.TestLogEvent
-
 rootProject.ext.testsResults = [] // Container for tests summaries
 
 tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}.all { testTask ->
@@ -1803,22 +1802,13 @@ tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}.all { te
 
     if (desc.parent) return // Only summarize results for whole modules
 
-    String summary = "${testTask.project.name}:${testTask.name} results: ${result.resultType} " +
-      "(" +
-      "${result.testCount} tests, " +
-      "${result.successfulTestCount} successes, " +
-      "${result.failedTestCount} failures, " +
-      "${result.skippedTestCount} skipped" +
-      ") " +
-      "in ${TimeCategory.minus(new Date(result.endTime), new Date(result.startTime))}" +
-      "\n" +
-          "Report file: ${testTask.reports.html.entryPoint}"
+    def summary = [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 += summary
+      rootProject.ext.testsResults.add(summary)
     }
 
     if (result.resultType == TestResult.ResultType.FAILURE) {
@@ -1857,19 +1847,72 @@ gradle.buildFinished {
 
     if (!allResults.isEmpty()) {
         printResults allResults
+        allResults.each {r ->
+          if (r[2].resultType == TestResult.ResultType.FAILURE)
+            throw GradleException("Failed tests (buildFinished)!")
+        }
     }
 }
 
 private static void printResults(allResults) {
-    def maxLength = allResults*.readLines().flatten().collect { it.length() }.max()
+    // 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 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 reportLine = "Report file: ${report}"
+      def ls = summaryPlain.length()
+      def lr = reportLine.length()
+      def m = [ls, lr].max()
+      if (m > maxLength)
+        maxLength = m
+      def info = [ls, summaryCol, reportLine]
+      summaryLines.add(info)
+    }
 
     println "┌${"${"─" * maxLength}"}┐"
 
-    println allResults.collect {
-        it.readLines().collect {
-            "│" + it + " " * (maxLength - it.length()) + "│"
-        }.join("\n")
-    }.join("\n├${"${"─" * maxLength}"}┤\n")
+    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 "└${"${"─" * maxLength}"}┘"
 }