diff --git a/java/execution/impl/src/com/intellij/execution/testframework/ResetConfigurationModuleAdapter.java b/java/execution/impl/src/com/intellij/execution/testframework/ResetConfigurationModuleAdapter.java new file mode 100644 index 000000000000..7e12f3c4a5eb --- /dev/null +++ b/java/execution/impl/src/com/intellij/execution/testframework/ResetConfigurationModuleAdapter.java @@ -0,0 +1,128 @@ +/* + * Copyright 2000-2015 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.execution.testframework; + +import com.intellij.execution.CommonJavaRunConfigurationParameters; +import com.intellij.execution.ExecutionException; +import com.intellij.execution.Executor; +import com.intellij.execution.configurations.JavaRunConfigurationModule; +import com.intellij.execution.configurations.ModuleBasedConfiguration; +import com.intellij.execution.executors.DefaultDebugExecutor; +import com.intellij.execution.executors.DefaultRunExecutor; +import com.intellij.execution.runners.ExecutionEnvironmentBuilder; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.module.ModuleUtilCore; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.ui.popup.Balloon; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.wm.ToolWindowId; +import com.intellij.openapi.wm.ToolWindowManager; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiPackage; +import com.intellij.ui.HyperlinkAdapter; +import com.intellij.util.Function; + +import javax.swing.event.HyperlinkEvent; +import java.util.HashSet; +import java.util.Set; + +public class ResetConfigurationModuleAdapter extends HyperlinkAdapter { + private static final Logger LOG = Logger.getInstance("#" + ResetConfigurationModuleAdapter.class); + private final Project myProject; + private final boolean myIsDebug; + private final ToolWindowManager myToolWindowManager; + private final String myTestRunDebugId; + private final ModuleBasedConfiguration myConfiguration; + + public ResetConfigurationModuleAdapter(ModuleBasedConfiguration configuration, final Project project, + final boolean isDebug, + final ToolWindowManager toolWindowManager, + final String testRunDebugId) { + myProject = project; + myIsDebug = isDebug; + myToolWindowManager = toolWindowManager; + myTestRunDebugId = testRunDebugId; + myConfiguration = configuration; + } + + public static + & CommonJavaRunConfigurationParameters> + boolean tryWithAnotherModule(T configuration, boolean isDebug) { + final String packageName = configuration.getPackage(); + if (packageName == null) return false; + final Project project = configuration.getProject(); + final PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage(packageName); + if (aPackage == null) return false; + final Module module = configuration.getConfigurationModule().getModule(); + if (module == null) return false; + final Set modulesWithPackage = new HashSet(); + final PsiDirectory[] directories = aPackage.getDirectories(); + for (PsiDirectory directory : directories) { + final Module currentModule = ModuleUtilCore.findModuleForFile(directory.getVirtualFile(), project); + if (module != currentModule && currentModule != null) { + modulesWithPackage.add(currentModule); + } + } + if (!modulesWithPackage.isEmpty()) { + final String testRunDebugId = isDebug ? ToolWindowId.DEBUG : ToolWindowId.RUN; + final ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project); + final Function moduleNameRef = new Function() { + @Override + public String fun(Module module) { + final String moduleName = module.getName(); + return "" + moduleName + ""; + } + }; + String message = "Tests were not found in module \"" + module.getName() + "\".\n" + + "Use "; + if (modulesWithPackage.size() == 1) { + message += "module \"" + moduleNameRef.fun(modulesWithPackage.iterator().next()) + "\" "; + } + else { + message += "one of\n" + StringUtil.join(modulesWithPackage, moduleNameRef, "\n") + "\n"; + } + message += "instead"; + toolWindowManager.notifyByBalloon(testRunDebugId, MessageType.WARNING, message, null, + new ResetConfigurationModuleAdapter(configuration, project, isDebug, toolWindowManager, testRunDebugId)); + return true; + } + return false; + } + + @Override + protected void hyperlinkActivated(HyperlinkEvent e) { + final Module moduleByName = ModuleManager.getInstance(myProject).findModuleByName(e.getDescription()); + if (moduleByName != null) { + myConfiguration.getConfigurationModule().setModule(moduleByName); + try { + Executor executor = myIsDebug ? DefaultDebugExecutor.getDebugExecutorInstance() + : DefaultRunExecutor.getRunExecutorInstance(); + ExecutionEnvironmentBuilder.create(myProject, executor, myConfiguration).contentToReuse(null).buildAndExecute(); + Balloon balloon = myToolWindowManager.getToolWindowBalloon(myTestRunDebugId); + if (balloon != null) { + balloon.hide(); + } + } + catch (ExecutionException e1) { + LOG.error(e1); + } + } + } +} diff --git a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java index 3c365c6eff2d..3ff5c9ec10fe 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java @@ -19,48 +19,32 @@ package com.intellij.execution.junit; import com.intellij.execution.*; import com.intellij.execution.configurations.RuntimeConfigurationException; import com.intellij.execution.configurations.RuntimeConfigurationWarning; -import com.intellij.execution.executors.DefaultDebugExecutor; -import com.intellij.execution.executors.DefaultRunExecutor; import com.intellij.execution.junit2.ui.model.JUnitRunningModel; import com.intellij.execution.junit2.ui.properties.JUnitConsoleProperties; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.runners.ExecutionEnvironment; -import com.intellij.execution.runners.ExecutionEnvironmentBuilder; -import com.intellij.execution.testframework.SearchForTestsTask; -import com.intellij.execution.testframework.SourceScope; -import com.intellij.execution.testframework.TestSearchScope; +import com.intellij.execution.testframework.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.MessageType; -import com.intellij.openapi.ui.popup.Balloon; import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.wm.ToolWindowId; -import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PackageScope; import com.intellij.refactoring.listeners.RefactoringElementListener; -import com.intellij.ui.HyperlinkAdapter; +import com.intellij.util.Consumer; import com.intellij.util.Function; import gnu.trove.THashSet; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.event.HyperlinkEvent; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.util.Collection; -import java.util.HashSet; -import java.util.Set; public class TestPackage extends TestObject { protected BackgroundableProcessIndicator mySearchForTestsIndicator; @@ -112,9 +96,9 @@ public class TestPackage extends TestObject { return null; } - return findTestsWithProgress(new FindCallback() { + return findTestsWithProgress(new Consumer>() { @Override - public void found(@NotNull final Collection classes) { + public void consume(Collection classes) { try { addClassesListToJavaParameters(classes, new Function() { @Override @@ -247,143 +231,38 @@ public class TestPackage extends TestObject { } } - private MySearchForTestsTask findTestsWithProgress(final FindCallback callback, final TestClassFilter classFilter) { - if (isSyncSearch()) { + private SearchForTestsTask findTestsWithProgress(final Consumer> callback, final TestClassFilter classFilter) { + if (ApplicationManager.getApplication().isUnitTestMode()) { THashSet classes = new THashSet(); ConfigurationUtil.findAllTestClasses(classFilter, classes); - callback.found(classes); + callback.consume(classes); return null; } final THashSet classes = new THashSet(); - final MySearchForTestsTask task = - new MySearchForTestsTask(classFilter, classes, callback, myServerSocket); + final SearchForTestsTask task = + new SearchForTestsTask(classFilter.getProject(), myServerSocket) { + @Override + protected void search() { + classes.clear(); + ConfigurationUtil.findAllTestClasses(classFilter, classes); + } + + @Override + protected void onFound() { + myFoundTests = !classes.isEmpty(); + callback.consume(classes); + } + }; mySearchForTestsIndicator = new BackgroundableProcessIndicator(task); ProgressManager.getInstance().runProcessWithProgressAsynchronously(task, mySearchForTestsIndicator); return task; } - private static boolean isSyncSearch() { - return ApplicationManager.getApplication().isUnitTestMode(); - } - @Override protected void notifyByBalloon(JUnitRunningModel model, boolean started, final JUnitConsoleProperties consoleProperties) { - if (myFoundTests) { + if (myFoundTests || !ResetConfigurationModuleAdapter.tryWithAnotherModule(myConfiguration, consoleProperties.isDebug())) { super.notifyByBalloon(model, started, consoleProperties); } - else { - final String packageName = myConfiguration.getPackage(); - if (packageName == null) return; - final Project project = myConfiguration.getProject(); - final PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage(packageName); - if (aPackage == null) return; - final Module module = myConfiguration.getConfigurationModule().getModule(); - if (module == null) return; - final Set modulesWithPackage = new HashSet(); - final PsiDirectory[] directories = aPackage.getDirectories(); - for (PsiDirectory directory : directories) { - final Module currentModule = ModuleUtilCore.findModuleForFile(directory.getVirtualFile(), project); - if (module != currentModule && currentModule != null) { - modulesWithPackage.add(currentModule); - } - } - if (!modulesWithPackage.isEmpty()) { - final String testRunDebugId = consoleProperties.isDebug() ? ToolWindowId.DEBUG : ToolWindowId.RUN; - final ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project); - final Function moduleNameRef = new Function() { - @Override - public String fun(Module module) { - final String moduleName = module.getName(); - return "" + moduleName + ""; - } - }; - String message = "Tests were not found in module \"" + module.getName() + "\".\n" + - "Use "; - if (modulesWithPackage.size() == 1) { - message += "module \"" + moduleNameRef.fun(modulesWithPackage.iterator().next()) + "\" "; - } - else { - message += "one of\n" + StringUtil.join(modulesWithPackage, moduleNameRef, "\n") + "\n"; - } - message += "instead"; - toolWindowManager.notifyByBalloon(testRunDebugId, MessageType.WARNING, message, null, - new ResetConfigurationModuleAdapter(project, consoleProperties, toolWindowManager, - testRunDebugId)); - } - } - } - - public interface FindCallback { - /** - * Invoked in dispatch thread - */ - void found(@NotNull Collection classes); - } - - private class MySearchForTestsTask extends SearchForTestsTask { - private final TestClassFilter myClassFilter; - private final THashSet myClasses; - private final FindCallback myCallback; - - public MySearchForTestsTask(TestClassFilter classFilter, - THashSet classes, - FindCallback callback, - ServerSocket serverSocket) { - super(classFilter.getProject(), serverSocket); - myClassFilter = classFilter; - myClasses = classes; - myCallback = callback; - } - - - @Override - protected void search() { - myClasses.clear(); - ConfigurationUtil.findAllTestClasses(myClassFilter, myClasses); - } - - @Override - protected void onFound() { - myFoundTests = !myClasses.isEmpty(); - myCallback.found(myClasses); - } - } - - private class ResetConfigurationModuleAdapter extends HyperlinkAdapter { - private final Project myProject; - private final JUnitConsoleProperties myConsoleProperties; - private final ToolWindowManager myToolWindowManager; - private final String myTestRunDebugId; - - public ResetConfigurationModuleAdapter(final Project project, - final JUnitConsoleProperties consoleProperties, - final ToolWindowManager toolWindowManager, - final String testRunDebugId) { - myProject = project; - myConsoleProperties = consoleProperties; - myToolWindowManager = toolWindowManager; - myTestRunDebugId = testRunDebugId; - } - - @Override - protected void hyperlinkActivated(HyperlinkEvent e) { - final Module moduleByName = ModuleManager.getInstance(myProject).findModuleByName(e.getDescription()); - if (moduleByName != null) { - myConfiguration.getConfigurationModule().setModule(moduleByName); - try { - Executor executor = myConsoleProperties.isDebug() ? DefaultDebugExecutor.getDebugExecutorInstance() - : DefaultRunExecutor.getRunExecutorInstance(); - ExecutionEnvironmentBuilder.create(myProject, executor, myConfiguration).contentToReuse(null).buildAndExecute(); - Balloon balloon = myToolWindowManager.getToolWindowBalloon(myTestRunDebugId); - if (balloon != null) { - balloon.hide(); - } - } - catch (ExecutionException e1) { - LOG.error(e1); - } - } - } } } diff --git a/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGResults.java b/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGResults.java index 78f980aea83d..6519bc571f77 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGResults.java +++ b/plugins/testng/src/com/theoryinpractice/testng/ui/TestNGResults.java @@ -68,6 +68,7 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn private final TableView resultsTable; private final TestNGResultsTableModel model; + private final TestNGConfiguration configuration; private TestNGTestTreeView tree; private final Project project; @@ -94,6 +95,7 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn final ExecutionEnvironment environment) { super(component, console.getConsole().createConsoleActions(), console.getProperties(), environment, TESTNG_SPLITTER_PROPERTY, 0.5f); + this.configuration = configuration; this.project = configuration.getProject(); model = new TestNGResultsTableModel(project); @@ -409,7 +411,10 @@ public class TestNGResults extends TestResultsPanel implements TestFrameworkRunn } } tree.repaint(); - TestsUIUtil.notifyByBalloon(project, started, rootNode, getProperties(), "in " + getTime()); + if (total > 0 || + !ResetConfigurationModuleAdapter.tryWithAnotherModule(configuration, getProperties().isDebug())) { + TestsUIUtil.notifyByBalloon(project, started, rootNode, getProperties(), "in " + getTime()); + } } }); }