From 127ac1f9e41a2fd712d8354c7ce02dc09cfdeb6b Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 7 Oct 2016 17:39:58 +0200 Subject: [PATCH] junit 5: test factory method navigation with dynamic tests navigation to parent methods (IDEA-162200) --- .../testframework/JavaTestLocator.java | 54 +++++++++++-------- .../junit5/JUnit5TestExecutionListener.java | 12 +++-- .../com/intellij/junit5/JUnit5EventsTest.java | 4 +- 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/testframework/JavaTestLocator.java b/java/execution/impl/src/com/intellij/execution/testframework/JavaTestLocator.java index 3159a8ac56bb..291b3888b779 100644 --- a/java/execution/impl/src/com/intellij/execution/testframework/JavaTestLocator.java +++ b/java/execution/impl/src/com/intellij/execution/testframework/JavaTestLocator.java @@ -58,34 +58,46 @@ public class JavaTestLocator implements SMTestLocator { results = ContainerUtil.newSmartList(); results.add(createClassNavigatable(paramName, aClass)); } + else { + results = collectMethodNavigatables(path, project, scope, paramName); + } } else if (TEST_PROTOCOL.equals(protocol)) { - String className = StringUtil.getPackageName(path); - if (!StringUtil.isEmpty(className)) { - String methodName = StringUtil.getShortName(path); - PsiClass aClass = ClassUtil.findPsiClass(PsiManager.getInstance(project), className, null, true, scope); - if (aClass != null) { - results = ContainerUtil.newSmartList(); - if (methodName.trim().equals(aClass.getName())) { - results.add(createClassNavigatable(paramName, aClass)); - } - else { - PsiMethod[] methods = aClass.findMethodsByName(methodName.trim(), true); - if (methods.length > 0) { - for (PsiMethod method : methods) { - results.add(paramName != null ? new PsiMemberParameterizedLocation(project, method, aClass, paramName) - : MethodLocation.elementInClass(method, aClass)); - } - } - } - } - } + results = collectMethodNavigatables(path, project, scope, paramName); } return results; } - private Location createClassNavigatable(String paramName, @NotNull PsiClass aClass) { + private static List collectMethodNavigatables(@NotNull String path, + @NotNull Project project, + @NotNull GlobalSearchScope scope, + String paramName) { + List results = Collections.emptyList(); + String className = StringUtil.getPackageName(path); + if (!StringUtil.isEmpty(className)) { + String methodName = StringUtil.getShortName(path); + PsiClass aClass = ClassUtil.findPsiClass(PsiManager.getInstance(project), className, null, true, scope); + if (aClass != null) { + results = ContainerUtil.newSmartList(); + if (methodName.trim().equals(aClass.getName())) { + results.add(createClassNavigatable(paramName, aClass)); + } + else { + PsiMethod[] methods = aClass.findMethodsByName(methodName.trim(), true); + if (methods.length > 0) { + for (PsiMethod method : methods) { + results.add(paramName != null ? new PsiMemberParameterizedLocation(project, method, aClass, paramName) + : MethodLocation.elementInClass(method, aClass)); + } + } + } + } + } + return results; + } + + private static Location createClassNavigatable(String paramName, @NotNull PsiClass aClass) { return paramName != null ? PsiMemberParameterizedLocation.getParameterizedLocation(aClass, paramName) : new PsiLocation<>(aClass.getProject(), aClass); } diff --git a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java index 5878e7678eca..244fbc48b32b 100644 --- a/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java +++ b/plugins/junit5_rt/src/com/intellij/junit5/JUnit5TestExecutionListener.java @@ -178,7 +178,7 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { } private void testStarted(TestIdentifier testIdentifier) { - myPrintStream.println("\n##teamcity[testStarted" + idAndName(testIdentifier) + "\']"); + myPrintStream.println("\n##teamcity[testStarted" + idAndName(testIdentifier) + getLocationHint(testIdentifier) + "\']"); } private void testFinished(TestIdentifier testIdentifier, long duration) { @@ -258,17 +258,23 @@ public class JUnit5TestExecutionListener implements TestExecutionListener { private void sendTreeUnderRoot(TestPlan testPlan, TestIdentifier root) { final String idAndName = idAndName(root); if (root.isContainer()) { - myPrintStream.println("##teamcity[suiteTreeStarted" + idAndName + "\' locationHint=\'java:suite://" + escapeName(getClassName(root)) + "\']"); + myPrintStream.println("##teamcity[suiteTreeStarted" + idAndName + getLocationHint(root) + "\']"); for (TestIdentifier childIdentifier : testPlan.getChildren(root)) { sendTreeUnderRoot(testPlan, childIdentifier); } myPrintStream.println("##teamcity[suiteTreeEnded" + idAndName + "\']"); } else if (root.isTest()) { - myPrintStream.println("##teamcity[suiteTreeNode " + idAndName + "\' locationHint=\'java:test://" + escapeName(getClassName(root) + "." + getMethodName(root)) + "\']"); + myPrintStream.println("##teamcity[suiteTreeNode " + idAndName + getLocationHint(root) + "\']"); } } + private String getLocationHint(TestIdentifier root) { + final String className = getClassName(root); + final String methodName = getMethodName(root); + return "\' locationHint=\'java:" + (root.isTest() ? "test" : "suite") + "://" + escapeName(className + (methodName != null ? "." + methodName : "")); + } + private static String escapeName(String str) { return MapSerializerUtil.escapeStr(str, MapSerializerUtil.STD_ESCAPER); 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 3a281ead15f6..dd714eea98e5 100644 --- a/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java +++ b/plugins/junit5_rt_tests/test/com/intellij/junit5/JUnit5EventsTest.java @@ -80,7 +80,7 @@ class JUnit5EventsTest { Assertions.assertEquals("##teamcity[enteredTheMatrix]\n" + "\n" + - "##teamcity[testStarted id='[engine:engine]' name='test1()']\n" + + "##teamcity[testStarted id='[engine:engine]' name='test1()' locationHint='java:test://com.intellij.junit5.JUnit5EventsTest$TestClass.test1']\n" + "\n" + "##teamcity[testFailed actual='actual1' expected='expected1' name='test1()' details='' id='|[engine:engine|]' message='']\n" + "\n" + @@ -106,7 +106,7 @@ class JUnit5EventsTest { "##teamcity[treeEnded]\n" + "##teamcity[testSuiteStarted id='[engine:engine1]' name='brokenStream()']\n" + "\n" + - "##teamcity[testStarted id='[engine:engine1]' name='brokenStream()']\n" + + "##teamcity[testStarted id='[engine:engine1]' name='brokenStream()' locationHint='java:suite://com.intellij.junit5.JUnit5EventsTest$TestClass.brokenStream']\n" + "\n" + "##teamcity[testFailed name='brokenStream()' details='TRACE' id='|[engine:engine1|]' error='true' message='']\n" + "\n" +