From 8130e83402b8b238a2ee188c892a558bd258226e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 7 Sep 2016 19:11:15 +0300 Subject: [PATCH 1/6] restore layout without scrollers --- .../com/intellij/codeInspection/actions/RunInspectionAction.java | 1 - 1 file changed, 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java index f61583debdae..f1e39d3d75b4 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java @@ -164,7 +164,6 @@ public class RunInspectionAction extends GotoActionBase { else { additionPanel.add(ScrollPaneFactory.createScrollPane(optionsPanel, SideBorder.NONE)); } - additionPanel.setPreferredSize(new JBDimension(-1, 400)); return additionPanel; } else { return fileFilter; From 91e61d2d81824398c81d60c420f33fde1b0b86bd Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 7 Sep 2016 19:25:53 +0300 Subject: [PATCH 2/6] junit 5: fix class navigation, write tests on junit 5 --- plugins/junit5_rt/junit5_rt.iml | 10 +++++ .../lib/junit-jupiter-api-5.0.0-M2.jar | Bin 0 -> 43376 bytes .../junit5/JUnit5TestExecutionListener.java | 24 +++++++---- .../intellij/junit5/JUnit5NavigationTest.java | 38 ++++++++++++++++++ 4 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 plugins/junit5_rt/lib/junit-jupiter-api-5.0.0-M2.jar create mode 100644 plugins/junit5_rt/test/com/intellij/junit5/JUnit5NavigationTest.java diff --git a/plugins/junit5_rt/junit5_rt.iml b/plugins/junit5_rt/junit5_rt.iml index ec639f339e82..7bc61b5261da 100644 --- a/plugins/junit5_rt/junit5_rt.iml +++ b/plugins/junit5_rt/junit5_rt.iml @@ -4,6 +4,7 @@ + @@ -11,5 +12,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/plugins/junit5_rt/lib/junit-jupiter-api-5.0.0-M2.jar b/plugins/junit5_rt/lib/junit-jupiter-api-5.0.0-M2.jar new file mode 100644 index 0000000000000000000000000000000000000000..28f31ce8e02b141594cbdba18e3a5e3857232aae GIT binary patch literal 43376 zcmaI71DGYxwmn$3?dq~^+qP}n<|*5@ZFbpqRhQXawl#f!_dhf5zM1#(+Zpj?RV75EK+pZ{f2f(BA{(U&-GC`tK= z|Lvl#|JIjaf4j)R+2TLC@xNpKvhWYa+Rfg|^?ya8{0Gw7&C$x$%=v$Sz ziQ*f1s@KriRV@-%s)p7Tva@W@lV0#5Oj?*f;UXs3`c|v~{#Y$Ki2HiwM2y?Ep}U)y zAUwx!^jvB8kt-74g{~;Y#hB#Y+u7<^teqeBokzrxcSUsG#!qhs&q4TUF9JQ%i+LBn z)p@uWC;2F>Xp2eXxM)nArQdS*mWQ|nM&!!8KhRu)T2u0HQ_Y6a?eAGDMm9 zZ@_lT8E4*siwS<4Uoi<~h?Q#c8`lLwsZAG;)_})Ri$n+Pq5F<9i=h9cH-gWfJ?r}~ zpXR^bDN)#S|DeANuKi_@?0;ua%*e#@|Dn+OUlblLtDpUfTWUYdAg@KG44N+Mwk1XZ zKpjA~=~C*YG~MOX z7mz9D4r`&zry@ud?C)qxdsDwSbt%%2&Er^%o<;DVtIi2K$41sRakEzn{wDuDu9(@W z8V`J0Z7TmHThOCyG%B@=dGAdmW?B=_PD*~=5i&6E;pf2lauR_32uA&x7r@tp#!0yv zKhc!qP{aR)Xod#h?l380$wTn1pF2g2CQElpI5u1GFmM0ve4eiA|6Y*GnLZ|F`88=) zabcGu${bM~QOrzSUBYuWi`Vi>Q&yREud&Q)LfHwWmW5)$xj`!OT%T55DO;0utmoaX zPS;d=5+~KVeAnm!GSk|=Zz~jJrc}7yN(A{1Lda1ku{Q*DBxlN!Yl!@Slz;4& zp|rf*VzJ|9O0}=bVz4u~gxC==GO!ecLo**6JQ0zExZrffc9) z9fGkoOkM+9GpbzIhDmU36=$z-iPX+6$~_dLg!&xrMmbNR4GKF!w%oreM_4)VSJ|Rf zR?VW3U{_mOi99H?seU_fCUgB5kjP0GJXW~ZFY`+*?rr0KM=i%1U@g^~fL~4!F$rE2 zSd2+`^2_qfKXguVZ3PjIbBjKI1?pycWC44ncyvAKfQnD_u)tx_#pWNc&92Te8OG3Z z&IL9$?fHV{rcvP5@pq-64UHP4|k&W)wN$GwPSke8vPdpXe!v�|^ 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 javaSource = getJavaSource(description); - return javaSource.map(source -> source.getJavaClass().getName()).orElse(null); + return description.getSource().map(source -> { + if (source instanceof JavaMethodSource) { + return ((JavaMethodSource)source).getJavaClass().getName(); + } + if (source instanceof JavaClassSource) { + return ((JavaClassSource)source).getJavaClass().getName(); + } + return null; + }).orElse(null); } static String getMethodName(TestIdentifier testIdentifier) { - return getJavaSource(testIdentifier).map(JavaMethodSource::getJavaMethodName).orElse(null); + return testIdentifier.getSource().map((source) -> { + if (source instanceof JavaMethodSource) { + return ((JavaMethodSource)source).getJavaMethodName(); + } + return null; + }).orElse(null); } - - private static Optional getJavaSource(TestIdentifier testIdentifier) { - return testIdentifier.getSource().filter(JavaMethodSource.class::isInstance).map(JavaMethodSource.class::cast); - } - } diff --git a/plugins/junit5_rt/test/com/intellij/junit5/JUnit5NavigationTest.java b/plugins/junit5_rt/test/com/intellij/junit5/JUnit5NavigationTest.java new file mode 100644 index 000000000000..2ca03025680c --- /dev/null +++ b/plugins/junit5_rt/test/com/intellij/junit5/JUnit5NavigationTest.java @@ -0,0 +1,38 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed 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. + */ +package com.intellij.junit5; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.engine.descriptor.MethodTestDescriptor; +import org.junit.platform.engine.UniqueId; +import org.junit.platform.launcher.TestIdentifier; + +@DisplayName("junit 5 navigation features: location strings, etc") +class JUnit5NavigationTest { + + @Test + void methodNavigation() throws Exception { + UniqueId uniqueId = UniqueId.parse("[class:JUnit5NavigationTest]/[method:methodNavigation]"); + MethodTestDescriptor methodTestDescriptor = + new MethodTestDescriptor(uniqueId, JUnit5NavigationTest.class, JUnit5NavigationTest.class.getDeclaredMethod("methodNavigation")); + TestIdentifier testIdentifier = TestIdentifier.from(methodTestDescriptor); + Assertions.assertEquals(JUnit5NavigationTest.class.getName(), JUnit5TestExecutionListener.getClassName(testIdentifier)); + Assertions.assertEquals("methodNavigation", JUnit5TestExecutionListener.getMethodName(testIdentifier)); + //Assertions.assertEquals("methodNavigation", testIdentifier.getDisplayName()); todo methodNavigation() + } +} From c2b8bdea152da7b4fe63cd6ca37c555e4eb5ae73 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 7 Sep 2016 20:03:32 +0300 Subject: [PATCH 3/6] junit 5: detect attached junit by jupiter api --- .../execution/junit2/info/LocationUtil.java | 23 +++++++++++-------- ...ractAllInPackageConfigurationProducer.java | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/junit2/info/LocationUtil.java b/java/execution/impl/src/com/intellij/execution/junit2/info/LocationUtil.java index 0cef2a7bbb8c..fe5051bea26c 100644 --- a/java/execution/impl/src/com/intellij/execution/junit2/info/LocationUtil.java +++ b/java/execution/impl/src/com/intellij/execution/junit2/info/LocationUtil.java @@ -29,30 +29,33 @@ import org.jetbrains.annotations.NotNull; * Date: 2/20/12 */ public class LocationUtil { - public static boolean isJarAttached(@NotNull Location location, @NotNull final PsiPackage aPackage, final String fqn) { - return isJarAttached(location, fqn, aPackage.getDirectories()); + public static boolean isJarAttached(@NotNull Location location, @NotNull final PsiPackage aPackage, final String... fqn) { + return isJarAttached(location, aPackage.getDirectories(), fqn); } public static boolean isJarAttached(@NotNull Location location, - final String fqn, - final PsiDirectory[] directories) { + final PsiDirectory[] directories, + final String... fqns) { final JavaPsiFacade facade = JavaPsiFacade.getInstance(location.getProject()); - boolean testngJarFound = false; final Module locationModule = location.getModule(); if (locationModule != null) { - testngJarFound = facade.findClass(fqn, GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(locationModule, true)) != null; + for (String fqn : fqns) { + if (facade.findClass(fqn, GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(locationModule, true)) != null) return true; + } } else { for (PsiDirectory directory : directories) { final Module module = ModuleUtilCore.findModuleForFile(directory.getVirtualFile(), location.getProject()); if (module != null) { - if (facade.findClass(fqn, GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, true)) != null) { - testngJarFound = true; - break; + GlobalSearchScope scope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module, true); + for (String fqn : fqns) { + if (facade.findClass(fqn, scope) != null) { + return true; + } } } } } - return testngJarFound; + return false; } } diff --git a/plugins/junit/src/com/intellij/execution/junit/AbstractAllInPackageConfigurationProducer.java b/plugins/junit/src/com/intellij/execution/junit/AbstractAllInPackageConfigurationProducer.java index f5be39e648d1..1e63a903bc39 100644 --- a/plugins/junit/src/com/intellij/execution/junit/AbstractAllInPackageConfigurationProducer.java +++ b/plugins/junit/src/com/intellij/execution/junit/AbstractAllInPackageConfigurationProducer.java @@ -38,7 +38,7 @@ public abstract class AbstractAllInPackageConfigurationProducer extends JUnitCon PsiPackage psiPackage = JavaRuntimeConfigurationProducerBase.checkPackage(context.getPsiLocation()); if (psiPackage == null) return false; sourceElement.set(psiPackage); - if (!LocationUtil.isJarAttached(context.getLocation(), psiPackage, JUnitUtil.TESTCASE_CLASS)) return false; + if (!LocationUtil.isJarAttached(context.getLocation(), psiPackage, JUnitUtil.TESTCASE_CLASS, JUnitUtil.TEST5_ANNOTATION)) return false; final JUnitConfiguration.Data data = configuration.getPersistentData(); data.PACKAGE_NAME = psiPackage.getQualifiedName(); data.TEST_OBJECT = JUnitConfiguration.TEST_PACKAGE; From 2066589b252fe19ddb0d976f1dff627b4dfbe974 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 7 Sep 2016 21:22:15 +0300 Subject: [PATCH 4/6] test multiple failures: print last failure --- .../testframework/sm/runner/SMTestProxy.java | 8 +++- .../sm/runner/SMTestProxyTest.java | 40 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTestProxy.java b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTestProxy.java index 7c7097310444..bb566a29b1d6 100644 --- a/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTestProxy.java +++ b/platform/smRunner/src/com/intellij/execution/testframework/sm/runner/SMTestProxy.java @@ -441,19 +441,23 @@ public class SMTestProxy extends AbstractTestProxy { public void setTestFailed(@NotNull String localizedMessage, @Nullable String stackTrace, boolean testError) { setStacktraceIfNotSet(stackTrace); + TestFailedState failedState = new TestFailedState(localizedMessage, stackTrace); if (myState instanceof TestComparisionFailedState) { CompoundTestFailedState states = new CompoundTestFailedState(localizedMessage, stackTrace); states.addFailure((TestFailedState)myState); - final TestFailedState failedState = new TestFailedState(localizedMessage, stackTrace); states.addFailure(failedState); fireOnNewPrintable(failedState); myState = states; } + else if (myState instanceof CompoundTestFailedState) { + ((CompoundTestFailedState)myState).addFailure(failedState); + fireOnNewPrintable(failedState); + } else if (myState instanceof TestFailedState) { ((TestFailedState)myState).addError(localizedMessage, stackTrace, myPrinter); } else { - myState = testError ? new TestErrorState(localizedMessage, stackTrace) : new TestFailedState(localizedMessage, stackTrace); + myState = testError ? new TestErrorState(localizedMessage, stackTrace) : failedState; fireOnNewPrintable(myState); } } diff --git a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTestProxyTest.java b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTestProxyTest.java index 69d404a0bb0b..05b5458db4b1 100644 --- a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTestProxyTest.java +++ b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/runner/SMTestProxyTest.java @@ -15,12 +15,18 @@ */ package com.intellij.execution.testframework.sm.runner; +import com.intellij.execution.filters.HyperlinkInfo; import com.intellij.execution.testframework.Filter; import com.intellij.execution.testframework.TestConsoleProperties; import com.intellij.execution.testframework.sm.runner.ui.MockPrinter; +import com.intellij.execution.testframework.stacktrace.DiffHyperlink; +import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.psi.search.GlobalSearchScope; import org.easymock.EasyMock; +import java.util.ArrayList; +import java.util.List; + import static com.intellij.execution.testframework.sm.runner.states.TestStateInfo.Magnitude; /** @@ -227,6 +233,40 @@ public class SMTestProxyTest extends BaseSMTRunnerTestCase { assertTrue(mySimpleTest.getMagnitudeInfo() == Magnitude.FAILED_INDEX); } + public void testMultipleAssertions() { + mySimpleTest.setStarted(); + mySimpleTest.setTestComparisonFailed("a", "stacktrace", "actual1", "expected1"); + mySimpleTest.setTestComparisonFailed("b", "stacktrace", "actual2", "expected2"); + mySimpleTest.setTestFailed("c", "stacktrace", false); + mySimpleTest.setFinished(); + + final MockPrinter printer = new MockPrinter(true) { + @Override + public void printHyperlink(String text, HyperlinkInfo info) { + print(text, ConsoleViewContentType.SYSTEM_OUTPUT); + } + }; + mySimpleTest.printOn(printer); + assertEquals("", printer.getStdOut()); + assertEquals("\n" + + "a\n" + + "Expected :expected1\n" + + "Actual :actual1\n" + + " \n" + + "\n" + + "stacktrace\n" + + "\n" + + "b\n" + + "Expected :expected2\n" + + "Actual :actual2\n" + + " \n" + + "\n" + + "stacktrace\n" + + "\n" + + "c\n" + + "stacktrace\n", printer.getAllOut()); + } + public void testTestFailed_ComparisonAssertion() { mySimpleTest.setStarted(); mySimpleTest.setTestComparisonFailed("", "", "", ""); From ab94e6a89f9f1c24f643ff52a131b126a8c63d45 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 8 Sep 2016 12:03:27 +0300 Subject: [PATCH 5/6] junit 5 multiple failure: compose multiple expected/actual and the initial exception separately --- .../junit/ComparisonFailureData.java | 13 ++- .../intellij/junit5/JUnit5IdeaTestRunner.java | 2 +- .../junit5/JUnit5TestExecutionListener.java | 41 +++++++--- .../com/intellij/junit5/JUnit5EventsTest.java | 81 +++++++++++++++++++ 4 files changed, 124 insertions(+), 13 deletions(-) create mode 100644 plugins/junit5_rt/test/com/intellij/junit5/JUnit5EventsTest.java diff --git a/java/java-runtime/src/com/intellij/rt/execution/junit/ComparisonFailureData.java b/java/java-runtime/src/com/intellij/rt/execution/junit/ComparisonFailureData.java index 2c9c7ae4bc51..874ef5e57ff7 100644 --- a/java/java-runtime/src/com/intellij/rt/execution/junit/ComparisonFailureData.java +++ b/java/java-runtime/src/com/intellij/rt/execution/junit/ComparisonFailureData.java @@ -70,8 +70,17 @@ public class ComparisonFailureData { public static void registerSMAttributes(ComparisonFailureData notification, String trace, String failureMessage, - Map attrs, + Map attrs, Throwable throwable) { + registerSMAttributes(notification, trace, failureMessage, attrs, throwable, "Comparison Failure: "); + } + + public static void registerSMAttributes(ComparisonFailureData notification, + String trace, + String failureMessage, + Map attrs, + Throwable throwable, + String comparisonFailurePrefix) { final int failureIdx = failureMessage != null ? trace.indexOf(failureMessage) : -1; final int failureMessageLength = failureMessage != null ? failureMessage.length() : 0; @@ -98,7 +107,7 @@ public class ComparisonFailureData { comparisonFailureMessage = trace.substring(0, failureIdx + failureMessageLength); } else { - comparisonFailureMessage = (failureMessageLength > 0 ? failureMessage + "\n" : "") + "Comparison Failure: "; + comparisonFailureMessage = (failureMessageLength > 0 ? failureMessage + "\n" : "") + comparisonFailurePrefix; } attrs.put("message", comparisonFailureMessage); } diff --git a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5IdeaTestRunner.java b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5IdeaTestRunner.java index d97dfca13b73..f105e2a87a1c 100644 --- a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5IdeaTestRunner.java +++ b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5IdeaTestRunner.java @@ -32,7 +32,7 @@ public class JUnit5IdeaTestRunner implements IdeaTestRunner { @Override public int startRunnerWithArgs(String[] args, ArrayList listeners, String name, int count, boolean sendTree) { Launcher launcher = LauncherFactory.create(); - JUnit5TestExecutionListener listener = new JUnit5TestExecutionListener(System.out); + JUnit5TestExecutionListener listener = new JUnit5TestExecutionListener(); launcher.registerTestExecutionListeners(listener); final String[] packageNameRef = new String[1]; final LauncherDiscoveryRequest discoveryRequest = JUnit5TestRunnerUtil.buildRequest(args, packageNameRef); diff --git a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java index 400c6110614b..40276f3f4b79 100644 --- a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java +++ b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java @@ -25,6 +25,7 @@ import org.junit.platform.launcher.TestExecutionListener; import org.junit.platform.launcher.TestIdentifier; import org.junit.platform.launcher.TestPlan; import org.opentest4j.AssertionFailedError; +import org.opentest4j.MultipleFailuresError; import org.opentest4j.ValueWrapper; import java.io.PrintStream; @@ -114,12 +115,12 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { String reason) { final String displayName = testIdentifier.getDisplayName(); if (testIdentifier.isTest()) { - final long duration = System.currentTimeMillis() - myCurrentTestStart; + final long duration = getDuration(); if (status == TestExecutionResult.Status.FAILED) { - testFailure(testIdentifier, MapSerializerUtil.TEST_FAILED, throwableOptional, duration, reason); + testFailure(testIdentifier, MapSerializerUtil.TEST_FAILED, throwableOptional, duration, reason, true); } else if (status == TestExecutionResult.Status.ABORTED) { - testFailure(testIdentifier, MapSerializerUtil.TEST_IGNORED, throwableOptional, duration, reason); + testFailure(testIdentifier, MapSerializerUtil.TEST_IGNORED, throwableOptional, duration, reason, true); } testFinished(testIdentifier, duration); myFinishCount++; @@ -135,7 +136,7 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { if (messageName != null && myFinishCount == 0) { for (TestIdentifier childIdentifier : myTestPlan.getDescendants(testIdentifier)) { testStarted(childIdentifier); - testFailure(childIdentifier, messageName, throwableOptional, 0, reason); + testFailure(childIdentifier, messageName, throwableOptional, 0, reason, true); testFinished(childIdentifier, 0); } } @@ -143,6 +144,10 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { } } + protected long getDuration() { + return System.currentTimeMillis() - myCurrentTestStart; + } + private void testStarted(TestIdentifier testIdentifier) { myPrintStream.println("\n##teamcity[testStarted" + idAndName(testIdentifier) + "\']"); } @@ -155,7 +160,8 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { String messageName, Throwable ex, long duration, - String reason) { + String reason, + boolean includeThrowable) { final Map attrs = new HashMap<>(); attrs.put("name", testIdentifier.getDisplayName()); attrs.put("id", testIdentifier.getUniqueId().toString()); @@ -167,11 +173,13 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { } try { if (ex != null) { - final StringWriter stringWriter = new StringWriter(); - final PrintWriter writer = new PrintWriter(stringWriter); - ex.printStackTrace(writer); ComparisonFailureData failureData = null; - if (ex instanceof AssertionFailedError && ((AssertionFailedError)ex).isActualDefined() && ((AssertionFailedError)ex).isExpectedDefined()) { + if (ex instanceof MultipleFailuresError && ((MultipleFailuresError)ex).hasFailures()) { + for (AssertionError assertionError : ((MultipleFailuresError)ex).getFailures()) { + testFailure(testIdentifier, messageName, assertionError, duration, reason, false); + } + } + else if (ex instanceof AssertionFailedError && ((AssertionFailedError)ex).isActualDefined() && ((AssertionFailedError)ex).isExpectedDefined()) { final ValueWrapper actual = ((AssertionFailedError)ex).getActual(); final ValueWrapper expected = ((AssertionFailedError)ex).getExpected(); failureData = new ComparisonFailureData(expected.getStringRepresentation(), actual.getStringRepresentation()); @@ -183,7 +191,13 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { } catch (Throwable ignore) {} } - ComparisonFailureData.registerSMAttributes(failureData, stringWriter.toString(), ex.getMessage(), attrs, ex); + + if (includeThrowable || failureData == null) { + ComparisonFailureData.registerSMAttributes(failureData, getTrace(ex), ex.getMessage(), attrs, ex); + } + else { + ComparisonFailureData.registerSMAttributes(failureData, "", "", attrs, ex, ""); + } } } finally { @@ -191,6 +205,13 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { } } + protected String getTrace(Throwable ex) { + final StringWriter stringWriter = new StringWriter(); + final PrintWriter writer = new PrintWriter(stringWriter); + ex.printStackTrace(writer); + return stringWriter.toString(); + } + public void sendTree(TestPlan testPlan, String rootName) { myTestPlan = testPlan; diff --git a/plugins/junit5_rt/test/com/intellij/junit5/JUnit5EventsTest.java b/plugins/junit5_rt/test/com/intellij/junit5/JUnit5EventsTest.java new file mode 100644 index 000000000000..ee2fc8e0f1f0 --- /dev/null +++ b/plugins/junit5_rt/test/com/intellij/junit5/JUnit5EventsTest.java @@ -0,0 +1,81 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed 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. + */ +package com.intellij.junit5; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.engine.descriptor.MethodTestDescriptor; +import org.junit.platform.engine.TestDescriptor; +import org.junit.platform.engine.TestExecutionResult; +import org.junit.platform.engine.UniqueId; +import org.junit.platform.launcher.TestIdentifier; +import org.opentest4j.AssertionFailedError; +import org.opentest4j.MultipleFailuresError; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; + +class JUnit5EventsTest { + + @Test + void multipleFailures() throws Exception { + StringBuffer buf = new StringBuffer(); + JUnit5TestExecutionListener executionListener = new JUnit5TestExecutionListener(new PrintStream(new OutputStream() { + @Override + public void write(int b) throws IOException { + buf.append(new String(new byte[]{(byte)b})); + } + })) { + @Override + protected long getDuration() { + return 0; + } + + @Override + protected String getTrace(Throwable ex) { + return "TRACE"; + } + }; + TestDescriptor testDescriptor = new MethodTestDescriptor(UniqueId.forEngine("engine"), TestClass.class, + TestClass.class.getDeclaredMethod("test1")); + TestIdentifier identifier = TestIdentifier.from(testDescriptor); + executionListener.executionStarted(identifier); + MultipleFailuresError multipleFailuresError = new MultipleFailuresError("2 errors"); + multipleFailuresError.addFailure(new AssertionFailedError("message1", "expected1", "actual1")); + multipleFailuresError.addFailure(new AssertionFailedError("message2", "expected2", "actual2")); + executionListener.executionFinished(identifier, TestExecutionResult.failed(multipleFailuresError)); + + + Assertions.assertEquals("##teamcity[enteredTheMatrix]\n" + + "\n" + + "##teamcity[testStarted id='[engine:engine]' name='test1()']\n" + + "\n" + + "##teamcity[testFailed actual='actual1' expected='expected1' name='test1()' details='' id='|[engine:engine|]' message='']\n" + + "\n" + + "##teamcity[testFailed actual='actual2' expected='expected2' name='test1()' details='' id='|[engine:engine|]' message='']\n" + + "\n" + + "##teamcity[testFailed name='test1()' details='TRACE' id='|[engine:engine|]' message='2 errors (2 failures)|n\tmessage1|n\tmessage2']\n" + + "\n" + + "##teamcity[testFinished id='[engine:engine]' name='test1()']\n", buf.toString()); + } + + private static class TestClass { + @Test + void test1() { + } + } +} From d127f6fc16d43e5e0b01f0924d0161de7b0dea89 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 8 Sep 2016 12:34:39 +0300 Subject: [PATCH 6/6] read action --- .../execution/filters/GrCompilationErrorsFilterProvider.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/execution/filters/GrCompilationErrorsFilterProvider.kt b/plugins/groovy/src/org/jetbrains/plugins/groovy/execution/filters/GrCompilationErrorsFilterProvider.kt index 19bb35e8417d..14f12f36e048 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/execution/filters/GrCompilationErrorsFilterProvider.kt +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/execution/filters/GrCompilationErrorsFilterProvider.kt @@ -20,6 +20,7 @@ import com.intellij.execution.filters.Filter import com.intellij.execution.filters.RegexpFilter import com.intellij.execution.filters.RegexpFilter.FILE_PATH_MACROS import com.intellij.execution.filters.RegexpFilter.LINE_MACROS +import com.intellij.openapi.application.runReadAction import com.intellij.openapi.project.Project import com.intellij.psi.JavaPsiFacade import com.intellij.psi.search.GlobalSearchScope @@ -28,7 +29,7 @@ import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.GROOVY_ class GrCompilationErrorsFilterProvider : ConsoleFilterProvider { override fun getDefaultFilters(project: Project): Array { - JavaPsiFacade.getInstance(project).findClass(GROOVY_OBJECT, GlobalSearchScope.allScope(project)) ?: return Filter.EMPTY_ARRAY + runReadAction { JavaPsiFacade.getInstance(project).findClass(GROOVY_OBJECT, GlobalSearchScope.allScope(project)) } ?: return Filter.EMPTY_ARRAY return arrayOf(RegexpFilter(project, "${FILE_PATH_MACROS}: ${LINE_MACROS}.*")) } }