This is an automated email from the ASF dual-hosted git repository.

mbien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 404322f048 Adding ability to run a single sub-test for tests under 
jtreg.
     new 622dbf0093 Merge pull request #6067 from 
jlahoda/jtreg-run-single-test-case
404322f048 is described below

commit 404322f0484d249c3f5077bfcf9c8730c71f7a5d
Author: Jan Lahoda <[email protected]>
AuthorDate: Sat Jan 14 22:58:33 2023 +0100

    Adding ability to run a single sub-test for tests under jtreg.
---
 ide/gsf.testrunner.ui/nbproject/project.xml        |  1 +
 java/java.openjdk.project/nbproject/project.xml    | 25 +++++++++
 .../java/openjdk/jtreg/ActionProviderImpl.java     | 41 ++++++++++++--
 .../java/openjdk/jtreg/ClassPathProviderImpl.java  | 17 +++++-
 .../java/openjdk/jtreg}/TestClassInfoTask.java     |  8 +--
 .../java/openjdk/project/ActionProviderImpl.java   | 12 ++++
 .../openjdk/project/ClassPathProviderImpl.java     |  2 +-
 .../modules/java/openjdk/project/JDKProject.java   |  1 +
 .../project/UnitTestForSourceQueryImpl.java        | 64 +++++++++++++++++++++
 java/java.testrunner.ui/nbproject/project.xml      |  1 +
 java/testng.ui/nbproject/project.xml               | 14 ++++-
 .../testng/ui/actions/TestClassInfoTask.java       | 56 ++++++++++++-------
 .../testng/ui/actions/RetoucheTestBase.java        | 10 ----
 .../testng/ui/actions/TestClassInfoTaskTest.java   | 65 ++++++++++++++++++++++
 14 files changed, 273 insertions(+), 44 deletions(-)

diff --git a/ide/gsf.testrunner.ui/nbproject/project.xml 
b/ide/gsf.testrunner.ui/nbproject/project.xml
index b54d0943cf..1fd2cb0553 100644
--- a/ide/gsf.testrunner.ui/nbproject/project.xml
+++ b/ide/gsf.testrunner.ui/nbproject/project.xml
@@ -266,6 +266,7 @@
                 <friend>org.netbeans.modules.groovy.support</friend>
                 <friend>org.netbeans.modules.hudson.ui</friend>
                 <friend>org.netbeans.modules.java.lsp.server</friend>
+                <friend>org.netbeans.modules.java.openjdk.project</friend>
                 <friend>org.netbeans.modules.java.testrunner.ui</friend>
                 <friend>org.netbeans.modules.javascript.jstestdriver</friend>
                 <friend>org.netbeans.modules.javascript.karma</friend>
diff --git a/java/java.openjdk.project/nbproject/project.xml 
b/java/java.openjdk.project/nbproject/project.xml
index 52f92e18ab..1c9909c89a 100644
--- a/java/java.openjdk.project/nbproject/project.xml
+++ b/java/java.openjdk.project/nbproject/project.xml
@@ -136,6 +136,14 @@
                         <specification-version>1.64</specification-version>
                     </run-dependency>
                 </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.modules.gsf.testrunner.ui</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.34</specification-version>
+                    </run-dependency>
+                </dependency>
                 <dependency>
                     
<code-name-base>org.netbeans.modules.java.lexer</code-name-base>
                     <build-prerequisite/>
@@ -188,6 +196,14 @@
                         <specification-version>2.36</specification-version>
                     </run-dependency>
                 </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.modules.java.testrunner.ui</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.23</specification-version>
+                    </run-dependency>
+                </dependency>
                 <dependency>
                     <code-name-base>org.netbeans.modules.lexer</code-name-base>
                     <build-prerequisite/>
@@ -197,6 +213,15 @@
                         <specification-version>1.66</specification-version>
                     </run-dependency>
                 </dependency>
+                <dependency>
+                    
<code-name-base>org.netbeans.modules.parsing.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>9.26</specification-version>
+                    </run-dependency>
+                </dependency>
                 <dependency>
                     
