From e1415b99e50726d81e268caf1e4755d90b5cd558 Mon Sep 17 00:00:00 2001 From: Fabricio Yamamoto Date: Sat, 29 Aug 2020 00:50:01 -0300 Subject: [PATCH 01/14] add separators based on class heritage count --- .../surefire/report/ConsoleTreeReporter.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java index bde8dd1..a8e154a 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java @@ -24,6 +24,7 @@ import org.apache.maven.surefire.shared.utils.logging.MessageBuilder; import java.util.List; +import java.util.stream.LongStream; import static org.apache.maven.plugin.surefire.report.TestSetStats.concatenateWithTestGroup; import static org.apache.maven.surefire.shared.utils.StringUtils.isBlank; @@ -47,10 +48,13 @@ public ConsoleTreeReporter(ConsoleLogger logger, @Override public void testSetStarting( TestSetReportEntry report ) { - getConsoleLogger() - .info( "|" ); + StringBuilder stringBuilder = new StringBuilder(); + LongStream.rangeClosed( 0, getTreeLenght(report) - 1 ).forEach( i -> stringBuilder.append( "| " )); + getConsoleLogger().info( stringBuilder.toString() ); - MessageBuilder builder = buffer().a( TEST_SET_STARTING_PREFIX ); + MessageBuilder builder = buffer(); + LongStream.rangeClosed( 0, getTreeLenght(report) - 1 ).forEach( i -> builder.a( "| " )); + builder.a( TEST_SET_STARTING_PREFIX ); String runningTestCase = concatenateWithTestGroup( builder, report, !isBlank( report.getReportNameWithGroup() ) ); @@ -65,7 +69,10 @@ public void testSetCompleted( WrappedReportEntry report, TestSetStats testSetSta for ( WrappedReportEntry testResult : testSetStats.getReportEntries() ) { - final MessageBuilder builder = buffer().a( "| " + TEST_SET_STARTING_PREFIX ); + final MessageBuilder builder = buffer().a( "| " ); + LongStream.rangeClosed( 0, getTreeLenght(testResult) - 1 ) + .forEach( i -> builder.a( "| " )); + builder.a( TEST_SET_STARTING_PREFIX ); if ( testResult.isErrorOrFailure() ) { println( builder.failure( "[XX] " + testResult.getReportName() ) @@ -102,8 +109,15 @@ else if ( testResult.isSucceeded() ) } + private long getTreeLenght(TestSetReportEntry entry) { + return entry.getSourceName() + .chars() + .filter( c -> c == 36 ) + .count(); + } + private void println(String message) { - this.getConsoleLogger().info(message); + this.getConsoleLogger().info( message ); } } From bac01df4ebd4f3dbc2627882c4b552235acf7f7d Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Sun, 26 Jun 2022 22:50:33 +0200 Subject: [PATCH 02/14] ansi style (needs to rollback later) --- pom.xml | 12 ++ .../surefire/report/ConsoleTreeReporter.java | 145 ++++++++++-------- src/test/java/NestedExampleTest.java | 5 + .../report/ConsoleTreeReporterTest.java | 73 +++++++++ 4 files changed, 174 insertions(+), 61 deletions(-) create mode 100644 src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java diff --git a/pom.xml b/pom.xml index 80c5de7..7d788ee 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,18 @@ ${maven.surefire.version} compile + + org.mockito + mockito-core + 4.6.1 + test + + + org.mockito + mockito-junit-jupiter + 4.6.1 + test + diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java index a8e154a..d702f00 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java @@ -23,9 +23,11 @@ import org.apache.maven.surefire.api.report.TestSetReportEntry; import org.apache.maven.surefire.shared.utils.logging.MessageBuilder; -import java.util.List; +import java.util.*; import java.util.stream.LongStream; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; import static org.apache.maven.plugin.surefire.report.TestSetStats.concatenateWithTestGroup; import static org.apache.maven.surefire.shared.utils.StringUtils.isBlank; import static org.apache.maven.surefire.shared.utils.logging.MessageUtils.buffer; @@ -35,89 +37,110 @@ * * @author Fabrício Yamamoto */ -public class ConsoleTreeReporter extends ConsoleReporter -{ - private static final String TEST_SET_STARTING_PREFIX = "+-- "; +public class ConsoleTreeReporter extends ConsoleReporter { + private static final int $ = 36; + public static final String PREFIX_MIDDLE = "├─ "; + public static final String PREFIX_END = "└─ "; + public static final String PREFIX_PIPE = "| "; + public static final String SPACE = " "; + private final Map testBuffer = new Hashtable<>(); public ConsoleTreeReporter(ConsoleLogger logger, - boolean usePhrasedClassNameInRunning, boolean usePhrasedClassNameInTestCaseSummary ) - { - super( logger, usePhrasedClassNameInRunning, usePhrasedClassNameInTestCaseSummary ); + boolean usePhrasedClassNameInRunning, boolean usePhrasedClassNameInTestCaseSummary) { + super(logger, usePhrasedClassNameInRunning, usePhrasedClassNameInTestCaseSummary); } @Override - public void testSetStarting( TestSetReportEntry report ) - { - StringBuilder stringBuilder = new StringBuilder(); - LongStream.rangeClosed( 0, getTreeLenght(report) - 1 ).forEach( i -> stringBuilder.append( "| " )); - getConsoleLogger().info( stringBuilder.toString() ); - - MessageBuilder builder = buffer(); - LongStream.rangeClosed( 0, getTreeLenght(report) - 1 ).forEach( i -> builder.a( "| " )); - builder.a( TEST_SET_STARTING_PREFIX ); - - String runningTestCase = - concatenateWithTestGroup( builder, report, !isBlank( report.getReportNameWithGroup() ) ); - - getConsoleLogger() - .info( runningTestCase ); + public void testSetStarting(TestSetReportEntry report) { + testBuffer.put(report.getSourceName(), report); } @Override - public void testSetCompleted( WrappedReportEntry report, TestSetStats testSetStats, List testResults ) - { - - for ( WrappedReportEntry testResult : testSetStats.getReportEntries() ) - { - final MessageBuilder builder = buffer().a( "| " ); - LongStream.rangeClosed( 0, getTreeLenght(testResult) - 1 ) - .forEach( i -> builder.a( "| " )); - builder.a( TEST_SET_STARTING_PREFIX ); - if ( testResult.isErrorOrFailure() ) - { - println( builder.failure( "[XX] " + testResult.getReportName() ) - .a( " - " + testResult.elapsedTimeAsString() + "s" ) - .toString()); - } - else if ( testResult.isSkipped() ) - { - if ( !isBlank( testResult.getReportName() ) ) - { - builder.warning( "[??] " + testResult.getReportName() ); - } - else - { - builder.warning( "[??] " + testResult.getReportSourceName() ); + public void testSetCompleted(WrappedReportEntry report, TestSetStats testSetStats, List testResults) { + + List sourceNames = testSetStats.getReportEntries() + .stream() + .map(WrappedReportEntry::getSourceName) + .collect(toList()); + + for (WrappedReportEntry testResult : testSetStats.getReportEntries()) { + + MessageBuilder builder = createMessageBuilderWithPrefix(testResult, sourceNames); + + if (testResult.isErrorOrFailure()) { + println(builder.failure("[XX] " + testResult.getReportName()) + .a(" - " + testResult.elapsedTimeAsString() + "s") + .toString()); + } else if (testResult.isSkipped()) { + if (!isBlank(testResult.getReportName())) { + builder.warning("[??] " + testResult.getReportName()); + } else { + builder.warning("[??] " + testResult.getReportSourceName()); } - if ( !isBlank( testResult.getMessage() ) ) - { - builder.warning( " (" + testResult.getMessage() + ")" ); + if (!isBlank(testResult.getMessage())) { + builder.warning(" (" + testResult.getMessage() + ")"); } - println( builder - .a( " - " + testResult.elapsedTimeAsString() + "s" ) - .toString()); - } - else if ( testResult.isSucceeded() ) - { - println( builder.success( "[OK] " + testResult.getReportName() ) - .a( " - " + testResult.elapsedTimeAsString() + "s" ) - .toString()); + println(builder + .a(" - " + testResult.elapsedTimeAsString() + "s") + .toString()); + + } else if (testResult.isSucceeded()) { + println(builder.success("[OK] " + testResult.getReportName()) + .a(" - " + testResult.elapsedTimeAsString() + "s") + .toString()); } } } - private long getTreeLenght(TestSetReportEntry entry) { + private MessageBuilder createMessageBuilderWithPrefix(WrappedReportEntry testResult, List sourceNames) { + + if(testBuffer.containsKey(testResult.getSourceName())) { + printClassPrefix(testResult); + testBuffer.remove(testResult.getSourceName()); + } + + MessageBuilder builder = buffer().a(PREFIX_PIPE); + LongStream.rangeClosed(0, getTreeLength(testResult) - 1) + .forEach(i -> builder.a(SPACE)); + + sourceNames.remove(testResult.getSourceName()); + if (sourceNames.contains(testResult.getSourceName())) { + builder.a(PREFIX_MIDDLE); + } else { + builder.a(PREFIX_END); + } + return builder; + } + + private void printClassPrefix(WrappedReportEntry testResult) { + MessageBuilder builder = buffer(); + + if (getTreeLength(testResult) > 0) { + builder.a(PREFIX_MIDDLE); + LongStream.rangeClosed(0, getTreeLength(testResult) - 2) + .forEach(i -> builder.a(SPACE)); + builder.a(PREFIX_END); + } else { + builder.a(PREFIX_MIDDLE); + } + String runningTestCase = + concatenateWithTestGroup(builder, testResult, !isBlank(testResult.getReportNameWithGroup())); + getConsoleLogger() + .info(runningTestCase); + } + + private long getTreeLength(TestSetReportEntry entry) { return entry.getSourceName() .chars() - .filter( c -> c == 36 ) + .filter(c -> c == $) .count(); } private void println(String message) { - this.getConsoleLogger().info( message ); + this.getConsoleLogger().info(message); } } diff --git a/src/test/java/NestedExampleTest.java b/src/test/java/NestedExampleTest.java index 636d4a5..77fbd04 100644 --- a/src/test/java/NestedExampleTest.java +++ b/src/test/java/NestedExampleTest.java @@ -43,4 +43,9 @@ void test() { } + @Test + @DisplayName("Should pass2") + void test2() { + } + } diff --git a/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java b/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java new file mode 100644 index 0000000..5db1c81 --- /dev/null +++ b/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java @@ -0,0 +1,73 @@ +package org.apache.maven.plugin.surefire.report; + +import org.apache.maven.plugin.surefire.log.PluginConsoleLogger; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; +import org.apache.maven.surefire.api.report.RunMode; +import org.apache.maven.surefire.api.report.SimpleReportEntry; +import org.codehaus.plexus.DefaultPlexusContainer; +import org.codehaus.plexus.PlexusContainerException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.mockito.Mockito.mock; + +@ExtendWith(MockitoExtension.class) +class ConsoleTreeReporterTest { + + //Test for NestedExampleTest + + Utf8RecodingDeferredFileOutputStream stdout = new Utf8RecodingDeferredFileOutputStream("stdout"); + Utf8RecodingDeferredFileOutputStream stderr = new Utf8RecodingDeferredFileOutputStream("stderr"); + + @Test + void testSetStarting() { + //Runs 4 times for this class + SimpleReportEntry simpleReportEntry1 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest", "Nested Sample", null, null); + SimpleReportEntry simpleReportEntry2 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest", "Inner Test", null, null); + SimpleReportEntry simpleReportEntry3 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest", "Inner Inner Test", null, null); + SimpleReportEntry simpleReportEntry4 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest$InnerInnerInnerTest", "Inner Inner Inner Test", null, null); + } + + @Test + void testSetCompleted() throws PlexusContainerException { + + //TestStarting parameters + SimpleReportEntry simpleReportEntry1 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest", "Nested Sample", null, null); + SimpleReportEntry simpleReportEntry2 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest", "Inner Test", null, null); + SimpleReportEntry simpleReportEntry3 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest", "Inner Inner Test", null, null); + SimpleReportEntry simpleReportEntry4 = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest$InnerInnerInnerTest", "Inner Inner Inner Test", null, null); + + //Runs 1 time with all the information + //Gets all SingleReportEntries with test names and add on a list of WrapperReportEntries to create a TestSetStats + SimpleReportEntry firstTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest", "Nested Sample", "test", "Should pass"); + SimpleReportEntry secondTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest", "Nested Sample", "test2", "Should pass2"); + SimpleReportEntry thirdTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest", "Inner Test", "test", "Inner test should pass"); + SimpleReportEntry fourthTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest", "Inner Inner Test", "test", "Inner Inner Test should pass"); + SimpleReportEntry fifthTest = new SimpleReportEntry(RunMode.NORMAL_RUN, 123L, "NestedExampleTest$InnerTest$InnerInnerTest$InnerInnerInnerTest", "Inner Inner Inner Test", "test", "Inner Inner Inner Test should pass"); + + WrappedReportEntry wrappedReportEntry1 = new WrappedReportEntry(firstTest, ReportEntryType.SUCCESS, 1, stdout, stderr); + WrappedReportEntry wrappedReportEntry2 = new WrappedReportEntry(secondTest, ReportEntryType.SUCCESS, 1, stdout, stderr); + WrappedReportEntry wrappedReportEntry3 = new WrappedReportEntry(thirdTest, ReportEntryType.SUCCESS, 1, stdout, stderr); + WrappedReportEntry wrappedReportEntry4 = new WrappedReportEntry(fourthTest, ReportEntryType.SUCCESS, 1, stdout, stderr); + WrappedReportEntry wrappedReportEntry5 = new WrappedReportEntry(fifthTest, ReportEntryType.SUCCESS, 1, stdout, stderr); + + TestSetStats testSetStats = new TestSetStats(false, true); + testSetStats.testSucceeded(wrappedReportEntry1); + testSetStats.testSucceeded(wrappedReportEntry2); + testSetStats.testSucceeded(wrappedReportEntry3); + testSetStats.testSucceeded(wrappedReportEntry4); + testSetStats.testSucceeded(wrappedReportEntry5); + + DefaultPlexusContainer container = new DefaultPlexusContainer(); + container.getLogger(); + + ConsoleTreeReporter consoleTreeReporter = new ConsoleTreeReporter(new PluginConsoleLogger(container.getLogger()), false, false); + consoleTreeReporter.testSetStarting(simpleReportEntry1); + consoleTreeReporter.testSetStarting(simpleReportEntry2); + consoleTreeReporter.testSetStarting(simpleReportEntry3); + consoleTreeReporter.testSetStarting(simpleReportEntry4); + consoleTreeReporter.testSetCompleted(null, testSetStats, null); + } + +} \ No newline at end of file From 9b9c5a39f61c6b1debbab407a1e936dbc2736fa9 Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Sun, 26 Jun 2022 23:56:39 +0200 Subject: [PATCH 03/14] fix tree reporter for nested classes --- .../surefire/report/ConsoleTreeReporter.java | 46 +++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java index d702f00..9940d94 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java @@ -27,7 +27,6 @@ import java.util.stream.LongStream; import static java.util.stream.Collectors.toList; -import static java.util.stream.Collectors.toMap; import static org.apache.maven.plugin.surefire.report.TestSetStats.concatenateWithTestGroup; import static org.apache.maven.surefire.shared.utils.StringUtils.isBlank; import static org.apache.maven.surefire.shared.utils.logging.MessageUtils.buffer; @@ -39,11 +38,13 @@ */ public class ConsoleTreeReporter extends ConsoleReporter { private static final int $ = 36; - public static final String PREFIX_MIDDLE = "├─ "; + public static final String PREFIX_MID = "├─ "; public static final String PREFIX_END = "└─ "; public static final String PREFIX_PIPE = "| "; + public static final String PREFIX_DOWN = "┬─ "; + public static final String PREFIX_DASH = "── "; public static final String SPACE = " "; - private final Map testBuffer = new Hashtable<>(); + private final Map testBuffer = new HashMap<>(); public ConsoleTreeReporter(ConsoleLogger logger, boolean usePhrasedClassNameInRunning, boolean usePhrasedClassNameInTestCaseSummary) { @@ -98,33 +99,52 @@ public void testSetCompleted(WrappedReportEntry report, TestSetStats testSetStat private MessageBuilder createMessageBuilderWithPrefix(WrappedReportEntry testResult, List sourceNames) { if(testBuffer.containsKey(testResult.getSourceName())) { - printClassPrefix(testResult); + printClassPrefix(testResult, sourceNames); testBuffer.remove(testResult.getSourceName()); } MessageBuilder builder = buffer().a(PREFIX_PIPE); - LongStream.rangeClosed(0, getTreeLength(testResult) - 1) - .forEach(i -> builder.a(SPACE)); + + if (getTreeLength(testResult) > 0) { + LongStream.rangeClosed(0, getTreeLength(testResult) - 2) + .forEach(i -> builder.a(SPACE)); + if (sourceNames.stream().distinct().count() > 1) { + builder.a(PREFIX_PIPE); + } else { + builder.a(SPACE); + } + } sourceNames.remove(testResult.getSourceName()); if (sourceNames.contains(testResult.getSourceName())) { - builder.a(PREFIX_MIDDLE); + builder.a(PREFIX_MID); } else { builder.a(PREFIX_END); } return builder; } - private void printClassPrefix(WrappedReportEntry testResult) { + private void printClassPrefix(WrappedReportEntry testResult, List sourceNames) { MessageBuilder builder = buffer(); if (getTreeLength(testResult) > 0) { - builder.a(PREFIX_MIDDLE); - LongStream.rangeClosed(0, getTreeLength(testResult) - 2) - .forEach(i -> builder.a(SPACE)); - builder.a(PREFIX_END); + + if (getTreeLength(testResult) > 1) { + builder.a(PREFIX_PIPE); + LongStream.rangeClosed(0, getTreeLength(testResult) - 3) + .forEach(i -> builder.a(SPACE)); + builder.a(PREFIX_END); + } else { + builder.a(PREFIX_MID); + } + + if (sourceNames.stream().distinct().count() > 1) { + builder.a(PREFIX_DOWN); + } else { + builder.a(PREFIX_DASH); + } } else { - builder.a(PREFIX_MIDDLE); + builder.a(PREFIX_MID); } String runningTestCase = concatenateWithTestGroup(builder, testResult, !isBlank(testResult.getReportNameWithGroup())); From 4a852ac7cbcd288deaf766f9304a0aa5ef7ad19b Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 01:07:53 +0200 Subject: [PATCH 04/14] add themes --- .../surefire/report/ConsoleTreeReporter.java | 109 ++++++++--------- .../maven/plugin/surefire/report/Tokens.java | 113 ++++++++++++++++++ 2 files changed, 168 insertions(+), 54 deletions(-) create mode 100644 src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java index 9940d94..a176888 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java @@ -37,13 +37,10 @@ * @author Fabrício Yamamoto */ public class ConsoleTreeReporter extends ConsoleReporter { + private static final int $ = 36; - public static final String PREFIX_MID = "├─ "; - public static final String PREFIX_END = "└─ "; - public static final String PREFIX_PIPE = "| "; - public static final String PREFIX_DOWN = "┬─ "; - public static final String PREFIX_DASH = "── "; - public static final String SPACE = " "; + private static final Tokens tokens = Tokens.ASCII; + private final Map testBuffer = new HashMap<>(); public ConsoleTreeReporter(ConsoleLogger logger, @@ -58,98 +55,102 @@ public void testSetStarting(TestSetReportEntry report) { @Override public void testSetCompleted(WrappedReportEntry report, TestSetStats testSetStats, List testResults) { - - List sourceNames = testSetStats.getReportEntries() - .stream() - .map(WrappedReportEntry::getSourceName) - .collect(toList()); - + List sourceNames = getSourceNames(testSetStats); for (WrappedReportEntry testResult : testSetStats.getReportEntries()) { - MessageBuilder builder = createMessageBuilderWithPrefix(testResult, sourceNames); - if (testResult.isErrorOrFailure()) { - println(builder.failure("[XX] " + testResult.getReportName()) - .a(" - " + testResult.elapsedTimeAsString() + "s") - .toString()); + printFailure(testResult, builder); } else if (testResult.isSkipped()) { - if (!isBlank(testResult.getReportName())) { - builder.warning("[??] " + testResult.getReportName()); - } else { - builder.warning("[??] " + testResult.getReportSourceName()); - } + printSkipped(testResult, builder); + } else if (testResult.isSucceeded()) { + printSuccess(testResult, builder); + } + } + } - if (!isBlank(testResult.getMessage())) { - builder.warning(" (" + testResult.getMessage() + ")"); - } + private List getSourceNames(TestSetStats testSetStats) { + return testSetStats.getReportEntries() + .stream() + .map(WrappedReportEntry::getSourceName) + .collect(toList()); + } - println(builder - .a(" - " + testResult.elapsedTimeAsString() + "s") - .toString()); + private void printSuccess(WrappedReportEntry testResult, MessageBuilder builder) { + println(builder.success(tokens.successful() + testResult.getReportName()) + .a(" - " + testResult.elapsedTimeAsString() + "s") + .toString()); + } - } else if (testResult.isSucceeded()) { - println(builder.success("[OK] " + testResult.getReportName()) - .a(" - " + testResult.elapsedTimeAsString() + "s") - .toString()); - } + private void printSkipped(WrappedReportEntry testResult, MessageBuilder builder) { + if (!isBlank(testResult.getReportName())) { + builder.warning(tokens.skipped() + testResult.getReportName()); + } else { + builder.warning(tokens.skipped() + testResult.getReportSourceName()); } + if (!isBlank(testResult.getMessage())) { + builder.warning(" (" + testResult.getMessage() + ")"); + } + println(builder + .a(" - " + testResult.elapsedTimeAsString() + "s") + .toString()); + } + private void printFailure(WrappedReportEntry testResult, MessageBuilder builder) { + println(builder.failure(tokens.failed() + testResult.getReportName()) + .a(" - " + testResult.elapsedTimeAsString() + "s") + .toString()); } private MessageBuilder createMessageBuilderWithPrefix(WrappedReportEntry testResult, List sourceNames) { - if(testBuffer.containsKey(testResult.getSourceName())) { printClassPrefix(testResult, sourceNames); testBuffer.remove(testResult.getSourceName()); } + return printTestPrefix(testResult, sourceNames); + } - MessageBuilder builder = buffer().a(PREFIX_PIPE); - + private MessageBuilder printTestPrefix(WrappedReportEntry testResult, List sourceNames) { + MessageBuilder builder = buffer().a(tokens.pipe()); if (getTreeLength(testResult) > 0) { LongStream.rangeClosed(0, getTreeLength(testResult) - 2) - .forEach(i -> builder.a(SPACE)); + .forEach(i -> builder.a(tokens.blank())); if (sourceNames.stream().distinct().count() > 1) { - builder.a(PREFIX_PIPE); + builder.a(tokens.pipe()); } else { - builder.a(SPACE); + builder.a(tokens.blank()); } } - sourceNames.remove(testResult.getSourceName()); if (sourceNames.contains(testResult.getSourceName())) { - builder.a(PREFIX_MID); + builder.a(tokens.entry()); } else { - builder.a(PREFIX_END); + builder.a(tokens.end()); } return builder; } private void printClassPrefix(WrappedReportEntry testResult, List sourceNames) { MessageBuilder builder = buffer(); - if (getTreeLength(testResult) > 0) { - if (getTreeLength(testResult) > 1) { - builder.a(PREFIX_PIPE); + builder.a(tokens.pipe()); LongStream.rangeClosed(0, getTreeLength(testResult) - 3) - .forEach(i -> builder.a(SPACE)); - builder.a(PREFIX_END); + .forEach(i -> builder.a(tokens.blank())); + builder.a(tokens.end()); } else { - builder.a(PREFIX_MID); + builder.a(tokens.entry()); } - if (sourceNames.stream().distinct().count() > 1) { - builder.a(PREFIX_DOWN); + builder.a(tokens.down()); } else { - builder.a(PREFIX_DASH); + builder.a(tokens.dash()); } } else { - builder.a(PREFIX_MID); + builder.a(tokens.entry()); } String runningTestCase = concatenateWithTestGroup(builder, testResult, !isBlank(testResult.getReportNameWithGroup())); - getConsoleLogger() - .info(runningTestCase); + println(runningTestCase); } private long getTreeLength(TestSetReportEntry entry) { diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java b/src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java new file mode 100644 index 0000000..fbb6d21 --- /dev/null +++ b/src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java @@ -0,0 +1,113 @@ +package org.apache.maven.plugin.surefire.report; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +//Thanks to https://github.com/junit-team/junit5/blob/main/junit-platform-console/src/main/java/org/junit/platform/console/options/Theme.java + +public enum Tokens { + + /** + * ASCII 7-bit characters form the tree branch. + * + *

Example test plan execution tree: + *

+     * [INFO] +--Nested Sample
+     * [INFO] |  +-- [OK] Should pass - 0.03s
+     * [INFO] |  '-- [OK] Should pass2 - 0.002s
+     * [INFO] +--,--Inner Test
+     * [INFO] |  |  '-- [OK] Inner test should pass - 0.001s
+     * [INFO] |  '--,--Inner Inner Test
+     * [INFO] |     |  '-- [OK] Inner Inner Test should pass - 0.002s
+     * [INFO] |     '-----Inner Inner Inner Test
+     * [INFO] |           '-- [OK] Inner Inner Inner Test should pass - 0.002s
+     * [INFO] +--My main test class
+     * [INFO] |  +-- [OK] Should pass - 0.001s
+     * [INFO] |  +-- [OK] Should pass again - 0.001s
+     * [INFO] |  +-- [OK] Should pass for the 3rd time - 0.001s
+     * [INFO] |  '-- [OK] Should pass for the 4th time - 0s
+     * 
+ */ + ASCII("| ", "+--", "'--", ",--", "---", " [OK] ", " [XX] ", " [??] "), + + /** + * Unicode (extended ASCII) characters are used to display the test execution tree. + * + *

Example test plan execution tree: + *

+     * [INFO] ├─ Nested Sample
+     * [INFO] │  ├─ ✔ Should pass - 0.013s
+     * [INFO] │  └─ ✔ Should pass2 - 0.001s
+     * [INFO] ├─ ┬─ Inner Test
+     * [INFO] │  │  └─ ✔ Inner test should pass - 0.001s
+     * [INFO] │  └─ ┬─ Inner Inner Test
+     * [INFO] │     │  └─ ✔ Inner Inner Test should pass - 0.001s
+     * [INFO] │     └─ ── Inner Inner Inner Test
+     * [INFO] │           └─ ✔ Inner Inner Inner Test should pass - 0s
+     * [INFO] ├─ My main test class
+     * [INFO] │  ├─ ✔ Should pass - 0.001s
+     * [INFO] │  ├─ ✔ Should pass again - 0.001s
+     * [INFO] │  ├─ ✔ Should pass for the 3rd time - 0s
+     * [INFO] │  └─ ✔ Should pass for the 4th time - 0s
+     * 
+ */ + UNICODE("│ ", "├─ ", "└─ ", "┬─ ", "── ", "✔ ", "✘ ", "↷ "); + + public static Tokens valueOf(Charset charset) { + if (StandardCharsets.UTF_8.equals(charset)) { + return UNICODE; + } + return ASCII; + } + + private final String[] tiles; + + Tokens(String... tiles) { + this.tiles = tiles; + } + + public final String blank() { + return " "; + } + + public final String pipe() { + return tiles[0]; + } + + public final String entry() { + return tiles[1]; + } + + public final String end() { + return tiles[2]; + } + + public final String down() { + return tiles[3]; + } + + public final String dash() { + return tiles[4]; + } + + public final String successful() { + return tiles[5]; + } + + public final String failed() { + return tiles[6]; + } + + public final String skipped() { + return tiles[7]; + } + + /** + * Return lower case {@link #name()} for easier usage in help text for + * available options. + */ + @Override + public final String toString() { + return name().toLowerCase(); + } +} From 8992f47b878bb8df3408d8a79f4249fe41f7d462 Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 02:23:33 +0200 Subject: [PATCH 05/14] add TreePrinter --- .../surefire/report/ConsoleTreeReporter.java | 111 +-------------- .../maven/plugin/surefire/report/Tokens.java | 2 +- .../plugin/surefire/report/TreePrinter.java | 129 ++++++++++++++++++ 3 files changed, 136 insertions(+), 106 deletions(-) create mode 100644 src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java index a176888..eb91ece 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java @@ -21,15 +21,10 @@ import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.report.TestSetReportEntry; -import org.apache.maven.surefire.shared.utils.logging.MessageBuilder; import java.util.*; -import java.util.stream.LongStream; import static java.util.stream.Collectors.toList; -import static org.apache.maven.plugin.surefire.report.TestSetStats.concatenateWithTestGroup; -import static org.apache.maven.surefire.shared.utils.StringUtils.isBlank; -import static org.apache.maven.surefire.shared.utils.logging.MessageUtils.buffer; /** * Tree view class for console reporters. @@ -38,9 +33,6 @@ */ public class ConsoleTreeReporter extends ConsoleReporter { - private static final int $ = 36; - private static final Tokens tokens = Tokens.ASCII; - private final Map testBuffer = new HashMap<>(); public ConsoleTreeReporter(ConsoleLogger logger, @@ -55,17 +47,15 @@ public void testSetStarting(TestSetReportEntry report) { @Override public void testSetCompleted(WrappedReportEntry report, TestSetStats testSetStats, List testResults) { - List sourceNames = getSourceNames(testSetStats); + TreePrinter treePrinter = new TreePrinter(getConsoleLogger(), getSourceNames(testSetStats)); for (WrappedReportEntry testResult : testSetStats.getReportEntries()) { - MessageBuilder builder = createMessageBuilderWithPrefix(testResult, sourceNames); - if (testResult.isErrorOrFailure()) { - printFailure(testResult, builder); - } else if (testResult.isSkipped()) { - printSkipped(testResult, builder); - } else if (testResult.isSucceeded()) { - printSuccess(testResult, builder); + if(testBuffer.containsKey(testResult.getSourceName())) { + treePrinter.printClass(testResult); + testBuffer.remove(testResult.getSourceName()); } + treePrinter.printTest(testResult); } + testBuffer.clear(); } private List getSourceNames(TestSetStats testSetStats) { @@ -75,93 +65,4 @@ private List getSourceNames(TestSetStats testSetStats) { .collect(toList()); } - private void printSuccess(WrappedReportEntry testResult, MessageBuilder builder) { - println(builder.success(tokens.successful() + testResult.getReportName()) - .a(" - " + testResult.elapsedTimeAsString() + "s") - .toString()); - } - - private void printSkipped(WrappedReportEntry testResult, MessageBuilder builder) { - if (!isBlank(testResult.getReportName())) { - builder.warning(tokens.skipped() + testResult.getReportName()); - } else { - builder.warning(tokens.skipped() + testResult.getReportSourceName()); - } - if (!isBlank(testResult.getMessage())) { - builder.warning(" (" + testResult.getMessage() + ")"); - } - println(builder - .a(" - " + testResult.elapsedTimeAsString() + "s") - .toString()); - } - - private void printFailure(WrappedReportEntry testResult, MessageBuilder builder) { - println(builder.failure(tokens.failed() + testResult.getReportName()) - .a(" - " + testResult.elapsedTimeAsString() + "s") - .toString()); - } - - private MessageBuilder createMessageBuilderWithPrefix(WrappedReportEntry testResult, List sourceNames) { - if(testBuffer.containsKey(testResult.getSourceName())) { - printClassPrefix(testResult, sourceNames); - testBuffer.remove(testResult.getSourceName()); - } - return printTestPrefix(testResult, sourceNames); - } - - private MessageBuilder printTestPrefix(WrappedReportEntry testResult, List sourceNames) { - MessageBuilder builder = buffer().a(tokens.pipe()); - if (getTreeLength(testResult) > 0) { - LongStream.rangeClosed(0, getTreeLength(testResult) - 2) - .forEach(i -> builder.a(tokens.blank())); - if (sourceNames.stream().distinct().count() > 1) { - builder.a(tokens.pipe()); - } else { - builder.a(tokens.blank()); - } - } - sourceNames.remove(testResult.getSourceName()); - if (sourceNames.contains(testResult.getSourceName())) { - builder.a(tokens.entry()); - } else { - builder.a(tokens.end()); - } - return builder; - } - - private void printClassPrefix(WrappedReportEntry testResult, List sourceNames) { - MessageBuilder builder = buffer(); - if (getTreeLength(testResult) > 0) { - if (getTreeLength(testResult) > 1) { - builder.a(tokens.pipe()); - LongStream.rangeClosed(0, getTreeLength(testResult) - 3) - .forEach(i -> builder.a(tokens.blank())); - builder.a(tokens.end()); - } else { - builder.a(tokens.entry()); - } - if (sourceNames.stream().distinct().count() > 1) { - builder.a(tokens.down()); - } else { - builder.a(tokens.dash()); - } - } else { - builder.a(tokens.entry()); - } - String runningTestCase = - concatenateWithTestGroup(builder, testResult, !isBlank(testResult.getReportNameWithGroup())); - println(runningTestCase); - } - - private long getTreeLength(TestSetReportEntry entry) { - return entry.getSourceName() - .chars() - .filter(c -> c == $) - .count(); - } - - private void println(String message) { - this.getConsoleLogger().info(message); - } - } diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java b/src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java index fbb6d21..0ec3d2b 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java @@ -28,7 +28,7 @@ public enum Tokens { * [INFO] | '-- [OK] Should pass for the 4th time - 0s * */ - ASCII("| ", "+--", "'--", ",--", "---", " [OK] ", " [XX] ", " [??] "), + ASCII("| ", "+--", "'--", ".--", "---", " [OK] ", " [XX] ", " [??] "), /** * Unicode (extended ASCII) characters are used to display the test execution tree. diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java new file mode 100644 index 0000000..478cc58 --- /dev/null +++ b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java @@ -0,0 +1,129 @@ +package org.apache.maven.plugin.surefire.report; + +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; +import org.apache.maven.surefire.api.report.TestSetReportEntry; +import org.apache.maven.surefire.shared.utils.logging.MessageBuilder; + +import java.util.List; +import java.util.stream.LongStream; + +import static org.apache.maven.plugin.surefire.report.TestSetStats.concatenateWithTestGroup; +import static org.apache.maven.surefire.shared.utils.StringUtils.isBlank; +import static org.apache.maven.surefire.shared.utils.logging.MessageUtils.buffer; + +public class TreePrinter { + + private final ConsoleLogger consoleLogger; + private final List sourceNames; + private final Tokens tokens = Tokens.ASCII; + private static final int $ = 36; + + public TreePrinter(ConsoleLogger consoleLogger, List sourceNames) { + this.consoleLogger = consoleLogger; + this.sourceNames = sourceNames; + } + + public void printTest(WrappedReportEntry testResult) { + if (testResult.isErrorOrFailure()) { + printFailure(testResult); + } else if (testResult.isSkipped()) { + printSkipped(testResult); + } else if (testResult.isSucceeded()) { + printSuccess(testResult); + } + } + + private void printSuccess(WrappedReportEntry testResult) { + println(testResult, buffer() + .success(tokens.successful() + testResult.getReportName())); + } + + private void printSkipped(WrappedReportEntry testResult) { + println(testResult, buffer() + .warning(tokens.skipped() + getSkippedReport(testResult)) + .warning(getSkippedMessage(testResult))); + } + + private String getSkippedReport(WrappedReportEntry testResult) { + if (!isBlank(testResult.getReportName())) { + return testResult.getReportName(); + } else { + return testResult.getReportSourceName(); + } + } + + private String getSkippedMessage(WrappedReportEntry testResult) { + if (!isBlank(testResult.getMessage())) { + return " (" + testResult.getMessage() + ")"; + } else { + return ""; + } + } + + private void printFailure(WrappedReportEntry testResult) { + println(testResult, buffer() + .failure(tokens.failed() + testResult.getReportName())); + } + + public void printClass(WrappedReportEntry testResult) { + MessageBuilder builder = buffer(); + if (getTreeLength(testResult) > 0) { + if (getTreeLength(testResult) > 1) { + builder.a(tokens.pipe()); + LongStream.rangeClosed(0, getTreeLength(testResult) - 3) + .forEach(i -> builder.a(tokens.blank())); + builder.a(tokens.end()); + } else { + builder.a(tokens.entry()); + } + if (sourceNames.stream().distinct().count() > 1) { + builder.a(tokens.down()); + } else { + builder.a(tokens.dash()); + } + } else { + builder.a(tokens.entry()); + } + println(concatenateWithTestGroup(builder, testResult, !isBlank(testResult.getReportNameWithGroup()))); + } + + private MessageBuilder getPrefix(WrappedReportEntry testResult) { + MessageBuilder builder = buffer().a(tokens.pipe()); + if (getTreeLength(testResult) > 0) { + LongStream.rangeClosed(0, getTreeLength(testResult) - 2) + .forEach(i -> builder.a(tokens.blank())); + if (sourceNames.stream().distinct().count() > 1) { + builder.a(tokens.pipe()); + } else { + builder.a(tokens.blank()); + } + } + sourceNames.remove(testResult.getSourceName()); + if (sourceNames.contains(testResult.getSourceName())) { + builder.a(tokens.entry()); + } else { + builder.a(tokens.end()); + } + return builder; + } + + private long getTreeLength(TestSetReportEntry entry) { + return entry.getSourceName() + .chars() + .filter(c -> c == $) + .count(); + } + + private void println(WrappedReportEntry testResult, MessageBuilder builder) { + println(getPrefix(testResult) + .a(builder) + .a(" - " + testResult.elapsedTimeAsString() + "s") + .toString()); + } + + private void println(String message) { + consoleLogger.info(message); + } + + +} From 122526b0f117b09a4dc23c6e8bd7eb8a0940930e Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 03:04:10 +0200 Subject: [PATCH 06/14] refactor --- .../surefire/report/ConsoleTreeReporter.java | 23 +- .../report/{Tokens.java => Theme.java} | 6 +- .../plugin/surefire/report/TreePrinter.java | 204 +++++++++++------- 3 files changed, 128 insertions(+), 105 deletions(-) rename src/main/java/org/apache/maven/plugin/surefire/report/{Tokens.java => Theme.java} (96%) diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java index eb91ece..d31570a 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporter.java @@ -24,8 +24,6 @@ import java.util.*; -import static java.util.stream.Collectors.toList; - /** * Tree view class for console reporters. * @@ -33,8 +31,6 @@ */ public class ConsoleTreeReporter extends ConsoleReporter { - private final Map testBuffer = new HashMap<>(); - public ConsoleTreeReporter(ConsoleLogger logger, boolean usePhrasedClassNameInRunning, boolean usePhrasedClassNameInTestCaseSummary) { super(logger, usePhrasedClassNameInRunning, usePhrasedClassNameInTestCaseSummary); @@ -42,27 +38,12 @@ public ConsoleTreeReporter(ConsoleLogger logger, @Override public void testSetStarting(TestSetReportEntry report) { - testBuffer.put(report.getSourceName(), report); } @Override public void testSetCompleted(WrappedReportEntry report, TestSetStats testSetStats, List testResults) { - TreePrinter treePrinter = new TreePrinter(getConsoleLogger(), getSourceNames(testSetStats)); - for (WrappedReportEntry testResult : testSetStats.getReportEntries()) { - if(testBuffer.containsKey(testResult.getSourceName())) { - treePrinter.printClass(testResult); - testBuffer.remove(testResult.getSourceName()); - } - treePrinter.printTest(testResult); - } - testBuffer.clear(); - } - - private List getSourceNames(TestSetStats testSetStats) { - return testSetStats.getReportEntries() - .stream() - .map(WrappedReportEntry::getSourceName) - .collect(toList()); + new TreePrinter(getConsoleLogger(), testSetStats) + .printTests(); } } diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java b/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java similarity index 96% rename from src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java rename to src/main/java/org/apache/maven/plugin/surefire/report/Theme.java index 0ec3d2b..c67e119 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/Tokens.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java @@ -5,7 +5,7 @@ //Thanks to https://github.com/junit-team/junit5/blob/main/junit-platform-console/src/main/java/org/junit/platform/console/options/Theme.java -public enum Tokens { +public enum Theme { /** * ASCII 7-bit characters form the tree branch. @@ -53,7 +53,7 @@ public enum Tokens { */ UNICODE("│ ", "├─ ", "└─ ", "┬─ ", "── ", "✔ ", "✘ ", "↷ "); - public static Tokens valueOf(Charset charset) { + public static Theme valueOf(Charset charset) { if (StandardCharsets.UTF_8.equals(charset)) { return UNICODE; } @@ -62,7 +62,7 @@ public static Tokens valueOf(Charset charset) { private final String[] tiles; - Tokens(String... tiles) { + Theme(String... tiles) { this.tiles = tiles; } diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java index 478cc58..8709068 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java @@ -1,12 +1,14 @@ package org.apache.maven.plugin.surefire.report; import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; -import org.apache.maven.surefire.api.report.TestSetReportEntry; import org.apache.maven.surefire.shared.utils.logging.MessageBuilder; import java.util.List; +import java.util.Set; import java.util.stream.LongStream; +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; import static org.apache.maven.plugin.surefire.report.TestSetStats.concatenateWithTestGroup; import static org.apache.maven.surefire.shared.utils.StringUtils.isBlank; import static org.apache.maven.surefire.shared.utils.logging.MessageUtils.buffer; @@ -15,115 +17,155 @@ public class TreePrinter { private final ConsoleLogger consoleLogger; private final List sourceNames; - private final Tokens tokens = Tokens.ASCII; + private final Set distinctSourceName; + private final TestSetStats testSetStats; + private final Theme theme = Theme.ASCII; private static final int $ = 36; - public TreePrinter(ConsoleLogger consoleLogger, List sourceNames) { + public TreePrinter(ConsoleLogger consoleLogger, TestSetStats testSetStats) { this.consoleLogger = consoleLogger; - this.sourceNames = sourceNames; + this.sourceNames = getSourceNames(testSetStats); + this.distinctSourceName = getDistinctSourceNames(testSetStats); + this.testSetStats = testSetStats; } - public void printTest(WrappedReportEntry testResult) { - if (testResult.isErrorOrFailure()) { - printFailure(testResult); - } else if (testResult.isSkipped()) { - printSkipped(testResult); - } else if (testResult.isSucceeded()) { - printSuccess(testResult); - } + private List getSourceNames(TestSetStats testSetStats) { + return testSetStats.getReportEntries() + .stream() + .map(WrappedReportEntry::getSourceName) + .collect(toList()); } - private void printSuccess(WrappedReportEntry testResult) { - println(testResult, buffer() - .success(tokens.successful() + testResult.getReportName())); + private Set getDistinctSourceNames(TestSetStats testSetStats) { + return testSetStats.getReportEntries() + .stream() + .map(WrappedReportEntry::getSourceName) + .collect(toSet()); } - private void printSkipped(WrappedReportEntry testResult) { - println(testResult, buffer() - .warning(tokens.skipped() + getSkippedReport(testResult)) - .warning(getSkippedMessage(testResult))); + public void printTests() { + testSetStats.getReportEntries() + .stream() + .map(TestPrinter::new) + .forEach(TestPrinter::printTest); } + + private class TestPrinter { + + private final WrappedReportEntry testResult; + private final long treeLength; + + public TestPrinter(WrappedReportEntry testResult) { + this.testResult = testResult; + this.treeLength = getTreeLength(); + } - private String getSkippedReport(WrappedReportEntry testResult) { - if (!isBlank(testResult.getReportName())) { - return testResult.getReportName(); - } else { - return testResult.getReportSourceName(); + private void printTest() { + printClass(); + if (testResult.isErrorOrFailure()) { + printFailure(); + } else if (testResult.isSkipped()) { + printSkipped(); + } else if (testResult.isSucceeded()) { + printSuccess(); + } } - } - private String getSkippedMessage(WrappedReportEntry testResult) { - if (!isBlank(testResult.getMessage())) { - return " (" + testResult.getMessage() + ")"; - } else { - return ""; + private void printSuccess() { + println(buffer() + .success(theme.successful() + testResult.getReportName())); } - } - private void printFailure(WrappedReportEntry testResult) { - println(testResult, buffer() - .failure(tokens.failed() + testResult.getReportName())); - } + private void printSkipped() { + println(buffer() + .warning(theme.skipped() + getSkippedReport()) + .warning(getSkippedMessage())); + } - public void printClass(WrappedReportEntry testResult) { - MessageBuilder builder = buffer(); - if (getTreeLength(testResult) > 0) { - if (getTreeLength(testResult) > 1) { - builder.a(tokens.pipe()); - LongStream.rangeClosed(0, getTreeLength(testResult) - 3) - .forEach(i -> builder.a(tokens.blank())); - builder.a(tokens.end()); + private String getSkippedReport() { + if (!isBlank(testResult.getReportName())) { + return testResult.getReportName(); } else { - builder.a(tokens.entry()); + return testResult.getReportSourceName(); } - if (sourceNames.stream().distinct().count() > 1) { - builder.a(tokens.down()); + } + + private String getSkippedMessage() { + if (!isBlank(testResult.getMessage())) { + return " (" + testResult.getMessage() + ")"; } else { - builder.a(tokens.dash()); + return ""; } - } else { - builder.a(tokens.entry()); } - println(concatenateWithTestGroup(builder, testResult, !isBlank(testResult.getReportNameWithGroup()))); - } - private MessageBuilder getPrefix(WrappedReportEntry testResult) { - MessageBuilder builder = buffer().a(tokens.pipe()); - if (getTreeLength(testResult) > 0) { - LongStream.rangeClosed(0, getTreeLength(testResult) - 2) - .forEach(i -> builder.a(tokens.blank())); - if (sourceNames.stream().distinct().count() > 1) { - builder.a(tokens.pipe()); + private void printFailure() { + println(buffer() + .failure(theme.failed() + testResult.getReportName())); + } + + private void printClass() { + if(!distinctSourceName.contains(testResult.getSourceName())) return; + distinctSourceName.remove(testResult.getSourceName()); + + MessageBuilder builder = buffer(); + if (treeLength > 0) { + if (treeLength > 1) { + builder.a(theme.pipe()); + LongStream.rangeClosed(0, treeLength - 3) + .forEach(i -> builder.a(theme.blank())); + builder.a(theme.end()); + } else { + builder.a(theme.entry()); + } + if (sourceNames.stream().distinct().count() > 1) { + builder.a(theme.down()); + } else { + builder.a(theme.dash()); + } } else { - builder.a(tokens.blank()); + builder.a(theme.entry()); } + println(concatenateWithTestGroup(builder, testResult, !isBlank(testResult.getReportNameWithGroup()))); } - sourceNames.remove(testResult.getSourceName()); - if (sourceNames.contains(testResult.getSourceName())) { - builder.a(tokens.entry()); - } else { - builder.a(tokens.end()); + + private MessageBuilder getTestPrefix() { + MessageBuilder builder = buffer().a(theme.pipe()); + if (treeLength > 0) { + LongStream.rangeClosed(0, treeLength - 2) + .forEach(i -> builder.a(theme.blank())); + if (sourceNames.stream().distinct().count() > 1) { + builder.a(theme.pipe()); + } else { + builder.a(theme.blank()); + } + } + sourceNames.remove(testResult.getSourceName()); + if (sourceNames.contains(testResult.getSourceName())) { + builder.a(theme.entry()); + } else { + builder.a(theme.end()); + } + return builder; } - return builder; - } - private long getTreeLength(TestSetReportEntry entry) { - return entry.getSourceName() - .chars() - .filter(c -> c == $) - .count(); - } + private long getTreeLength() { + return testResult.getSourceName() + .chars() + .filter(c -> c == $) + .count(); + } - private void println(WrappedReportEntry testResult, MessageBuilder builder) { - println(getPrefix(testResult) - .a(builder) - .a(" - " + testResult.elapsedTimeAsString() + "s") - .toString()); - } + private void println(MessageBuilder builder) { + println(getTestPrefix() + .a(builder) + .a(" - " + testResult.elapsedTimeAsString() + "s") + .toString()); + } - private void println(String message) { - consoleLogger.info(message); + private void println(String message) { + consoleLogger.info(message); + } + } - } From f265ef50c40b4bb9e637eda080240ab71a6b996a Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 03:12:21 +0200 Subject: [PATCH 07/14] supress warning --- src/main/java/org/apache/maven/plugin/surefire/report/Theme.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java b/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java index c67e119..27c98f9 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java @@ -60,6 +60,7 @@ public static Theme valueOf(Charset charset) { return ASCII; } + @SuppressWarnings("ImmutableEnumChecker") private final String[] tiles; Theme(String... tiles) { From 5b2d3115a6c60e7608a64a4604bb7831d9f6dbaf Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 03:19:52 +0200 Subject: [PATCH 08/14] add headers and javadoc --- .../maven/plugin/surefire/report/Theme.java | 26 +++++++++++++++++-- .../plugin/surefire/report/TreePrinter.java | 24 +++++++++++++++++ .../report/ConsoleTreeReporterTest.java | 2 +- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java b/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java index 27c98f9..834fcb6 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/Theme.java @@ -1,10 +1,32 @@ package org.apache.maven.plugin.surefire.report; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -//Thanks to https://github.com/junit-team/junit5/blob/main/junit-platform-console/src/main/java/org/junit/platform/console/options/Theme.java - +/** + * Tree view printer. + * @see Used reference + * @author Fabrício Yamamoto + */ public enum Theme { /** diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java index 8709068..479b75c 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java @@ -1,5 +1,24 @@ package org.apache.maven.plugin.surefire.report; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.shared.utils.logging.MessageBuilder; @@ -13,6 +32,11 @@ import static org.apache.maven.surefire.shared.utils.StringUtils.isBlank; import static org.apache.maven.surefire.shared.utils.logging.MessageUtils.buffer; +/** + * Tree view printer. + * + * @author Fabrício Yamamoto + */ public class TreePrinter { private final ConsoleLogger consoleLogger; diff --git a/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java b/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java index 5db1c81..9043b75 100644 --- a/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java +++ b/src/test/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterTest.java @@ -1,7 +1,6 @@ package org.apache.maven.plugin.surefire.report; import org.apache.maven.plugin.surefire.log.PluginConsoleLogger; -import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.report.RunMode; import org.apache.maven.surefire.api.report.SimpleReportEntry; import org.codehaus.plexus.DefaultPlexusContainer; @@ -68,6 +67,7 @@ void testSetCompleted() throws PlexusContainerException { consoleTreeReporter.testSetStarting(simpleReportEntry3); consoleTreeReporter.testSetStarting(simpleReportEntry4); consoleTreeReporter.testSetCompleted(null, testSetStats, null); + //TODO see how to unit test this } } \ No newline at end of file From 6e5df8db31156a84f0d77f4721c1518125da1b45 Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 03:32:12 +0200 Subject: [PATCH 09/14] cleaning and adding UNICODE --- pom.xml | 2 +- ...Unit5StatelessTestsetInfoTreeReporter.java | 37 ------------- ...atelessTestsetInfoTreeReporterUnicode.java | 52 +++++++++++++++++++ .../report/ConsoleTreeReporterUnicode.java | 45 ++++++++++++++++ .../plugin/surefire/report/TreePrinter.java | 9 +++- 5 files changed, 105 insertions(+), 40 deletions(-) create mode 100644 src/main/java/org/apache/maven/plugin/surefire/extensions/junit5/JUnit5StatelessTestsetInfoTreeReporterUnicode.java create mode 100644 src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterUnicode.java diff --git a/pom.xml b/pom.xml index 7d788ee..f079e7d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.fabriciorby maven-surefire-junit5-tree-reporter - 0.2.0 + 0.3.0-SNAPSHOT jar maven-surefire-junit5-tree-reporter diff --git a/src/main/java/org/apache/maven/plugin/surefire/extensions/junit5/JUnit5StatelessTestsetInfoTreeReporter.java b/src/main/java/org/apache/maven/plugin/surefire/extensions/junit5/JUnit5StatelessTestsetInfoTreeReporter.java index 2ff58b4..d32b1b4 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/extensions/junit5/JUnit5StatelessTestsetInfoTreeReporter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/extensions/junit5/JUnit5StatelessTestsetInfoTreeReporter.java @@ -21,15 +21,9 @@ import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.plugin.surefire.report.ConsoleTreeReporter; -import org.apache.maven.plugin.surefire.report.FileReporter; import org.apache.maven.plugin.surefire.report.TestSetStats; import org.apache.maven.plugin.surefire.report.WrappedReportEntry; import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener; -import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener; - -import java.io.File; -import java.nio.charset.Charset; - /** * Extension of {@link JUnit5StatelessTestsetInfoReporter file and console reporter of test-set} for JUnit5. @@ -47,37 +41,6 @@ public StatelessTestsetInfoConsoleReportEventListener createListener( - File reportsDirectory, String reportNameSuffix, Charset encoding ) - { - return new FileReporter( reportsDirectory, reportNameSuffix, encoding, isUsePhrasedFileName(), - isUsePhrasedClassNameInRunning(), isUsePhrasedClassNameInTestCaseSummary() ); - } - - @Override - public Object clone( ClassLoader target ) - { - try - { - Object clone = super.clone( target ); - - Class cls = clone.getClass(); - cls.getMethod( "setUsePhrasedFileName", boolean.class ) - .invoke( clone, isUsePhrasedFileName() ); - cls.getMethod( "setUsePhrasedClassNameInTestCaseSummary", boolean.class ) - .invoke( clone, isUsePhrasedFileName() ); - cls.getMethod( "setUsePhrasedClassNameInRunning", boolean.class ) - .invoke( clone, isUsePhrasedFileName() ); - - return clone; - } - catch ( ReflectiveOperationException e ) - { - throw new IllegalStateException( e.getLocalizedMessage() ); - } - } - @Override public String toString() { diff --git a/src/main/java/org/apache/maven/plugin/surefire/extensions/junit5/JUnit5StatelessTestsetInfoTreeReporterUnicode.java b/src/main/java/org/apache/maven/plugin/surefire/extensions/junit5/JUnit5StatelessTestsetInfoTreeReporterUnicode.java new file mode 100644 index 0000000..d4695e1 --- /dev/null +++ b/src/main/java/org/apache/maven/plugin/surefire/extensions/junit5/JUnit5StatelessTestsetInfoTreeReporterUnicode.java @@ -0,0 +1,52 @@ +package org.apache.maven.plugin.surefire.extensions.junit5; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; +import org.apache.maven.plugin.surefire.report.*; +import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener; + +/** + * Extension of {@link JUnit5StatelessTestsetInfoReporter file and console reporter of test-set} for JUnit5. + * + * @author Fabrício Yamamoto (fabriciorby) + */ +public class JUnit5StatelessTestsetInfoTreeReporterUnicode extends JUnit5StatelessTestsetInfoTreeReporter +{ + + @Override + public StatelessTestsetInfoConsoleReportEventListener createListener( + ConsoleLogger logger ) + { + return new ConsoleTreeReporterUnicode( logger, isUsePhrasedClassNameInRunning(), + isUsePhrasedClassNameInTestCaseSummary() ); + } + + @Override + public String toString() + { + return "JUnit5StatelessTestsetInfoTreeReporterUnicode{" + + "disable=" + isDisable() + + ", usePhrasedFileName=" + isUsePhrasedFileName() + + ", usePhrasedClassNameInRunning=" + isUsePhrasedClassNameInRunning() + + ", usePhrasedClassNameInTestCaseSummary=" + isUsePhrasedClassNameInTestCaseSummary() + + "}"; + } +} diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterUnicode.java b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterUnicode.java new file mode 100644 index 0000000..c09fb97 --- /dev/null +++ b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterUnicode.java @@ -0,0 +1,45 @@ +package org.apache.maven.plugin.surefire.report; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; +import org.apache.maven.surefire.api.report.TestSetReportEntry; + +import java.util.List; + +/** + * Tree view class for console reporters. + * + * @author Fabrício Yamamoto + */ +public class ConsoleTreeReporterUnicode extends ConsoleTreeReporter { + + public ConsoleTreeReporterUnicode(ConsoleLogger logger, + boolean usePhrasedClassNameInRunning, boolean usePhrasedClassNameInTestCaseSummary) { + super(logger, usePhrasedClassNameInRunning, usePhrasedClassNameInTestCaseSummary); + } + + @Override + public void testSetCompleted(WrappedReportEntry report, TestSetStats testSetStats, List testResults) { + new TreePrinter(getConsoleLogger(), testSetStats, Theme.UNICODE) + .printTests(); + } + +} diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java index 479b75c..71ee52a 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java @@ -43,14 +43,19 @@ public class TreePrinter { private final List sourceNames; private final Set distinctSourceName; private final TestSetStats testSetStats; - private final Theme theme = Theme.ASCII; + private final Theme theme; private static final int $ = 36; - public TreePrinter(ConsoleLogger consoleLogger, TestSetStats testSetStats) { + public TreePrinter(ConsoleLogger consoleLogger, TestSetStats testSetStats, Theme theme) { this.consoleLogger = consoleLogger; this.sourceNames = getSourceNames(testSetStats); this.distinctSourceName = getDistinctSourceNames(testSetStats); this.testSetStats = testSetStats; + this.theme = theme; + } + + public TreePrinter(ConsoleLogger consoleLogger, TestSetStats testSetStats) { + this(consoleLogger, testSetStats, Theme.ASCII); } private List getSourceNames(TestSetStats testSetStats) { From c1d3dc14ca422e12396b10246d55fbe8f7973b1b Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 04:04:43 +0200 Subject: [PATCH 10/14] add text formatter for abbreviation --- .../report/ConsoleTreeReporterUnicode.java | 2 +- .../plugin/surefire/report/TextFormatter.java | 14 ++++++++++++++ .../maven/plugin/surefire/report/TreePrinter.java | 10 +++++++--- src/test/java/LongNameExampleTest.java | 3 ++- 4 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/apache/maven/plugin/surefire/report/TextFormatter.java diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterUnicode.java b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterUnicode.java index c09fb97..b984634 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterUnicode.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleTreeReporterUnicode.java @@ -25,7 +25,7 @@ import java.util.List; /** - * Tree view class for console reporters. + * Tree view class for console reporters using UNICODE theme. * * @author Fabrício Yamamoto */ diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/TextFormatter.java b/src/main/java/org/apache/maven/plugin/surefire/report/TextFormatter.java new file mode 100644 index 0000000..7a3f384 --- /dev/null +++ b/src/main/java/org/apache/maven/plugin/surefire/report/TextFormatter.java @@ -0,0 +1,14 @@ +package org.apache.maven.plugin.surefire.report; + +import static org.apache.maven.surefire.shared.lang3.StringUtils.abbreviate; +import static org.apache.maven.surefire.shared.lang3.StringUtils.normalizeSpace; + +public class TextFormatter { + + public static final int MAX_WIDTH = 180; + public static final String ABBREV_MARKER = "..."; + + public static String abbreviateName(String text) { + return abbreviate(normalizeSpace(text), ABBREV_MARKER, MAX_WIDTH); + } +} diff --git a/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java index 71ee52a..1fdea0e 100644 --- a/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java +++ b/src/main/java/org/apache/maven/plugin/surefire/report/TreePrinter.java @@ -20,6 +20,7 @@ */ import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; +import org.apache.maven.surefire.shared.lang3.StringUtils; import org.apache.maven.surefire.shared.utils.logging.MessageBuilder; import java.util.List; @@ -29,6 +30,9 @@ import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toSet; import static org.apache.maven.plugin.surefire.report.TestSetStats.concatenateWithTestGroup; +import static org.apache.maven.plugin.surefire.report.TextFormatter.abbreviateName; +import static org.apache.maven.surefire.shared.lang3.StringUtils.abbreviate; +import static org.apache.maven.surefire.shared.lang3.StringUtils.normalizeSpace; import static org.apache.maven.surefire.shared.utils.StringUtils.isBlank; import static org.apache.maven.surefire.shared.utils.logging.MessageUtils.buffer; @@ -102,7 +106,7 @@ private void printTest() { private void printSuccess() { println(buffer() - .success(theme.successful() + testResult.getReportName())); + .success(theme.successful() + abbreviateName(testResult.getReportName()))); } private void printSkipped() { @@ -113,7 +117,7 @@ private void printSkipped() { private String getSkippedReport() { if (!isBlank(testResult.getReportName())) { - return testResult.getReportName(); + return abbreviateName(testResult.getReportName()); } else { return testResult.getReportSourceName(); } @@ -129,7 +133,7 @@ private String getSkippedMessage() { private void printFailure() { println(buffer() - .failure(theme.failed() + testResult.getReportName())); + .failure(theme.failed() + abbreviateName(testResult.getReportName()))); } private void printClass() { diff --git a/src/test/java/LongNameExampleTest.java b/src/test/java/LongNameExampleTest.java index 7ac0833..b0dfb51 100644 --- a/src/test/java/LongNameExampleTest.java +++ b/src/test/java/LongNameExampleTest.java @@ -6,6 +6,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; @DisplayName("Long Name Sample Test") public class LongNameExampleTest { @@ -72,6 +73,6 @@ static Stream shakespeare() { @MethodSource @DisplayName("Test normalization and abbreviation of test report") void shakespeare(String[] sonnets) { - assertEquals(true, true); + assertTrue(true); } } From 64605bea5f868a9dd96dfbf9d14ecf48c9609c30 Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 04:13:16 +0200 Subject: [PATCH 11/14] update mockito version --- pom.xml | 5 +++-- src/test/java/LongNameExampleTest.java | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index f079e7d..ba0a8a0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ 3.0.0-M1 1.6 UTF-8 + 4.6.1 @@ -41,13 +42,13 @@ org.mockito mockito-core - 4.6.1 + ${mockito.version} test org.mockito mockito-junit-jupiter - 4.6.1 + ${mockito.version} test diff --git a/src/test/java/LongNameExampleTest.java b/src/test/java/LongNameExampleTest.java index b0dfb51..1043220 100644 --- a/src/test/java/LongNameExampleTest.java +++ b/src/test/java/LongNameExampleTest.java @@ -5,7 +5,6 @@ import java.util.stream.Stream; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @DisplayName("Long Name Sample Test") From 68de50cabb1ff22c140fa4207e56626291434f0a Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 12:20:38 +0200 Subject: [PATCH 12/14] testReporter as property --- .gitignore | 2 ++ pom.xml | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 48cb57f..3c906eb 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +settings.xml \ No newline at end of file diff --git a/pom.xml b/pom.xml index ba0a8a0..f200465 100644 --- a/pom.xml +++ b/pom.xml @@ -18,12 +18,15 @@ 1.8 1.8 3.0.0-M7 + + org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporterUnicode + 3.2.1 3.2.0 3.0.0-M1 1.6 - UTF-8 4.6.1 + UTF-8 @@ -107,7 +110,8 @@ true - + From fdd091dfc54ac73dcc9f015e4a03bf5ad69f481a Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 12:45:18 +0200 Subject: [PATCH 13/14] update README --- README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 05cbe28..aa3be2e 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,53 @@ # Maven Surefire JUnit5 TreeView Extension +If you are a Maven Surefire user and ever wanted a fancy tree output for your tests instead of a bunch of logs, you absolutely should try this. + This is a dependency for [maven-surefire-plugin](https://maven.apache.org/surefire/maven-surefire-plugin/), it adds a tree view for the unit tests executed using JUnit5. ## Output -It's in WIP yet, but the output is something like this: +The output can be printed in two ways. + +### UNICODE +![Imgur](https://i.imgur.com/tgV2mse.png "UNICODE Output") +``org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporterUnicode`` -![alt text](https://i.imgur.com/qMb4eoC.png "output") +### ASCII +![Imgur](https://imgur.com/nwo1C0F.png "ASCII Output") +``org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter`` ## Installation The Maven Repository can be found [here](https://mvnrepository.com/artifact/me.fabriciorby/maven-surefire-junit5-tree-reporter). -Just let your pom.xml be like this. +Configure your POM like the following + +### UNICODE Output + +```xml + + maven-surefire-plugin + 3.0.0-M7 + + + me.fabriciorby + maven-surefire-junit5-tree-reporter + 0.3.0-SNAPSHOT + + + + plain + + true + + + + + +``` + +### ASCII Output ```xml @@ -22,7 +57,7 @@ Just let your pom.xml be like this. me.fabriciorby maven-surefire-junit5-tree-reporter - 0.2.0 + 0.3.0-SNAPSHOT @@ -30,22 +65,23 @@ Just let your pom.xml be like this. true - + ``` -The important thing here is to set ``reportFormat`` as ``plain``, disable the console output and use our new class ``JUnit5StatelessTestsetInfoTreeReporter`` to print the results. +## Contribute + +You are welcome to contribute to the project, for this just open an issue or issue + PR to ``develop`` branch. + +If you want to create your own output based on the [Theme](src/main/java/report/Theme.java) Enum, feel free to open a PR. ## Debugging If you want to contribute and need to debug the code, please use the following command ``` -mvnDebug -DforkCount=0 test +mvnDebug test ``` -Then attach a remote JVM debugger on port 8000 - -## Known bugs - -The maven-sunfire-plugin doesn't handle ``@Nested`` tests in the desired order so our result tree is not perfect yet. I've forked the maven-sunfire project and debugged it but still couldn't figure out how to solve this my myself... +Then attach a remote JVM debugger on port 8000 \ No newline at end of file From 1a01f7ca3c124d50880c689b829ab89bf91a7cd6 Mon Sep 17 00:00:00 2001 From: fabriciorby Date: Mon, 27 Jun 2022 12:47:45 +0200 Subject: [PATCH 14/14] update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index aa3be2e..e1185d6 100644 --- a/README.md +++ b/README.md @@ -76,11 +76,11 @@ Configure your POM like the following You are welcome to contribute to the project, for this just open an issue or issue + PR to ``develop`` branch. -If you want to create your own output based on the [Theme](src/main/java/report/Theme.java) Enum, feel free to open a PR. +If you want to create your own output based on the [Theme](src/main/java/org/apache/maven/plugin/surefire/report/Theme.java) Enum, feel free to open a PR. -## Debugging +### Debugging -If you want to contribute and need to debug the code, please use the following command +If you ever want to debug the code, please use the following command ``` mvnDebug test ```