From f87f6b83fe704bb2eb73ada71897138a33d75c15 Mon Sep 17 00:00:00 2001 From: Ben Soares Date: Wed, 26 Apr 2023 17:39:10 +0100 Subject: [PATCH] JAL-4167 Added colours to bash output --- build.gradle | 79 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 18 deletions(-) diff --git a/build.gradle b/build.gradle index c23ba06..3b06476 100644 --- a/build.gradle +++ b/build.gradle @@ -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}"}┘" } -- 1.7.10.2