<code-name-base>org.netbeans.modules.parsing.indexing</code-name-base>
                     <build-prerequisite/>
diff --git 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/ActionProviderImpl.java
 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/ActionProviderImpl.java
index 6bc5d24c4d..6f200eec43 100644
--- 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/ActionProviderImpl.java
+++ 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/ActionProviderImpl.java
@@ -64,6 +64,7 @@ import org.netbeans.modules.java.openjdk.project.Settings;
 import org.netbeans.spi.java.classpath.support.ClassPathSupport;
 import org.netbeans.spi.project.ActionProgress;
 import org.netbeans.spi.project.ActionProvider;
+import org.netbeans.spi.project.SingleMethod;
 import org.netbeans.spi.project.ui.CustomizerProvider2;
 import org.openide.DialogDisplayer;
 import org.openide.NotifyDescriptor;
@@ -97,7 +98,7 @@ import org.openide.windows.OutputListener;
  *
  * @author lahvac
  */
-@ServiceProvider(service=ActionProvider.class)
+@ServiceProvider(service=ActionProvider.class, position=1_000_000)
 public class ActionProviderImpl implements ActionProvider {
 
     private static final Logger LOG = 
Logger.getLogger(ActionProviderImpl.class.getName());
@@ -107,6 +108,8 @@ public class ActionProviderImpl implements ActionProvider {
         COMMAND_TEST_SINGLE,
         COMMAND_DEBUG_TEST_SINGLE,
         COMMAND_PROFILE_TEST_SINGLE,
+        SingleMethod.COMMAND_RUN_SINGLE_METHOD,
+        SingleMethod.COMMAND_DEBUG_SINGLE_METHOD
     };
 
     @Override
@@ -129,9 +132,29 @@ public class ActionProviderImpl implements ActionProvider {
                "DN_Running=Running ({0})",
                "LBL_IncorrectVersionSelectJTReg=Location of JTReg:",
                "TITLE_IncorrectVersionSelectJTReg=Version of JTReg appears to 
be incorrect, please select a correct version"})
-    public static ExecutorTask createAndRunTest(Lookup context, String 
command) {
-        final FileObject file = context.lookup(FileObject.class);
+    public static ExecutorTask createAndRunTest(Lookup context, String 
inputCommand) {
+        FileObject file;
+        String query;
+        String command;
+
+        if (SingleMethod.COMMAND_RUN_SINGLE_METHOD.equals(inputCommand) ||
+            SingleMethod.COMMAND_DEBUG_SINGLE_METHOD.equals(inputCommand)) {
+            SingleMethod singleMethod = context.lookup(SingleMethod.class);
+
+            assert singleMethod != null;
+
+            file = singleMethod.getFile();
+            query = singleMethod.getMethodName();
+            command = 
SingleMethod.COMMAND_RUN_SINGLE_METHOD.equals(inputCommand) ? 
COMMAND_TEST_SINGLE
+                                                                               
   : COMMAND_DEBUG_TEST_SINGLE;
+        } else {
+            file = context.lookup(FileObject.class);
+            query = null;
+            command = inputCommand;
+        }
+
         ensureProjectsRegistered(file);
+
         String ioName = COMMAND_DEBUG_TEST_SINGLE.equals(command) ? 
Bundle.DN_Debugging(file.getName()) : Bundle.DN_Running(file.getName());
         StopAction newStop = new StopAction();
         ReRunAction newReRun = new ReRunAction(COMMAND_TEST_SINGLE);
@@ -305,7 +328,11 @@ public class ActionProviderImpl implements ActionProvider {
                             }
                             break;
                     }
-                    options.add(FileUtil.toFile(file).getAbsolutePath());
+                    String testPath = FileUtil.toFile(file).getAbsolutePath();
+                    if (query != null) {
+                        testPath += "?" + query;
+                    }
+                    options.add(testPath);
                     try {
                         stop.started();
                         Process jtregProcess = new 
ProcessBuilder(options).start();
@@ -702,6 +729,12 @@ public class ActionProviderImpl implements ActionProvider {
     public boolean isActionEnabled(String command, Lookup context) throws 
IllegalArgumentException {
         FileObject file = context.lookup(FileObject.class);
 
+        if (file == null) {
+            SingleMethod singleMethod = context.lookup(SingleMethod.class);
+
+            file = singleMethod != null ? singleMethod.getFile() : null;
+        }
+
         if (file == null)
             return false;
         
diff --git 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/ClassPathProviderImpl.java
 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/ClassPathProviderImpl.java
index 36ce45d091..88f5f3b2d0 100644
--- 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/ClassPathProviderImpl.java
+++ 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/ClassPathProviderImpl.java
@@ -77,10 +77,21 @@ public class ClassPathProviderImpl implements 
ClassPathProvider {
                 if (javac) {
                     ClassPath langtoolsCP = ClassPath.getClassPath(keyRoot, 
ClassPath.COMPILE);
                     Library testngLib = 
LibraryManager.getDefault().getLibrary("testng");
+                    Library junit5Lib = 
LibraryManager.getDefault().getLibrary("junit_5");
 
-                    if (testngLib != null) {
-                        return 
ClassPathSupport.createProxyClassPath(ClassPathSupport.createClassPath(testngLib.getContent("classpath").toArray(new
 URL[0])),
-                                                                     
langtoolsCP);
+                    if (testngLib != null || junit5Lib != null) {
+                        List<ClassPath> parts = new ArrayList<>();
+
+                        if (testngLib != null) {
+                            
parts.add(ClassPathSupport.createClassPath(testngLib.getContent("classpath").toArray(new
 URL[0])));
+                        }
+                        if (junit5Lib != null) {
+                            
parts.add(ClassPathSupport.createClassPath(junit5Lib.getContent("classpath").toArray(new
 URL[0])));
+                        }
+
+                        parts.add(langtoolsCP);
+
+                        return 
ClassPathSupport.createProxyClassPath(parts.toArray(new ClassPath[0]));
                     }
 
                     if (langtoolsCP == null)
diff --git 
a/java/testng.ui/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTask.java
 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/TestClassInfoTask.java
similarity index 98%
copy from 
java/testng.ui/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTask.java
copy to 
java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/TestClassInfoTask.java
index eddfc91564..f2df2ea03a 100644
--- 
a/java/testng.ui/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTask.java
+++ 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/jtreg/TestClassInfoTask.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.netbeans.modules.testng.ui.actions;
+package org.netbeans.modules.java.openjdk.jtreg;
 
 import com.sun.source.tree.ClassTree;
 import com.sun.source.tree.MethodTree;
@@ -61,11 +61,11 @@ public final class TestClassInfoTask implements 
CancellableTask<CompilationContr
     private String className;
     private String methodName;
     private FileObject fo;
-    
+
     /**
      * <b>DO NOT USE!</b> Package private due to use in tests
      */
-    static String ANNOTATION = "org.testng.annotations.Test"; //NOI18N
+    static String ANNOTATION = "toolbox.TestRunner.Test"; //NOI18N
 
     TestClassInfoTask(int caretPosition) {
         this.caretPosition = caretPosition;
@@ -107,7 +107,7 @@ public final class TestClassInfoTask implements 
CancellableTask<CompilationContr
     String getPackageName() {
         return packageName;
     }
-    
+
     FileObject getFileObject() {
         return fo;
     }
diff --git 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/ActionProviderImpl.java
 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/ActionProviderImpl.java
index b39c5683b8..cba40fd7d7 100644
--- 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/ActionProviderImpl.java
+++ 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/ActionProviderImpl.java
@@ -38,6 +38,7 @@ import org.netbeans.modules.java.openjdk.common.ShortcutUtils;
 import org.netbeans.spi.java.classpath.support.ClassPathSupport;
 import org.netbeans.spi.project.ActionProgress;
 import org.netbeans.spi.project.ActionProvider;
+import org.netbeans.spi.project.SingleMethod;
 import org.netbeans.spi.project.ui.support.ProjectSensitiveActions;
 import org.openide.execution.ExecutorTask;
 import org.openide.filesystems.FileObject;
@@ -151,6 +152,8 @@ public class ActionProviderImpl implements ActionProvider {
                     filteredActions.retainAll(Arrays.asList(actions));
                     filteredActions.add(COMMAND_BUILD_GENERIC_FAST);
                     filteredActions.add(COMMAND_PROFILE_TEST_SINGLE);
+                    
filteredActions.add(SingleMethod.COMMAND_RUN_SINGLE_METHOD);
+                    
filteredActions.add(SingleMethod.COMMAND_DEBUG_SINGLE_METHOD);
                     supported = filteredActions.toArray(new String[0]);
                     break;
                 }
@@ -178,6 +181,15 @@ public class ActionProviderImpl implements ActionProvider {
                 }
             }
         }
+        if (SingleMethod.COMMAND_RUN_SINGLE_METHOD.equals(command) ||
+            SingleMethod.COMMAND_DEBUG_SINGLE_METHOD.equals(command)) {
+            for (ActionProvider ap : 
Lookup.getDefault().lookupAll(ActionProvider.class)) {
+                if (new 
HashSet<>(Arrays.asList(ap.getSupportedActions())).contains(command) && 
ap.isActionEnabled(command, context)) {
+                    ap.invokeAction(command, context);
+                    return ;
+                }
+            }
+        }
         FileObject scriptFO = script;
         Settings settings = project.getLookup().lookup(Settings.class);
         Properties props = new Properties();
diff --git 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/ClassPathProviderImpl.java
 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/ClassPathProviderImpl.java
index bca41f058d..dbecca5936 100644
--- 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/ClassPathProviderImpl.java
+++ 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/ClassPathProviderImpl.java
@@ -194,7 +194,7 @@ public class ClassPathProviderImpl implements 
ClassPathProvider {
         this.repository = repository;
     }
 
-    private static final String[] TEST_LIBRARIES = new String[] {"testng", 
"junit_4"};
+    private static final String[] TEST_LIBRARIES = new String[] {"testng", 
"junit_4", "junit_5"};
 
     private static URL projectDir2FakeTarget(FileObject projectDir) throws 
MalformedURLException {
         return 
FileUtil.getArchiveRoot(projectDir.toURI().resolve("fake-target.jar").toURL());
diff --git 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/JDKProject.java
 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/JDKProject.java
index 35d6396617..4e98d449e2 100644
--- 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/JDKProject.java
+++ 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/JDKProject.java
@@ -222,6 +222,7 @@ public class JDKProject implements Project {
                                     new Settings(this),
                                     new BinaryForSourceQueryImpl(this, 
cpp.getSourceCP()),
                                     
CProjectConfigurationProviderImpl.create(this),
+                                    new UnitTestForSourceQueryImpl(this),
                                     this);
         this.lookup = LookupProviderSupport.createCompositeLookup(base, 
"Projects/" + PROJECT_KEY + "/Lookup");
         } catch (Throwable t) {
diff --git 
a/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/UnitTestForSourceQueryImpl.java
 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/UnitTestForSourceQueryImpl.java
new file mode 100644
index 0000000000..8bba362c33
--- /dev/null
+++ 
b/java/java.openjdk.project/src/org/netbeans/modules/java/openjdk/project/UnitTestForSourceQueryImpl.java
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+package org.netbeans.modules.java.openjdk.project;
+
+import java.net.URL;
+import java.util.Arrays;
+import org.netbeans.api.java.project.JavaProjectConstants;
+import org.netbeans.api.project.ProjectUtils;
+import org.netbeans.api.project.SourceGroup;
+import org.netbeans.modules.java.openjdk.project.JDKProject;
+import 
org.netbeans.spi.java.queries.MultipleRootsUnitTestForSourceQueryImplementation;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+
+/**
+ *
+ * @author lahvac
+ */
+public class UnitTestForSourceQueryImpl implements 
MultipleRootsUnitTestForSourceQueryImplementation {
+
+    private final JDKProject prj;
+
+    public UnitTestForSourceQueryImpl(JDKProject prj) {
+        this.prj = prj;
+    }
+
+    @Override
+    public URL[] findUnitTests(FileObject source) {
+        SourceGroup[] groups = ProjectUtils.getSources(prj)
+                                           
.getSourceGroups(SourcesImpl.SOURCES_TYPE_JDK_PROJECT_TESTS);
+        return notInReturn(source, groups);
+    }
+
+    @Override
+    public URL[] findSources(FileObject unitTest) {
+        SourceGroup[] groups = ProjectUtils.getSources(prj)
+                                           
.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
+        return notInReturn(unitTest, groups);
+    }
+
+    private URL[] notInReturn(FileObject file, SourceGroup[] groups) {
+        return Arrays.stream(groups)
+                     .map(sg -> sg.getRootFolder())
+                     .filter(root -> FileUtil.isParentOf(root, file) || root 
== file)
+                     .map(f -> f.toURL())
+                     .toArray(s -> new URL[s]);
+    }
+}
diff --git a/java/java.testrunner.ui/nbproject/project.xml 
b/java/java.testrunner.ui/nbproject/project.xml
index e9147c5546..30b1e91f25 100644
--- a/java/java.testrunner.ui/nbproject/project.xml
+++ b/java/java.testrunner.ui/nbproject/project.xml
@@ -197,6 +197,7 @@
             <friend-packages>
                 <friend>org.netbeans.modules.gradle.test</friend>
                 <friend>org.netbeans.modules.java.lsp.server</friend>
+                <friend>org.netbeans.modules.java.openjdk.project</friend>
                 <friend>org.netbeans.modules.junit.ant.ui</friend>
                 <friend>org.netbeans.modules.junit.ui</friend>
                 <friend>org.netbeans.modules.maven.junit.ui</friend>
diff --git a/java/testng.ui/nbproject/project.xml 
b/java/testng.ui/nbproject/project.xml
index 1bbbafb617..971beaa66b 100644
--- a/java/testng.ui/nbproject/project.xml
+++ b/java/testng.ui/nbproject/project.xml
@@ -456,14 +456,24 @@
                         <compile-dependency/>
                         <test/>
                     </test-dependency>
+                    <test-dependency>
+                        
<code-name-base>org.netbeans.modules.parsing.indexing</code-name-base>
+                        <test/>
+                    </test-dependency>
                     <test-dependency>
                         
<code-name-base>org.netbeans.modules.parsing.lucene</code-name-base>
                         <compile-dependency/>
                         <test/>
                     </test-dependency>
+                    <test-dependency>
+                        
<code-name-base>org.netbeans.modules.parsing.nb</code-name-base>
+                    </test-dependency>
                     <test-dependency>
                         
<code-name-base>org.netbeans.modules.progress.ui</code-name-base>
                     </test-dependency>
+                    <test-dependency>
+                        
<code-name-base>org.netbeans.modules.projectapi.nb</code-name-base>
+                    </test-dependency>
                     <test-dependency>
                         
<code-name-base>org.netbeans.modules.projectui</code-name-base>
                         <compile-dependency/>
@@ -498,12 +508,12 @@
                         <code-name-base>org.openide.text</code-name-base>
                     </test-dependency>
                     <test-dependency>
-                        <code-name-base>org.openide.util.ui</code-name-base>
+                        
<code-name-base>org.openide.util.lookup</code-name-base>
                         <compile-dependency/>
                         <test/>
                     </test-dependency>
                     <test-dependency>
-                        
<code-name-base>org.openide.util.lookup</code-name-base>
+                        <code-name-base>org.openide.util.ui</code-name-base>
                         <compile-dependency/>
                         <test/>
                     </test-dependency>
diff --git 
a/java/testng.ui/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTask.java
 
b/java/testng.ui/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTask.java
index eddfc91564..5a9bb9b781 100644
--- 
a/java/testng.ui/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTask.java
+++ 
b/java/testng.ui/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTask.java
@@ -34,6 +34,8 @@ import java.util.stream.Collectors;
 import javax.lang.model.element.AnnotationMirror;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.Modifier;
+import javax.lang.model.element.QualifiedNameable;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.util.Elements;
 import javax.swing.text.BadLocationException;
@@ -66,6 +68,7 @@ public final class TestClassInfoTask implements 
CancellableTask<CompilationContr
      * <b>DO NOT USE!</b> Package private due to use in tests
      */
     static String ANNOTATION = "org.testng.annotations.Test"; //NOI18N
+    static String TESTNG_ANNOTATION_PACKAGE = "org.testng.annotations"; 
//NOI18N
 
     TestClassInfoTask(int caretPosition) {
         this.caretPosition = caretPosition;
@@ -139,39 +142,52 @@ public final class TestClassInfoTask implements 
CancellableTask<CompilationContr
         }
         TypeElement typeElement = (TypeElement) info.getTrees().getElement(new 
TreePath(new TreePath(info.getCompilationUnit()), clazz));
         Elements elements = info.getElements();
+        boolean hasClassLevelAnnotation = hasTestNGTestAnnotation(elements, 
typeElement);
         List<TestMethod> result = new ArrayList<>();
         for (TreePath tp : methods) {
             if (cancel.get()) {
                 return null;
             }
             Element element = info.getTrees().getElement(tp);
-            if (element != null) {
-                List<? extends AnnotationMirror> allAnnotationMirrors = 
elements.getAllAnnotationMirrors(element);
-                for (Iterator<? extends AnnotationMirror> it = 
allAnnotationMirrors.iterator(); it.hasNext();) {
-                    AnnotationMirror annotationMirror = it.next();
-                    TypeElement annTypeElement = (TypeElement) 
annotationMirror.getAnnotationType().asElement();
-                    if 
(annTypeElement.getQualifiedName().contentEquals(ANNOTATION)) {
-                        String mn = element.getSimpleName().toString();
-                        SourcePositions sp = 
info.getTrees().getSourcePositions();
-                        int start = (int) 
sp.getStartPosition(tp.getCompilationUnit(), tp.getLeaf());
-                        int preferred = 
info.getTreeUtilities().findNameSpan((MethodTree) tp.getLeaf())[0];
-                        int end = (int) 
sp.getEndPosition(tp.getCompilationUnit(), tp.getLeaf());
-                        Document doc = 
info.getSnapshot().getSource().getDocument(false);
-                        try {
-                            result.add(new 
TestMethod(typeElement.getQualifiedName().toString(), new 
SingleMethod(fileObject, mn),
-                                    doc != null ? doc.createPosition(start) : 
new SimplePosition(start),
-                                    doc != null ? 
doc.createPosition(preferred) : new SimplePosition(preferred),
-                                    doc != null ? doc.createPosition(end) : 
new SimplePosition(end)));
-                        } catch (BadLocationException ex) {
-                            //ignore
+            if (element != null && element.getKind() == ElementKind.METHOD) {
+                if (hasTestNGTestAnnotation(elements, element) ||
+                    (hasClassLevelAnnotation && 
element.getModifiers().contains(Modifier.PUBLIC) &&
+                     !hasTestNGAnnotation(elements, element))) {
+                    String mn = element.getSimpleName().toString();
+                    SourcePositions sp = info.getTrees().getSourcePositions();
+                    int start = (int) 
sp.getStartPosition(tp.getCompilationUnit(), tp.getLeaf());
+                    int preferred = 
info.getTreeUtilities().findNameSpan((MethodTree) tp.getLeaf())[0];
+                    int end = (int) sp.getEndPosition(tp.getCompilationUnit(), 
tp.getLeaf());
+                    Document doc = 
info.getSnapshot().getSource().getDocument(false);
+                    try {
+                        result.add(new 
TestMethod(typeElement.getQualifiedName().toString(), new 
SingleMethod(fileObject, mn),
+                                doc != null ? doc.createPosition(start) : new 
SimplePosition(start),
+                                doc != null ? doc.createPosition(preferred) : 
new SimplePosition(preferred),
+                                doc != null ? doc.createPosition(end) : new 
SimplePosition(end)));
+                    } catch (BadLocationException ex) {
+                        //ignore
                     }
                 }
             }
         }
-        }
         return result;
     }
 
+    private static boolean hasTestNGTestAnnotation(Elements elements, Element 
element) {
+        return elements.getAllAnnotationMirrors(element)
+                       .stream()
+                       .map(am -> (TypeElement) 
am.getAnnotationType().asElement())
+                       .anyMatch(annTypeElement -> 
annTypeElement.getQualifiedName().contentEquals(ANNOTATION));
+    }
+
+    private static boolean hasTestNGAnnotation(Elements elements, Element 
element) {
+        return elements.getAllAnnotationMirrors(element)
+                       .stream()
+                       .map(am -> (TypeElement) 
am.getAnnotationType().asElement())
+                       .map(te -> (QualifiedNameable) te.getEnclosingElement())
+                       .anyMatch(annTypeElement -> 
annTypeElement.getQualifiedName().contentEquals(TESTNG_ANNOTATION_PACKAGE));
+    }
+
     @ServiceProvider(service=Factory.class)
     public static final class ComputeTestMethodsImpl implements Factory {
 
diff --git 
a/java/testng.ui/test/unit/src/org/netbeans/modules/testng/ui/actions/RetoucheTestBase.java
 
b/java/testng.ui/test/unit/src/org/netbeans/modules/testng/ui/actions/RetoucheTestBase.java
index e5e9268cc1..11afdedbc4 100644
--- 
a/java/testng.ui/test/unit/src/org/netbeans/modules/testng/ui/actions/RetoucheTestBase.java
+++ 
b/java/testng.ui/test/unit/src/org/netbeans/modules/testng/ui/actions/RetoucheTestBase.java
@@ -74,16 +74,6 @@ public class RetoucheTestBase extends NbTestCase {
                 new String[]{},
                 new Object[]{loader, cpp});
         testFO = FileUtil.createFolder(src, 
"sample/pkg/").createData("Test.java");
-        TestUtilities.copyStringToFile(testFO,
-                "package sample.pkg;\n" +
-                "\n" +
-                "public class Test {\n" +
-                "\n" +
-                "    @Deprecated\n" +
-                "    void method() {\n" +
-                "    }\n" +
-                "\n" +
-                "}\n");
     }
 
     protected FileObject getTestFO() {
diff --git 
a/java/testng.ui/test/unit/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTaskTest.java
 
b/java/testng.ui/test/unit/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTaskTest.java
index 4eeb3a8a32..060cda5417 100644
--- 
a/java/testng.ui/test/unit/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTaskTest.java
+++ 
b/java/testng.ui/test/unit/src/org/netbeans/modules/testng/ui/actions/TestClassInfoTaskTest.java
@@ -18,8 +18,11 @@
  */
 package org.netbeans.modules.testng.ui.actions;
 
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.netbeans.api.java.source.JavaSource;
+import org.netbeans.api.java.source.JavaSource.Phase;
 import org.netbeans.api.java.source.TestUtilities;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Test;
 
@@ -32,8 +35,20 @@ public class TestClassInfoTaskTest extends RetoucheTestBase {
 
     static {
         TestClassInfoTask.ANNOTATION = "java.lang.Deprecated";
+        TestClassInfoTask.TESTNG_ANNOTATION_PACKAGE = "java.lang";
     }
 
+    private static final String DEFAULT_TEST_DATA =
+        "package sample.pkg;\n" +
+        "\n" +
+        "public class Test {\n" +
+        "\n" +
+        "    @Deprecated\n" +
+        "    void method() {\n" +
+        "    }\n" +
+        "\n" +
+        "}\n";
+
     public TestClassInfoTaskTest(String testName) {
         super(testName);
     }
@@ -44,6 +59,7 @@ public class TestClassInfoTaskTest extends RetoucheTestBase {
     }
 
     public void testCursorInMethod() throws Exception {
+        TestUtilities.copyStringToFile(getTestFO(), DEFAULT_TEST_DATA);
         JavaSource src = JavaSource.forFileObject(getTestFO());
         TestClassInfoTask task = new TestClassInfoTask(70);
         src.runUserActionTask(task, true);
@@ -53,6 +69,7 @@ public class TestClassInfoTaskTest extends RetoucheTestBase {
     }
 
     public void testCursorInClass() throws Exception {
+        TestUtilities.copyStringToFile(getTestFO(), DEFAULT_TEST_DATA);
         JavaSource src = JavaSource.forFileObject(getTestFO());
         TestClassInfoTask task = new TestClassInfoTask(42);
         src.runUserActionTask(task, true);
@@ -62,6 +79,7 @@ public class TestClassInfoTaskTest extends RetoucheTestBase {
     }
 
     public void testCursorInClass2() throws Exception {
+        TestUtilities.copyStringToFile(getTestFO(), DEFAULT_TEST_DATA);
         JavaSource src = JavaSource.forFileObject(getTestFO());
         TestClassInfoTask task = new TestClassInfoTask(0);
         src.runUserActionTask(task, true);
@@ -71,6 +89,7 @@ public class TestClassInfoTaskTest extends RetoucheTestBase {
     }
 
     public void testCursorInClass3() throws Exception {
+        TestUtilities.copyStringToFile(getTestFO(), DEFAULT_TEST_DATA);
         JavaSource src = JavaSource.forFileObject(getTestFO());
         TestClassInfoTask task = new TestClassInfoTask(87);
         src.runUserActionTask(task, true);
@@ -95,4 +114,50 @@ public class TestClassInfoTaskTest extends RetoucheTestBase 
{
         assertEquals("", task.getPackageName());
         assertEquals("Test", task.getClassName());
     }
+
+    public void testClassAnnotated1() throws Exception {
+        String code = "package test;\n" +
+                      "@Deprecated\n" +
+                      "public class Test {\n" +
+                      "    public void method1() {\n" +
+                      "        //test1\n" +
+                      "    }\n" +
+                      "    @SuppressWarnings(\"\")\n" +
+                      "    public void method2() {\n" +
+                      "        //test2\n" +
+                      "    }\n" +
+                      "    void method3() {\n" +
+                      "        //test3\n" +
+                      "    }\n" +
+                      "    public static void method4() {\n" +
+                      "        //test4\n" +
+                      "    }\n" +
+                      "}\n";
+        TestUtilities.copyStringToFile(getTestFO(), code);
+        JavaSource src = JavaSource.forFileObject(getTestFO());
+        TestClassInfoTask task1 = new 
TestClassInfoTask(code.indexOf("//test1"));
+        src.runUserActionTask(task1, true);
+        assertEquals("method1", task1.getMethodName());
+        assertEquals("test", task1.getPackageName());
+        assertEquals("Test", task1.getClassName());
+        TestClassInfoTask task2 = new 
TestClassInfoTask(code.indexOf("//test2"));
+        src.runUserActionTask(task2, true);
+        assertNull(task2.getMethodName());
+        assertEquals("test", task2.getPackageName());
+        assertEquals("Test", task2.getClassName());
+        TestClassInfoTask task3 = new 
TestClassInfoTask(code.indexOf("//test3"));
+        src.runUserActionTask(task3, true);
+        assertNull(task3.getMethodName());
+        assertEquals("test", task3.getPackageName());
+        assertEquals("Test", task3.getClassName());
+        TestClassInfoTask task4 = new 
TestClassInfoTask(code.indexOf("//test4"));
+        src.runUserActionTask(task4, true);
+        assertEquals("method4", task4.getMethodName());
+        assertEquals("test", task4.getPackageName());
+        assertEquals("Test", task4.getClassName());
+        src.runUserActionTask(cc -> {
+            cc.toPhase(Phase.ELEMENTS_RESOLVED);
+            assertEquals(2, TestClassInfoTask.computeTestMethods(cc, new 
AtomicBoolean(), -1).size());
+        }, true);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists


Reply via email to