JAL-4167 Added colours to bash output
[jalview.git] / build.gradle
index ac150fa..3b06476 100644 (file)
@@ -1738,6 +1738,8 @@ compileTestJava.dependsOn compileJava
 ext.testsFailed = false
 /* testTask0 is the main test task */
 task testTask0(type: Test) {
+  group = "Verification"
+  description = "The main test task. Runs all non-testTaskN-labelled tests (unless excluded)"
   useTestNG() {
     includeGroups testng_groups.split(",")
     excludeGroups testng_excluded_groups.split(",")
@@ -1749,10 +1751,11 @@ task testTask0(type: Test) {
 
 /* separated tests */
 task testTask1(type: Test) {
+  group = "Verification"
+  description = "Tests that need to be isolated from the main test run"
   useTestNG() {
     includeGroups name
     excludeGroups testng_excluded_groups.split(",")
-    tasks.withType(Test).matching {it.name.startsWith("testTask") && it.name != name}.all {t -> excludeGroups t.name}
     preserveOrder true
     useDefaultListeners=true
   }
@@ -1766,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 ->
@@ -1775,7 +1777,7 @@ tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}.all { te
   if (useClover) {
     dependsOn cloverClasses
   } else { //?
-    dependsOn compileJava //?
+    dependsOn testClasses //?
   }
 
   // run main tests first
@@ -1800,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) {
@@ -1854,25 +1847,80 @@ 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}"}┘"
 }
 /* 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!")
@@ -1883,10 +1931,9 @@ task verifyTestStatus {
 test {
   // from original test task
   if (useClover) {
-    dependsOn.clear()
     dependsOn cloverClasses
   } else { //?
-    dependsOn compileJava //?
+    dependsOn testClasses
   }
   dependsOn tasks.withType(Test).matching {t -> t.getName().startsWith("testTask")}
   finalizedBy verifyTestStatus