From 72f1aa7100fe865dba0cf7b22ec61e53bbaeeb55 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 12 May 2015 21:37:29 +0200 Subject: [PATCH] junit sm: provide test grouping for runners which doesn't contain tests before start (e.g. our TestAll) --- .../JUnitTreeByDescriptionHierarchyTest.java | 40 +++++++++++++++ .../intellij/junit4/JUnit4TestListener.java | 51 ++++++++++--------- 2 files changed, 66 insertions(+), 25 deletions(-) diff --git a/plugins/junit/test/com/intellij/execution/junit/JUnitTreeByDescriptionHierarchyTest.java b/plugins/junit/test/com/intellij/execution/junit/JUnitTreeByDescriptionHierarchyTest.java index 50f7dcf6db7d..c1f0b26d49ad 100644 --- a/plugins/junit/test/com/intellij/execution/junit/JUnitTreeByDescriptionHierarchyTest.java +++ b/plugins/junit/test/com/intellij/execution/junit/JUnitTreeByDescriptionHierarchyTest.java @@ -204,6 +204,46 @@ public class JUnitTreeByDescriptionHierarchyTest { "##teamcity[testFinished name='testName']\n"); } + @Test + public void testPackageWithoutDescriptionBefore() throws Exception { + final Description root = Description.createSuiteDescription("root"); + final ArrayList tests = new ArrayList(); + for (String className : new String[]{"a.TestA", "a.TestB"}) { + final Description aTestClass = Description.createSuiteDescription(className); + root.addChild(aTestClass); + final Description testDescription = Description.createTestDescription(className, "testName"); + aTestClass.addChild(testDescription); + tests.add(testDescription); + } + + final StringBuffer buf = new StringBuffer(); + final JUnit4TestListener sender = new JUnit4TestListener(new PrintStream(new OutputStream() { + @Override + public void write(int b) throws IOException { + buf.append(new String(new byte[]{(byte)b})); + } + })); + + sender.testRunStarted(root); + for (Description test : tests) { + sender.testStarted(test); + sender.testFinished(test); + } + sender.testRunFinished(new Result()); + + Assert.assertEquals("output: " + buf, "##teamcity[enteredTheMatrix]\n" + + "##teamcity[testSuiteStarted name='TestA' locationHint='java:suite://a.TestA']\n" + + "##teamcity[testStarted name='testName' locationHint='java:test://a.TestA.testName']\n" + + "\n" + + "##teamcity[testFinished name='testName']\n" + + "##teamcity[testSuiteFinished name='TestA']\n" + + "##teamcity[testSuiteStarted name='TestB' locationHint='java:suite://a.TestB']\n" + + "##teamcity[testStarted name='testName' locationHint='java:test://a.TestB.testName']\n" + + "\n" + + "##teamcity[testFinished name='testName']\n" + + "##teamcity[testSuiteFinished name='TestB']\n", StringUtil.convertLineSeparators(buf.toString())); + } + @Test public void testParameterizedTestsUpsideDown() throws Exception { final Description aTestClass = Description.createSuiteDescription("ATest"); diff --git a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestListener.java b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestListener.java index ff16fed6e210..d69f4a6c8de4 100644 --- a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestListener.java +++ b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestListener.java @@ -34,6 +34,7 @@ import org.junit.runner.notification.RunListener; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.lang.annotation.Annotation; import java.util.*; public class JUnit4TestListener extends RunListener { @@ -92,32 +93,29 @@ public class JUnit4TestListener extends RunListener { final String classFQN = JUnit4ReflectionUtil.getClassName(description); final List parents = (List)myParents.get(description); - if (parents != null) { + List parentsHierarchy = parents != null ? (List)parents.remove(0) : Collections.singletonList(classFQN); - List parentsHierarchy = (List)parents.remove(0); - - int idx = 0; - String currentClass; - String currentParent; - while (idx < myStartedSuites.size() && idx < parentsHierarchy.size()) { - currentClass = (String)myStartedSuites.get(idx); - currentParent = getShortName(JUnit4ReflectionUtil.getClassName((Description)parentsHierarchy.get(parentsHierarchy.size() - 1 - idx))); - if (!currentClass.equals(currentParent)) break; - idx++; - } + int idx = 0; + String currentClass; + String currentParent; + while (idx < myStartedSuites.size() && idx < parentsHierarchy.size()) { + currentClass = (String)myStartedSuites.get(idx); + currentParent = getShortName((String)parentsHierarchy.get(parentsHierarchy.size() - 1 - idx)); + if (!currentClass.equals(currentParent)) break; + idx++; + } - for (int i = myStartedSuites.size() - 1; i >= idx; i--) { - currentClass = (String)myStartedSuites.remove(i); - myPrintStream.println("##teamcity[testSuiteFinished name=\'" + escapeName(currentClass) + "\']"); - } + for (int i = myStartedSuites.size() - 1; i >= idx; i--) { + currentClass = (String)myStartedSuites.remove(i); + myPrintStream.println("##teamcity[testSuiteFinished name=\'" + escapeName(currentClass) + "\']"); + } - for (int i = idx; i < parentsHierarchy.size(); i++) { - Description parent = (Description)parentsHierarchy.get(parentsHierarchy.size() - 1 - i); - final String className = getShortName(JUnit4ReflectionUtil.getClassName(parent)); - if (!className.equals(myRootName)) { - myPrintStream.println("##teamcity[testSuiteStarted name=\'" + escapeName(className) + "\']"); - myStartedSuites.add(className); - } + for (int i = idx; i < parentsHierarchy.size(); i++) { + final String fqName = (String) parentsHierarchy.get(parentsHierarchy.size() - 1 - i); + final String className = getShortName(fqName); + if (!className.equals(myRootName)) { + myPrintStream.println("##teamcity[testSuiteStarted name=\'" + escapeName(className) + "\'" + (parents == null ? " locationHint=\'java:suite://" + escapeName(fqName) + "\'" : "") + "]"); + myStartedSuites.add(className); } } @@ -230,8 +228,11 @@ public class JUnit4TestListener extends RunListener { private void sendTree(Description description, Description parent, List currentParents) { List pParents = new ArrayList(3); pParents.addAll(currentParents); - if (parent != null && !myRootName.equals(JUnit4ReflectionUtil.getClassName(parent))) { - pParents.add(0, parent); + if (parent != null) { + final String parentClassName = JUnit4ReflectionUtil.getClassName(parent); + if (!myRootName.equals(parentClassName)) { + pParents.add(0, parentClassName); + } } String className = JUnit4ReflectionUtil.getClassName(description);