diff --git a/plugins/junit5_rt/src/com/intellij/junit5/report/TestReporter.java b/plugins/junit5_rt/src/com/intellij/junit5/report/TestReporter.java index 4ae146b3598b..b02f512db76f 100644 --- a/plugins/junit5_rt/src/com/intellij/junit5/report/TestReporter.java +++ b/plugins/junit5_rt/src/com/intellij/junit5/report/TestReporter.java @@ -147,12 +147,11 @@ public class TestReporter extends AbstractTestReporter { } } - boolean hasComparisonData = failureData != null || ex instanceof MultipleFailuresError; - String trace = includeThrowable ? getTrace(ex) : ""; - ComparisonFailureData.registerSMAttributes(failureData, hasComparisonData ? "" : trace, ex.getMessage(), attributes, ex, - "Comparison Failure: ", "expected: <"); - if (hasComparisonData && !trace.isEmpty()) { - attributes.put("details", trace); + ComparisonFailureData.registerSMAttributes(failureData, includeThrowable || failureData == null ? getTrace(ex) : "", + ex.getMessage(), attributes, ex, "Comparison Failure: ", "expected: <"); + + if (ex instanceof MultipleFailuresError) { + attributes.computeIfPresent("message", (k, msq) -> (msq.contains("\n")) ? msq.substring(0, msq.indexOf('\n')) + "..." : msq); } } diff --git a/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java b/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java index eaba1eee0b5a..a34e953e342b 100644 --- a/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java +++ b/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java @@ -55,9 +55,9 @@ public class JUnit5EventsTest { ##TC[rootName name='testClass' location='java:suite://testClass'] ##TC[testStarted id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='test1()' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0' locationHint='java:test://com.intellij.junit5.testData.MyTestClass/test1' metainfo=''] ##TC[testStdOut id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='test1()' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0' out='timestamp = ${timestamp}, key1 = value1, stdout = out1|n'] - ##TC[testFailed id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='test1()' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0' message='message1|nComparison Failure: ' expected='expected1' actual='actual1' details='TRACE'] - ##TC[testFailed id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='test1()' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0' message='message2|nComparison Failure: ' expected='expected2' actual='actual2' details='TRACE'] - ##TC[testFailed id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='test1()' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0' message='2 errors (2 failures)|n\torg.opentest4j.AssertionFailedError: message1|n\torg.opentest4j.AssertionFailedError: message2' details='TRACE'] + ##TC[testFailed id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='test1()' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0' message='org.opentest4j.AssertionFailedError: message1' expected='expected1' actual='actual1' details='TRACE'] + ##TC[testFailed id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='test1()' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0' message='org.opentest4j.AssertionFailedError: message2' expected='expected2' actual='actual2' details='TRACE'] + ##TC[testFailed id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='test1()' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0' message='org.opentest4j.MultipleFailuresError: 2 errors (2 failures)...' details='TRACE'] ##TC[testFinished id='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' name='test1()' nodeId='|[engine:engine|]/|[class:testClass|]/|[method:testMethod|]' parentNodeId='0'] """.replace("${timestamp}", reportEntry.getTimestamp().toString()), builder.getNormalizedTestOutput()); } @@ -175,7 +175,7 @@ public class JUnit5EventsTest { var selectors = request.getSelectorsByType(DiscoverySelector.class); Assertions.assertFalse(selectors.isEmpty(), "Selectors should not be empty"); - var selector = selectors.get(0); + var selector = selectors.getFirst(); Assertions.assertInstanceOf(ClassSelector.class, selector); Assertions.assertEquals("com.intellij.junit5.testData.InitStaticField$MyTest", ((ClassSelector)selector).getClassName()); } diff --git a/plugins/junit6_rt_tests/test/com/intellij/junit6/JUnit6EventsTest.java b/plugins/junit6_rt_tests/test/com/intellij/junit6/JUnit6EventsTest.java index 9126182d8b4c..c358e45b0969 100644 --- a/plugins/junit6_rt_tests/test/com/intellij/junit6/JUnit6EventsTest.java +++ b/plugins/junit6_rt_tests/test/com/intellij/junit6/JUnit6EventsTest.java @@ -62,9 +62,9 @@ public class JUnit6EventsTest extends AbstractTestFrameworkCompilingIntegrationT assertEquals(""" ##TC[testStarted id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' locationHint='java:test://com.intellij.junit6.testData.MyTestClass/test1' metainfo='org.junit.jupiter.api.TestReporter'] ##TC[testStdOut id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' out='timestamp = ##timestamp##, key1 = value1, stdout = out1|n'] - ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='message1 ==> expected: but was: |nComparison Failure: ' expected='expected1' actual='actual1' details='org.opentest4j.AssertionFailedError: message1 ==> expected: but was: '] - ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='message2 ==> expected: but was: |nComparison Failure: ' expected='expected2' actual='actual2' details='org.opentest4j.AssertionFailedError: message2 ==> expected: but was: '] - ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='2 errors (2 failures)|n org.opentest4j.AssertionFailedError: message1 ==> expected: but was: |n org.opentest4j.AssertionFailedError: message2 ==> expected: but was: ' details='org.opentest4j.MultipleFailuresError: 2 errors (2 failures)'] + ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='org.opentest4j.AssertionFailedError: message1 ==> ' expected='expected1' actual='actual1' details='at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:)'] + ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='org.opentest4j.AssertionFailedError: message2 ==> ' expected='expected2|nnew line' actual='actual2|nnew line' details='at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:)'] + ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='org.opentest4j.MultipleFailuresError: 2 errors (2 failures)...' details='at org.junit.jupiter.api.AssertAll.assertAll(AssertAll.java:)'] ##TC[testFinished id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##']""", tests); } @@ -107,7 +107,7 @@ public class JUnit6EventsTest extends AbstractTestFrameworkCompilingIntegrationT ##TC[testStarted id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' locationHint='java:test://com.intellij.junit6.testData.MyTestClass/test1' metainfo='org.junit.jupiter.api.TestReporter'] ##TC[testStdOut id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' out='timestamp = ##timestamp##, key1 = value1, stdout = out1|n'] ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='##message##' expected='expected1' actual='actual1' details='##details##'] - ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='##message##' expected='expected2' actual='actual2' details='##details##'] + ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='##message##' expected='expected2|nnew line' actual='actual2|nnew line' details='##details##'] ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##' message='##message##' details='##details##'] ##TC[testFinished id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' name='test1(TestReporter)' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[method:test1(org.junit.jupiter.api.TestReporter)|]' parentNodeId='0' duration='##duration##'] ##TC[testIgnored id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[test-factory:brokenStreamDisabled()|]' name='brokenStreamDisabled()' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.MyTestClass|]/|[test-factory:brokenStreamDisabled()|]' parentNodeId='0' message='##message##'] @@ -206,7 +206,7 @@ public class JUnit6EventsTest extends AbstractTestFrameworkCompilingIntegrationT ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test1()|]' name='test1()' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test1()|]' parentNodeId='0' duration='##duration##' message='org.opentest4j.AssertionFailedError: 123' details='at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:)'] ##TC[testFinished id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test1()|]' name='test1()' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test1()|]' parentNodeId='0' duration='##duration##'] ##TC[testStarted id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test2()|]' name='test2()' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test2()|]' parentNodeId='0' locationHint='java:test://com.intellij.junit6.testData.SimpleFailTest/test2' metainfo=''] - ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test2()|]' name='test2()' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test2()|]' parentNodeId='0' duration='##duration##' message='expected: <123> but was: <321>|nComparison Failure: ' expected='123' actual='321' details='org.opentest4j.AssertionFailedError: expected: <123> but was: <321>'] + ##TC[testFailed id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test2()|]' name='test2()' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test2()|]' parentNodeId='0' duration='##duration##' message='org.opentest4j.AssertionFailedError: ' expected='123' actual='321' details='at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:)'] ##TC[testFinished id='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test2()|]' name='test2()' nodeId='|[engine:junit-jupiter|]/|[class:com.intellij.junit6.testData.SimpleFailTest|]/|[method:test2()|]' parentNodeId='0' duration='##duration##']""", tests); } diff --git a/plugins/junit6_rt_tests/testData/integration/events/test/com/intellij/junit6/testData/MyTestClass.java b/plugins/junit6_rt_tests/testData/integration/events/test/com/intellij/junit6/testData/MyTestClass.java index 08680cfaa21c..be16b4f13bb3 100644 --- a/plugins/junit6_rt_tests/testData/integration/events/test/com/intellij/junit6/testData/MyTestClass.java +++ b/plugins/junit6_rt_tests/testData/integration/events/test/com/intellij/junit6/testData/MyTestClass.java @@ -24,7 +24,7 @@ public class MyTestClass { reporter.publishEntry(map); Assertions.assertAll("2 errors", () -> Assertions.assertEquals("expected1", "actual1", "message1"), - () -> Assertions.assertEquals("expected2", "actual2", "message2") + () -> Assertions.assertEquals("expected2\nnew line", "actual2\nnew line", "message2") ); }