diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index 3eaccc1cf793..dc149f88a0b1 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -36,6 +36,10 @@ gradle.codeInsight.action.apply_plugin.popup.title=Choose plugin gradle.codeInsight.action.add_maven_dependency.text=Add maven artifact dependency gradle.codeInsight.action.add_maven_dependency.description=Add selected maven artifact dependency to the project +gradle.runner=Runner +gradle.preferred_test_runner.ask=Let me choose per test +gradle.preferred_test_runner.PLATFORM_TEST_RUNNER=Platform Test Runner +gradle.preferred_test_runner.GRADLE_TEST_RUNNER=Gradle Test Runner gradle.test.runner.ui.tests.tree.presentation.labels.waiting.tests=Waiting for tests... gradle.test.runner.ui.tests.tree.presentation.labels.no.tests.were.found=Test events were not received gradle.test.runner.ui.tests.actions.open.gradle.report.text=Open Gradle test report diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml index 9a116de6fb81..121810970cf6 100644 --- a/plugins/gradle/src/META-INF/plugin.xml +++ b/plugins/gradle/src/META-INF/plugin.xml @@ -86,11 +86,11 @@ + order="last"/> + order="last"/> + order="last"/> @@ -99,7 +99,11 @@ + key="gradle.name" bundle="i18n.GradleBundle"> + + @@ -119,6 +123,7 @@ + diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/AllInPackageGradleConfigurationProducer.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/AllInPackageGradleConfigurationProducer.java index b15c69148d02..c1ed0c559a7b 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/AllInPackageGradleConfigurationProducer.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/AllInPackageGradleConfigurationProducer.java @@ -43,10 +43,9 @@ public class AllInPackageGradleConfigurationProducer extends GradleTestRunConfig } @Override - protected boolean setupConfigurationFromContext(ExternalSystemRunConfiguration configuration, - ConfigurationContext context, - Ref sourceElement) { - + protected boolean doSetupConfigurationFromContext(ExternalSystemRunConfiguration configuration, + ConfigurationContext context, + Ref sourceElement) { final PsiPackage psiPackage = JavaRuntimeConfigurationProducerBase.checkPackage(context.getPsiLocation()); if (psiPackage == null) return false; sourceElement.set(psiPackage); @@ -75,10 +74,7 @@ public class AllInPackageGradleConfigurationProducer extends GradleTestRunConfig } @Override - public boolean isConfigurationFromContext(ExternalSystemRunConfiguration configuration, ConfigurationContext context) { - if (configuration == null) return false; - if (!GradleConstants.SYSTEM_ID.equals(configuration.getSettings().getExternalSystemId())) return false; - + protected boolean doIsConfigurationFromContext(ExternalSystemRunConfiguration configuration, ConfigurationContext context) { final PsiPackage psiPackage = JavaRuntimeConfigurationProducerBase.checkPackage(context.getPsiLocation()); if (psiPackage == null) return false; diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestRunConfigurationProducer.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestRunConfigurationProducer.java index 3a47594aaf8d..026d1390d1d8 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestRunConfigurationProducer.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/GradleTestRunConfigurationProducer.java @@ -15,6 +15,9 @@ */ package org.jetbrains.plugins.gradle.execution.test.runner; +import com.intellij.execution.RunManagerEx; +import com.intellij.execution.RunnerAndConfigurationSettings; +import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; import com.intellij.execution.actions.RunConfigurationProducer; import com.intellij.execution.configurations.ConfigurationType; @@ -27,17 +30,23 @@ import com.intellij.openapi.externalSystem.service.execution.ExternalSystemRunCo import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; import com.intellij.openapi.module.Module; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; import com.intellij.util.BooleanFunction; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverUtil; import org.jetbrains.plugins.gradle.service.resolve.GradleCommonClassNames; +import org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings; import org.jetbrains.plugins.gradle.util.GradleConstants; -import org.jetbrains.plugins.gradle.util.GradleEnvironment; import java.util.List; +import static org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings.PreferredTestRunner.GRADLE_TEST_RUNNER; +import static org.jetbrains.plugins.gradle.settings.GradleSystemRunningSettings.PreferredTestRunner.PLATFORM_TEST_RUNNER; + /** * @author Vladislav.Soroka * @since 2/26/2015 @@ -52,9 +61,60 @@ public abstract class GradleTestRunConfigurationProducer extends RunConfiguratio @Override public boolean isPreferredConfiguration(ConfigurationFromContext self, ConfigurationFromContext other) { - return !GradleEnvironment.PREFER_IDEA_TEST_RUNNER && super.isPreferredConfiguration(self, other); + return GradleSystemRunningSettings.getInstance().getPreferredTestRunner() == null || + GradleSystemRunningSettings.getInstance().getPreferredTestRunner() == GRADLE_TEST_RUNNER; } + @Override + public boolean shouldReplace(ConfigurationFromContext self, ConfigurationFromContext other) { + return GradleSystemRunningSettings.getInstance().getPreferredTestRunner() == GRADLE_TEST_RUNNER; + } + + @Nullable + @Override + public RunnerAndConfigurationSettings findExistingConfiguration(ConfigurationContext context) { + final RunnerAndConfigurationSettings existingConfiguration = super.findExistingConfiguration(context); + if (existingConfiguration == null && GradleSystemRunningSettings.getInstance().getPreferredTestRunner() == GRADLE_TEST_RUNNER) { + final ConfigurationFromContext createdContext = createConfigurationFromContext(context); + if (createdContext != null) { + final RunnerAndConfigurationSettings settings = createdContext.getConfigurationSettings(); + final RunManagerEx manager = RunManagerEx.getInstanceEx(context.getProject()); + manager.setTemporaryConfiguration(settings); + return settings; + } + else { + return null; + } + } + + return existingConfiguration; + } + + @Override + protected boolean setupConfigurationFromContext(ExternalSystemRunConfiguration configuration, + ConfigurationContext context, + Ref sourceElement) { + if (!GradleConstants.SYSTEM_ID.equals(configuration.getSettings().getExternalSystemId())) return false; + if (GradleSystemRunningSettings.getInstance().getPreferredTestRunner() == PLATFORM_TEST_RUNNER) return false; + + return doSetupConfigurationFromContext(configuration, context, sourceElement); + } + + protected abstract boolean doSetupConfigurationFromContext(ExternalSystemRunConfiguration configuration, + ConfigurationContext context, + Ref sourceElement); + + @Override + public boolean isConfigurationFromContext(ExternalSystemRunConfiguration configuration, ConfigurationContext context) { + if (GradleSystemRunningSettings.getInstance().getPreferredTestRunner() == PLATFORM_TEST_RUNNER) return false; + if (configuration == null) return false; + if (!GradleConstants.SYSTEM_ID.equals(configuration.getSettings().getExternalSystemId())) return false; + + return doIsConfigurationFromContext(configuration, context); + } + + protected abstract boolean doIsConfigurationFromContext(ExternalSystemRunConfiguration configuration, ConfigurationContext context); + @NotNull static List getTasksToRun(Module module) { final List result; diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/TestClassGradleConfigurationProducer.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/TestClassGradleConfigurationProducer.java index 26e4bde01b2e..6068b4e07838 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/TestClassGradleConfigurationProducer.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/TestClassGradleConfigurationProducer.java @@ -35,7 +35,6 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; import com.intellij.util.ArrayUtil; import com.intellij.util.Function; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.gradle.service.execution.GradleExternalTaskConfigurationType; import org.jetbrains.plugins.gradle.util.GradleConstants; @@ -55,10 +54,9 @@ public class TestClassGradleConfigurationProducer extends GradleTestRunConfigura } @Override - protected boolean setupConfigurationFromContext(ExternalSystemRunConfiguration configuration, - ConfigurationContext context, - Ref sourceElement) { - + protected boolean doSetupConfigurationFromContext(ExternalSystemRunConfiguration configuration, + ConfigurationContext context, + Ref sourceElement) { final Location contextLocation = context.getLocation(); assert contextLocation != null; final Location location = JavaExecutionUtil.stepIntoSingleClass(contextLocation); @@ -93,10 +91,7 @@ public class TestClassGradleConfigurationProducer extends GradleTestRunConfigura } @Override - public boolean isConfigurationFromContext(ExternalSystemRunConfiguration configuration, ConfigurationContext context) { - if (configuration == null) return false; - if (!GradleConstants.SYSTEM_ID.equals(configuration.getSettings().getExternalSystemId())) return false; - + protected boolean doIsConfigurationFromContext(ExternalSystemRunConfiguration configuration, ConfigurationContext context) { final Location contextLocation = context.getLocation(); assert contextLocation != null; final Location location = JavaExecutionUtil.stepIntoSingleClass(contextLocation); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/TestMethodGradleConfigurationProducer.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/TestMethodGradleConfigurationProducer.java index af59c46aedd1..f5e7e7b0d58f 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/TestMethodGradleConfigurationProducer.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/test/runner/TestMethodGradleConfigurationProducer.java @@ -51,9 +51,9 @@ public class TestMethodGradleConfigurationProducer extends GradleTestRunConfigur } @Override - protected boolean setupConfigurationFromContext(ExternalSystemRunConfiguration configuration, - ConfigurationContext context, - Ref sourceElement) { + protected boolean doSetupConfigurationFromContext(ExternalSystemRunConfiguration configuration, + ConfigurationContext context, + Ref sourceElement) { if (RunConfigurationProducer.getInstance(PatternConfigurationProducer.class).isMultipleElementsSelected(context)) { return false; } @@ -77,10 +77,7 @@ public class TestMethodGradleConfigurationProducer extends GradleTestRunConfigur } @Override - public boolean isConfigurationFromContext(ExternalSystemRunConfiguration configuration, ConfigurationContext context) { - if (configuration == null) return false; - if (!GradleConstants.SYSTEM_ID.equals(configuration.getSettings().getExternalSystemId())) return false; - + protected boolean doIsConfigurationFromContext(ExternalSystemRunConfiguration configuration, ConfigurationContext context) { if (RunConfigurationProducer.getInstance(PatternConfigurationProducer.class).isMultipleElementsSelected(context)) { return false; } @@ -174,7 +171,7 @@ public class TestMethodGradleConfigurationProducer extends GradleTestRunConfigur } configuration.getSettings().setScriptParameters(buf.toString().trim()); - configuration.setName(psiMethod.getName()); + configuration.setName((containingClasses.length == 1 ? containingClasses[0].getName() + "." : "") + psiMethod.getName()); return true; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.form b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.form new file mode 100644 index 000000000000..fec1df492207 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.form @@ -0,0 +1,32 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.java new file mode 100644 index 000000000000..3371b39ef1f5 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleRunnerConfigurable.java @@ -0,0 +1,148 @@ +/* + * 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 org.jetbrains.plugins.gradle.settings; + +import com.google.common.base.Objects; +import com.intellij.openapi.options.BaseConfigurable; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.options.SearchableConfigurable; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.ComboBox; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.util.GradleBundle; + +import javax.swing.*; + +/** + * @author Vladislav.Soroka + * @since 11/2/2015 + */ +public class GradleRunnerConfigurable extends BaseConfigurable implements SearchableConfigurable { + + private JPanel myMainPanel; + private ComboBox myPreferredTestRunner; + private static final TestRunnerItem[] TEST_RUNNER_ITEMS = new TestRunnerItem[]{ + new TestRunnerItem(GradleSystemRunningSettings.PreferredTestRunner.PLATFORM_TEST_RUNNER), + new TestRunnerItem(GradleSystemRunningSettings.PreferredTestRunner.GRADLE_TEST_RUNNER), + new TestRunnerItem(null)}; + + + private final Project myProject; + + public GradleRunnerConfigurable(Project project) { + myProject = project; + } + + @Nls + @Override + public String getDisplayName() { + return GradleBundle.message("gradle.runner"); + } + + @Nullable + @Override + public String getHelpTopic() { + return "reference.settings.project.gradle.running"; + } + + @Override + public void apply() throws ConfigurationException { + GradleSystemRunningSettings.getInstance().setPreferredTestRunner( + ((TestRunnerItem)myPreferredTestRunner.getSelectedItem()).value); + } + + @Override + public void reset() { + GradleSystemRunningSettings settings = GradleSystemRunningSettings.getInstance(); + final TestRunnerItem item = getItem(settings.getPreferredTestRunner()); + myPreferredTestRunner.setSelectedItem(item); + } + + @Nullable + @Override + public JComponent createComponent() { + return myMainPanel; + } + + @Override + public boolean isModified() { + GradleSystemRunningSettings uiSettings = new GradleSystemRunningSettings(); + final TestRunnerItem selectedItem = (TestRunnerItem)myPreferredTestRunner.getSelectedItem(); + GradleSystemRunningSettings.PreferredTestRunner preferredTestRunner = selectedItem == null ? null : selectedItem.value; + uiSettings.setPreferredTestRunner(preferredTestRunner); + GradleSystemRunningSettings settings = GradleSystemRunningSettings.getInstance(); + return !settings.equals(uiSettings); + } + + @Override + public void disposeUIResources() { + } + + @NotNull + @Override + public String getId() { + return "reference.settings.project.gradle.running"; + } + + @Nullable + @Override + public Runnable enableSearch(String option) { + return null; + } + + private void createUIComponents() { + myPreferredTestRunner = new ComboBox(getItems()); + } + + private static TestRunnerItem getItem(GradleSystemRunningSettings.PreferredTestRunner preferredTestRunner) { + for (TestRunnerItem item : getItems()) { + if (item.value == preferredTestRunner) return item; + } + return null; + } + + private static TestRunnerItem[] getItems() { + return TEST_RUNNER_ITEMS; + } + + static class TestRunnerItem { + public TestRunnerItem(GradleSystemRunningSettings.PreferredTestRunner value) { + this.value = value; + } + + GradleSystemRunningSettings.PreferredTestRunner value; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof TestRunnerItem)) return false; + TestRunnerItem item = (TestRunnerItem)o; + return value == item.value; + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } + + @Override + public String toString() { + return GradleBundle.message("gradle.preferred_test_runner." + (value == null ? "ask" : value.name())); + } + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleSystemRunningSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleSystemRunningSettings.java new file mode 100644 index 000000000000..a59d89487104 --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleSystemRunningSettings.java @@ -0,0 +1,85 @@ +/* + * 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 org.jetbrains.plugins.gradle.settings; + +import com.google.common.base.Objects; +import com.intellij.openapi.components.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Vladislav.Soroka + * @since 14/8/2014 + */ +@State( + name = "GradleSystemRunningSettings", + storages = { + @Storage(file = StoragePathMacros.APP_CONFIG + "/gradle.run.settings.xml") + } +) +public class GradleSystemRunningSettings implements PersistentStateComponent { + + @Nullable private PreferredTestRunner myPreferredTestRunner = PreferredTestRunner.PLATFORM_TEST_RUNNER; + + @NotNull + public static GradleSystemRunningSettings getInstance() { + return ServiceManager.getService(GradleSystemRunningSettings.class); + } + + @SuppressWarnings("unchecked") + @Nullable + @Override + public GradleSystemRunningSettings.MyState getState() { + MyState state = new MyState(); + state.preferredTestRunner = myPreferredTestRunner; + return state; + } + + @Override + public void loadState(MyState state) { + myPreferredTestRunner = state.preferredTestRunner; + } + + @Nullable + public PreferredTestRunner getPreferredTestRunner() { + return myPreferredTestRunner; + } + + public void setPreferredTestRunner(@Nullable PreferredTestRunner preferredTestRunner) { + myPreferredTestRunner = preferredTestRunner; + } + + public static class MyState { + public PreferredTestRunner preferredTestRunner; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof GradleSystemRunningSettings)) return false; + GradleSystemRunningSettings settings = (GradleSystemRunningSettings)o; + return Objects.equal(myPreferredTestRunner, settings.myPreferredTestRunner); + } + + @Override + public int hashCode() { + return Objects.hashCode(myPreferredTestRunner); + } + + public enum PreferredTestRunner { + PLATFORM_TEST_RUNNER, GRADLE_TEST_RUNNER + } +} \ No newline at end of file diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleEnvironment.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleEnvironment.java index 38a4ad7508a2..43d4638d40d5 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleEnvironment.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleEnvironment.java @@ -11,7 +11,6 @@ public class GradleEnvironment { @NonNls public static final boolean DEBUG_GRADLE_HOME_PROCESSING = Boolean.getBoolean("gradle.debug.home.processing"); @NonNls public static final boolean ADJUST_USER_DIR = Boolean.getBoolean("gradle.adjust.userdir"); - @NonNls public static final boolean PREFER_IDEA_TEST_RUNNER = Boolean.getBoolean("idea.gradle.prefer.idea_test_runner"); public static class Headless { @NonNls public static final String GRADLE_DISTRIBUTION_TYPE = System.getProperty("idea.gradle.distributionType");