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");