diff --git a/python/src/META-INF/python-core-common.xml b/python/src/META-INF/python-core-common.xml index 07e88d0b468b..783ce7588ec0 100644 --- a/python/src/META-INF/python-core-common.xml +++ b/python/src/META-INF/python-core-common.xml @@ -151,8 +151,7 @@ - - + diff --git a/python/src/com/jetbrains/python/testing/AbstractPythonOldTestRunConfiguration.java b/python/src/com/jetbrains/python/testing/AbstractPythonLegacyTestRunConfiguration.java similarity index 97% rename from python/src/com/jetbrains/python/testing/AbstractPythonOldTestRunConfiguration.java rename to python/src/com/jetbrains/python/testing/AbstractPythonLegacyTestRunConfiguration.java index 01d326473b28..decd4bfeb678 100644 --- a/python/src/com/jetbrains/python/testing/AbstractPythonOldTestRunConfiguration.java +++ b/python/src/com/jetbrains/python/testing/AbstractPythonLegacyTestRunConfiguration.java @@ -52,7 +52,7 @@ import java.io.File; * For new style see {@link com.jetbrains.python.testing.universalTests} * User: catherine */ -public abstract class AbstractPythonOldTestRunConfiguration> +public abstract class AbstractPythonLegacyTestRunConfiguration> extends AbstractPythonTestRunConfiguration implements AbstractPythonRunConfigurationParams, AbstractPythonTestRunConfigurationParams, @@ -66,7 +66,7 @@ public abstract class AbstractPythonOldTestRunConfiguration + * This type is used both with Legacy and New test runners. + * {@link PyUniversalTestLegacyInteropKt} is used to support legacy. To drop legacy support, remove all code that depends on it. */ -public abstract class PythonTestConfigurationType implements ConfigurationType { +public final class PythonTestConfigurationType implements ConfigurationType { + public static final String ID = "tests"; + + public final PythonConfigurationFactoryBase PY_DOCTEST_FACTORY = new PythonDocTestConfigurationFactory(this); + public final PythonConfigurationFactoryBase LEGACY_UNITTEST_FACTORY = new PythonLegacyUnitTestConfigurationFactory(this); + public final PythonConfigurationFactoryBase LEGACY_NOSETEST_FACTORY = new PythonLegacyNoseTestConfigurationFactory(this); + public final PythonConfigurationFactoryBase LEGACY_PYTEST_FACTORY = new PythonLegacyPyTestConfigurationFactory(this); + + public static PythonTestConfigurationType getInstance() { + return ConfigurationTypeUtil.findConfigurationType(PythonTestConfigurationType.class); + } + + public PythonTestConfigurationType() { + /* + According to PyUniversalTestLegacyInteropKt we need to call "projectInitialized" when it is initialized + */ + ApplicationManager.getApplication().getMessageBus().connect().subscribe(ProjectLifecycleListener.TOPIC, new ProjectLifecycleListener() { + @Override + public void projectComponentsInitialized(@NotNull + final Project project) { + if (project.isInitialized()) { + PyUniversalTestLegacyInteropKt.projectInitialized(project); + return; + } + StartupManager.getInstance(project).runWhenProjectIsInitialized(() -> PyUniversalTestLegacyInteropKt.projectInitialized(project)); + } + }); + } + + @Override public String getDisplayName() { return PyBundle.message("runcfg.test.display_name"); } + @Override public String getConfigurationTypeDescription() { return PyBundle.message("runcfg.test.description"); } + @Override public Icon getIcon() { return PythonIcons.Python.PythonTests; } + + + private static class PythonLegacyUnitTestConfigurationFactory extends PythonConfigurationFactoryBase { + protected PythonLegacyUnitTestConfigurationFactory(ConfigurationType configurationType) { + super(configurationType); + } + + @Override + public RunConfiguration createTemplateConfiguration(Project project) { + return new PythonUnitTestRunConfiguration(project, this); + } + + @Override + public String getName() { + return PyBundle.message("runcfg.unittest.display_name"); + } + } + + private static class PythonDocTestConfigurationFactory extends PythonConfigurationFactoryBase { + protected PythonDocTestConfigurationFactory(ConfigurationType configurationType) { + super(configurationType); + } + + @Override + public RunConfiguration createTemplateConfiguration(Project project) { + return new PythonDocTestRunConfiguration(project, this); + } + + @Override + public String getName() { + return PyBundle.message("runcfg.doctest.display_name"); + } + } + + private static class PythonLegacyPyTestConfigurationFactory extends PythonConfigurationFactoryBase { + protected PythonLegacyPyTestConfigurationFactory(ConfigurationType configurationType) { + super(configurationType); + } + + @Override + public RunConfiguration createTemplateConfiguration(Project project) { + return new PyTestRunConfiguration(project, this); + } + + @Override + public String getName() { + return PyBundle.message("runcfg.pytest.display_name"); + } + } + + private static class PythonLegacyNoseTestConfigurationFactory extends PythonConfigurationFactoryBase { + protected PythonLegacyNoseTestConfigurationFactory(ConfigurationType configurationType) { + super(configurationType); + } + + @Override + public RunConfiguration createTemplateConfiguration(Project project) { + return new PythonNoseTestRunConfiguration(project, this); + } + + @Override + public String getName() { + return PyBundle.message("runcfg.nosetests.display_name"); + } + } + + @NotNull + @Override + public String getId() { + return ID; + } + + @Override + public ConfigurationFactory[] getConfigurationFactories() { + // Use new or legacy factories depending to new config + final ConfigurationFactory[] factories = PyUniversalTestLegacyInteropKt.isNewTestsModeEnabled() + ? PyUniversalTestsKt.getFactories() + : new ConfigurationFactory[] + {LEGACY_UNITTEST_FACTORY, LEGACY_NOSETEST_FACTORY, LEGACY_PYTEST_FACTORY}; + return ObjectArrays.concat(factories, PY_DOCTEST_FACTORY); + } } diff --git a/python/src/com/jetbrains/python/testing/PythonTestOldConfigurationProducer.java b/python/src/com/jetbrains/python/testing/PythonTestLegacyConfigurationProducer.java similarity index 81% rename from python/src/com/jetbrains/python/testing/PythonTestOldConfigurationProducer.java rename to python/src/com/jetbrains/python/testing/PythonTestLegacyConfigurationProducer.java index 4b79c98e53cd..007bf145f6d4 100644 --- a/python/src/com/jetbrains/python/testing/PythonTestOldConfigurationProducer.java +++ b/python/src/com/jetbrains/python/testing/PythonTestLegacyConfigurationProducer.java @@ -41,7 +41,7 @@ import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.types.TypeEvalContext; import com.jetbrains.python.run.PythonRunConfigurationProducer; import com.jetbrains.python.testing.unittest.PythonUnitTestRunConfiguration; -import com.jetbrains.python.testing.universalTests.PyUniversalTestsKt; +import com.jetbrains.python.testing.universalTests.PyUniversalTestLegacyInteropKt; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -54,14 +54,14 @@ import java.util.List; /** * User: ktisha */ -abstract public class PythonTestOldConfigurationProducer> extends RunConfigurationProducer> { +abstract public class PythonTestLegacyConfigurationProducer> extends RunConfigurationProducer> { - public PythonTestOldConfigurationProducer(final ConfigurationFactory configurationFactory) { + public PythonTestLegacyConfigurationProducer(final ConfigurationFactory configurationFactory) { super(configurationFactory); } @Override - public boolean isConfigurationFromContext(AbstractPythonOldTestRunConfiguration configuration, ConfigurationContext context) { + public boolean isConfigurationFromContext(AbstractPythonLegacyTestRunConfiguration configuration, ConfigurationContext context) { final Location location = context.getLocation(); if (location == null || !isAvailable(location)) return false; final PsiElement element = location.getPsiElement(); @@ -73,12 +73,12 @@ abstract public class PythonTestOldConfigurationProducer configuration, + protected boolean setupConfigurationFromContext(AbstractPythonLegacyTestRunConfiguration configuration, ConfigurationContext context, Ref sourceElement) { if (context == null) return false; @@ -147,12 +147,12 @@ abstract public class PythonTestOldConfigurationProducer +public class PythonDocTestRunConfiguration extends AbstractPythonLegacyTestRunConfiguration implements PythonDocTestRunConfigurationParams { protected String myPluralTitle = "Doctests"; protected String myTitle = "Doctest"; diff --git a/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestConfigurationProducer.java b/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestConfigurationProducer.java index 093d536098a4..0209d950ccb8 100644 --- a/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestConfigurationProducer.java +++ b/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestConfigurationProducer.java @@ -27,9 +27,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class PythonNoseTestConfigurationProducer extends - PythonTestOldConfigurationProducer { + PythonTestLegacyConfigurationProducer { public PythonNoseTestConfigurationProducer() { - super(PythonTestOldConfigurationType.getInstance().PY_NOSETEST_FACTORY); + super(PythonTestConfigurationType.getInstance().LEGACY_NOSETEST_FACTORY); } protected boolean isAvailable(@NotNull final Location location) { @@ -45,7 +45,7 @@ public class PythonNoseTestConfigurationProducer extends } @Override - protected boolean isTestFunction(@NotNull final PyFunction pyFunction, @Nullable final AbstractPythonOldTestRunConfiguration configuration) { + protected boolean isTestFunction(@NotNull final PyFunction pyFunction, @Nullable final AbstractPythonLegacyTestRunConfiguration configuration) { return PythonUnitTestUtil.isTestCaseFunction(pyFunction, true); } } \ No newline at end of file diff --git a/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestRunConfiguration.java b/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestRunConfiguration.java index 4a6ea8e2a716..630c2b9ad39d 100644 --- a/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestRunConfiguration.java +++ b/python/src/com/jetbrains/python/testing/nosetest/PythonNoseTestRunConfiguration.java @@ -26,7 +26,7 @@ import com.intellij.openapi.util.JDOMExternalizerUtil; import com.intellij.openapi.util.WriteExternalException; import com.jetbrains.python.PyBundle; import com.jetbrains.python.sdk.PythonSdkType; -import com.jetbrains.python.testing.AbstractPythonOldTestRunConfiguration; +import com.jetbrains.python.testing.AbstractPythonLegacyTestRunConfiguration; import com.jetbrains.python.testing.VFSTestFrameworkListener; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -34,7 +34,7 @@ import org.jetbrains.annotations.NotNull; /** * User: catherine */ -public class PythonNoseTestRunConfiguration extends AbstractPythonOldTestRunConfiguration +public class PythonNoseTestRunConfiguration extends AbstractPythonLegacyTestRunConfiguration implements PythonNoseTestRunConfigurationParams { private String myParams = ""; // parameters for nosetests protected String myTitle = "Nosetest"; @@ -80,7 +80,7 @@ public class PythonNoseTestRunConfiguration extends AbstractPythonOldTestRunConf } public static void copyParams(PythonNoseTestRunConfigurationParams source, PythonNoseTestRunConfigurationParams target) { - AbstractPythonOldTestRunConfiguration.copyParams(source.getTestRunConfigurationParams(), target.getTestRunConfigurationParams()); + AbstractPythonLegacyTestRunConfiguration.copyParams(source.getTestRunConfigurationParams(), target.getTestRunConfigurationParams()); target.setParams(source.getParams()); target.useParam(source.useParam()); } diff --git a/python/src/com/jetbrains/python/testing/pytest/PyTestConfigurationProducer.java b/python/src/com/jetbrains/python/testing/pytest/PyTestConfigurationProducer.java index 6d09344f56bb..e7b376a08737 100644 --- a/python/src/com/jetbrains/python/testing/pytest/PyTestConfigurationProducer.java +++ b/python/src/com/jetbrains/python/testing/pytest/PyTestConfigurationProducer.java @@ -44,14 +44,14 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.List; -public class PyTestConfigurationProducer extends PythonTestOldConfigurationProducer { +public class PyTestConfigurationProducer extends PythonTestLegacyConfigurationProducer { public PyTestConfigurationProducer() { - super(PythonTestOldConfigurationType.getInstance().PY_PYTEST_FACTORY); + super(PythonTestConfigurationType.getInstance().LEGACY_PYTEST_FACTORY); } @Override - protected boolean setupConfigurationFromContext(AbstractPythonOldTestRunConfiguration configuration, + protected boolean setupConfigurationFromContext(AbstractPythonLegacyTestRunConfiguration configuration, ConfigurationContext context, Ref sourceElement) { final PsiElement element = sourceElement.get(); @@ -144,7 +144,7 @@ public class PyTestConfigurationProducer extends PythonTestOldConfigurationProdu } @Override - public boolean isConfigurationFromContext(AbstractPythonOldTestRunConfiguration configuration, ConfigurationContext context) { + public boolean isConfigurationFromContext(AbstractPythonLegacyTestRunConfiguration configuration, ConfigurationContext context) { final Location location = context.getLocation(); if (location == null) return false; if (!(configuration instanceof PyTestRunConfiguration)) return false; diff --git a/python/src/com/jetbrains/python/testing/pytest/PyTestRunConfiguration.java b/python/src/com/jetbrains/python/testing/pytest/PyTestRunConfiguration.java index 614ac77245ab..c5e8d247bd74 100644 --- a/python/src/com/jetbrains/python/testing/pytest/PyTestRunConfiguration.java +++ b/python/src/com/jetbrains/python/testing/pytest/PyTestRunConfiguration.java @@ -33,7 +33,7 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.python.PyBundle; import com.jetbrains.python.sdk.PythonSdkType; -import com.jetbrains.python.testing.AbstractPythonOldTestRunConfiguration; +import com.jetbrains.python.testing.AbstractPythonLegacyTestRunConfiguration; import com.jetbrains.python.testing.VFSTestFrameworkListener; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -45,7 +45,7 @@ import java.util.List; /** * @author yole */ -public class PyTestRunConfiguration extends AbstractPythonOldTestRunConfiguration +public class PyTestRunConfiguration extends AbstractPythonLegacyTestRunConfiguration implements PyTestRunConfigurationParams { private String myTestToRun = ""; private String myKeywords = ""; diff --git a/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestCommandLineState.java b/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestCommandLineState.java index c20281f6c4ac..7404b850b670 100644 --- a/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestCommandLineState.java +++ b/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestCommandLineState.java @@ -23,7 +23,7 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.jetbrains.python.PyNames; import com.jetbrains.python.PythonHelper; -import com.jetbrains.python.testing.AbstractPythonOldTestRunConfiguration; +import com.jetbrains.python.testing.AbstractPythonLegacyTestRunConfiguration; import com.jetbrains.python.testing.PythonTestCommandLineStateBase; import com.jetbrains.python.testing.PythonUnitTestTestIdUrlProvider; import org.jetbrains.annotations.NotNull; @@ -45,7 +45,7 @@ public class PythonUnitTestCommandLineState extends PythonTestCommandLineStateBa @Override protected PythonHelper getRunner() { - if (myConfig.getTestType() == AbstractPythonOldTestRunConfiguration.TestType.TEST_SCRIPT && + if (myConfig.getTestType() == AbstractPythonLegacyTestRunConfiguration.TestType.TEST_SCRIPT && myConfig.getScriptName().endsWith(PyNames.SETUP_DOT_PY)) return PythonHelper.SETUPPY; return PythonHelper.UT_OLD; @@ -98,7 +98,7 @@ public class PythonUnitTestCommandLineState extends PythonTestCommandLineStateBa if (myConfig.useParam() && !StringUtil.isEmptyOrSpaces(myConfig.getParams())) script_params.addParameter(myConfig.getParams()); - if (myConfig.getTestType() != AbstractPythonOldTestRunConfiguration.TestType.TEST_SCRIPT || + if (myConfig.getTestType() != AbstractPythonLegacyTestRunConfiguration.TestType.TEST_SCRIPT || !myConfig.getScriptName().endsWith(PyNames.SETUP_DOT_PY)) script_params.addParameter(String.valueOf(myConfig.isPureUnittest())); } diff --git a/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestConfigurationProducer.java b/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestConfigurationProducer.java index 7c79c9ccb341..556af387ecd3 100644 --- a/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestConfigurationProducer.java +++ b/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestConfigurationProducer.java @@ -36,9 +36,9 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -public class PythonUnitTestConfigurationProducer extends PythonTestOldConfigurationProducer { +public class PythonUnitTestConfigurationProducer extends PythonTestLegacyConfigurationProducer { public PythonUnitTestConfigurationProducer() { - super(PythonTestOldConfigurationType.getInstance().PY_UNITTEST_FACTORY); + super(PythonTestConfigurationType.getInstance().LEGACY_UNITTEST_FACTORY); } protected boolean isAvailable(@NotNull final Location location) { @@ -54,7 +54,7 @@ public class PythonUnitTestConfigurationProducer extends PythonTestOldConfigurat @Override protected boolean isTestFunction(@NotNull final PyFunction pyFunction, - @Nullable final AbstractPythonOldTestRunConfiguration configuration) { + @Nullable final AbstractPythonLegacyTestRunConfiguration configuration) { final boolean isTestFunction = super.isTestFunction(pyFunction, configuration); return isTestFunction || (configuration instanceof PythonUnitTestRunConfiguration && !((PythonUnitTestRunConfiguration)configuration).isPureUnittest()); @@ -62,7 +62,7 @@ public class PythonUnitTestConfigurationProducer extends PythonTestOldConfigurat @Override protected boolean isTestClass(@NotNull PyClass pyClass, - @Nullable final AbstractPythonOldTestRunConfiguration configuration, + @Nullable final AbstractPythonLegacyTestRunConfiguration configuration, TypeEvalContext context) { final boolean isTestClass = super.isTestClass(pyClass, configuration, context); return isTestClass || (configuration instanceof PythonUnitTestRunConfiguration && diff --git a/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestRunConfiguration.java b/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestRunConfiguration.java index de7fe6fc1900..9bffbd8b8ff3 100644 --- a/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestRunConfiguration.java +++ b/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestRunConfiguration.java @@ -24,7 +24,7 @@ import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.JDOMExternalizerUtil; import com.intellij.openapi.util.WriteExternalException; -import com.jetbrains.python.testing.AbstractPythonOldTestRunConfiguration; +import com.jetbrains.python.testing.AbstractPythonLegacyTestRunConfiguration; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -32,7 +32,7 @@ import org.jetbrains.annotations.NotNull; * @author Leonid Shalupov */ public class PythonUnitTestRunConfiguration extends - AbstractPythonOldTestRunConfiguration + AbstractPythonLegacyTestRunConfiguration implements PythonUnitTestRunConfigurationParams { private boolean myIsPureUnittest = true; protected String myTitle = "Unittest"; diff --git a/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestRunConfigurationForm.java b/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestRunConfigurationForm.java index 31e064060cab..ce5cfcec68b7 100644 --- a/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestRunConfigurationForm.java +++ b/python/src/com/jetbrains/python/testing/unittest/PythonUnitTestRunConfigurationForm.java @@ -17,7 +17,7 @@ package com.jetbrains.python.testing.unittest; import com.intellij.openapi.project.Project; import com.jetbrains.python.PyBundle; -import com.jetbrains.python.testing.AbstractPythonOldTestRunConfiguration; +import com.jetbrains.python.testing.AbstractPythonLegacyTestRunConfiguration; import com.jetbrains.python.testing.AbstractPythonTestRunConfigurationParams; import com.jetbrains.python.testing.PythonTestRunConfigurationForm; @@ -45,7 +45,7 @@ public class PythonUnitTestRunConfigurationForm implements PythonUnitTestRunConf final ActionListener testTypeListener = new ActionListener() { public void actionPerformed(final ActionEvent e) { - myIsPureUnittest.setVisible(myTestRunConfigurationForm.getTestType() != AbstractPythonOldTestRunConfiguration.TestType.TEST_FUNCTION); + myIsPureUnittest.setVisible(myTestRunConfigurationForm.getTestType() != AbstractPythonLegacyTestRunConfiguration.TestType.TEST_FUNCTION); } }; myTestRunConfigurationForm.addTestTypeListener(testTypeListener); diff --git a/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTestForm.java b/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTestForm.java index 8f7ad6904d6b..25b16e275ada 100644 --- a/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTestForm.java +++ b/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTestForm.java @@ -18,6 +18,7 @@ package com.jetbrains.python.testing.universalTests; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBRadioButton; @@ -85,13 +86,16 @@ public final class PyUniversalTestForm implements SimplePropertiesProvider { } @Override - public void setPropertyValue(@NotNull final String propertyName, @Nullable final String propertyValue) { + public void setPropertyValue(@NotNull + final String propertyName, @Nullable + final String propertyValue) { myCustomOptions.get(propertyName).setText(propertyValue != null ? propertyValue : ""); } @Nullable @Override - public String getPropertyValue(@NotNull final String propertyName) { + public String getPropertyValue(@NotNull + final String propertyName) { return myCustomOptions.get(propertyName).getText(); } @@ -103,8 +107,10 @@ public final class PyUniversalTestForm implements SimplePropertiesProvider { * @param customOptions additional option names this form shall support. Make sure your configuration has appropriate properties. */ @NotNull - public static PyUniversalTestForm create(@NotNull final PyUniversalTestConfiguration configuration, - @NotNull final String... customOptions) { // TODO: DOC + public static PyUniversalTestForm create(@NotNull + final PyUniversalTestConfiguration configuration, + @NotNull + final String... customOptions) { // TODO: DOC final PyUniversalTestForm form = new PyUniversalTestForm(); @@ -134,7 +140,8 @@ public final class PyUniversalTestForm implements SimplePropertiesProvider { return form; } - private void addCustomOptions(@NotNull final String... optionNames) { + private void addCustomOptions(@NotNull + final String... optionNames) { if (optionNames.length == 0) { return; } @@ -175,11 +182,15 @@ public final class PyUniversalTestForm implements SimplePropertiesProvider { @NotNull public String getTarget() { - return myTargetText.getText(); + // We should always use system-independent path because only this type of path is processed correctly + // when stored (folder changed to macros to prevent hard code) + final String targetText = myTargetText.getText().trim(); + return getTargetType() == TestTargetType.PATH ? FileUtil.toSystemIndependentName(targetText) : targetText; } - public void setTarget(@NotNull final String targetText) { + public void setTarget(@NotNull + final String targetText) { myTargetText.setText(targetText); } @@ -196,7 +207,8 @@ public final class PyUniversalTestForm implements SimplePropertiesProvider { } @SuppressWarnings("unused") // Mutator for property - public void setTargetType(@NotNull final TestTargetType target) { + public void setTargetType(@NotNull + final TestTargetType target) { final Enumeration elements = myButtonGroup.getElements(); while (elements.hasMoreElements()) { final AbstractButton button = elements.nextElement(); diff --git a/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTestLegacyInterop.kt b/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTestLegacyInterop.kt new file mode 100644 index 000000000000..62d7dd26cdf3 --- /dev/null +++ b/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTestLegacyInterop.kt @@ -0,0 +1,264 @@ +package com.jetbrains.python.testing.universalTests + +import com.intellij.execution.RunManager +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.fileEditor.FileDocumentManager +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.JDOMExternalizable +import com.intellij.openapi.util.registry.Registry +import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiDocumentManager +import com.jetbrains.python.psi.PyFile +import com.jetbrains.python.psi.PyQualifiedNameOwner +import com.jetbrains.python.psi.PyUtil +import com.jetbrains.python.psi.types.TypeEvalContext +import com.jetbrains.python.run.PythonConfigurationFactoryBase +import com.jetbrains.python.testing.AbstractPythonLegacyTestRunConfiguration +import com.jetbrains.python.testing.AbstractPythonLegacyTestRunConfiguration.TestType +import com.jetbrains.python.testing.PythonTestConfigurationType +import com.jetbrains.python.testing.nosetest.PythonNoseTestRunConfiguration +import com.jetbrains.python.testing.pytest.PyTestRunConfiguration +import com.jetbrains.python.testing.unittest.PythonUnitTestRunConfiguration +import org.jdom.Element + +/** + * Module to support legacy configurations. + * + * When legacy configuration is ought to be dropped, just remove this module and all references to it. + * It supports switching back to old runners (see [isNewTestsModeEnabled]) and importing old configs to new one. + * [projectInitialized] shall be called for that. + * + * @author Ilya.Kazakevich + */ + +/** + * @return is new mode enabled or not + */ +fun isNewTestsModeEnabled(): Boolean = Registry.`is`("python.tests.enableUniversalTests") + +/** + * To be called when project initialized to copy old configs to new one + */ +fun projectInitialized(project: Project) { + assert(project.isInitialized, { "Project is not initialized yet" }) + RunManager.getInstance(project).allConfigurationsList.filterIsInstance(PyUniversalTestConfiguration::class.java).forEach { + it.legacyConfigurationAdapter.copyFromLegacyIfNeeded() + } +} + +private fun getVirtualFileByPath(path: String): VirtualFile? { + return LocalFileSystem.getInstance().findFileByPath(path) ?: return null +} + +private fun VirtualFile.asPyFile(project: Project): PyFile? { + assert(project.isInitialized, { "This function can't be used on uninitialized project" }) + if (this.isDirectory) { + return null + } + var file: PyFile? = null + + ApplicationManager.getApplication() + .invokeAndWait({ + val document = FileDocumentManager.getInstance().getDocument(this) + if (document != null) { + file = PyUtil.`as`(PsiDocumentManager.getInstance(project).getPsiFile(document), PyFile::class.java) + } + }) + return file +} + +/** + * Manages legacy-to-new configuration binding + * Attach it to new configuration and mark with [com.jetbrains.reflection.DelegationProperty] + */ +class PyUniversalTestLegacyConfigurationAdapter(newConfig: T) + : JDOMExternalizable { + + private val configManager: LegacyConfigurationManager<*, *> + + /** + * Does configuration contain legacy information or was it created as new config? + * Null is unknown + */ + private var containsLegacyInformation: Boolean? = null + + // TODO: DOC null to prevent useless save + /** + * True if configuration [containsLegacyInformation] and this information is already copied to new config, so it should not be + * copied second time. + * + * Null means "false" and used here to prevent saving useless "false" value in .xml for new configurations. + */ + @ConfigField + var legacyInformationCopiedToNew: Boolean? = null + + init { + when (newConfig) { + is PyUniversalPyTestConfiguration -> { + configManager = LegacyConfigurationManagerPyTest(newConfig) + } + is PyUniversalNoseTestConfiguration -> { + configManager = LegacyConfigurationManagerNose(newConfig) + } + is PyUniversalUnitTestConfiguration -> { + configManager = LegacyConfigurationManagerUnit(newConfig) + } + else -> { + throw IllegalAccessException("Unknown config: $newConfig") + } + } + } + + override fun readExternal(element: Element) { + configManager.legacyConfig.readExternal(element) + containsLegacyInformation = (configManager.legacyConfig.getTestType() != null) + + } + + override fun writeExternal(element: Element) { + if (containsLegacyInformation ?: return) { + configManager.legacyConfig.writeExternal(element) + } + } + + fun copyFromLegacyIfNeeded() { + if (containsLegacyInformation ?: return && !(legacyInformationCopiedToNew ?: false)) { + configManager.copyFromLegacy() + legacyInformationCopiedToNew = true + } + } +} + +/** + * Manages legacy-to-new configuration copying process + */ +private abstract class LegacyConfigurationManager< + LEGACY_CONF_T : AbstractPythonLegacyTestRunConfiguration, + out NEW_CONF_T : PyUniversalTestConfiguration + >(legacyConfFactory: PythonConfigurationFactoryBase, val newConfig: NEW_CONF_T) { + + @Suppress("UNCHECKED_CAST") // Factory-to-config mapping should be checked by developer: createTemplateConfiguration is not generic + val legacyConfig = legacyConfFactory.createTemplateConfiguration(newConfig.project) as LEGACY_CONF_T + + /** + * Checks test type to interpret target correctly. It could be function, class or method + */ + private fun getElementFromConfig(script: PyFile): PyQualifiedNameOwner? { + if (legacyConfig.testType == TestType.TEST_FUNCTION) { + return script.findTopLevelFunction(legacyConfig.methodName) + } + val clazz = script.findTopLevelClass(legacyConfig.className) ?: return null + if (legacyConfig.testType == TestType.TEST_CLASS) { + return clazz + } + return clazz.findMethodByName(legacyConfig.methodName, true, TypeEvalContext.userInitiated(legacyConfig.project, script)) + } + + /** + * Copies config from legacy to new configuration. + * Used by all runners but py.test which has very different settings + */ + open fun copyFromLegacy() { + when (legacyConfig.testType) { + TestType.TEST_CLASS, TestType.TEST_FUNCTION, TestType.TEST_METHOD -> { + val virtualFile = getVirtualFileByPath(legacyConfig.scriptName) ?: return + val pyFile = virtualFile.asPyFile(legacyConfig.project) ?: return + val qualifiedName = getElementFromConfig(pyFile)?.qualifiedName ?: return + newConfig.target.targetType = TestTargetType.PYTHON + newConfig.target.target = qualifiedName + } + TestType.TEST_FOLDER -> { + newConfig.target.targetType = TestTargetType.PATH + newConfig.target.target = legacyConfig.folderName + } + TestType.TEST_SCRIPT -> { + newConfig.target.targetType = TestTargetType.PATH + newConfig.target.target = legacyConfig.scriptName + } + else -> { + Logger.getInstance(LegacyConfigurationManager::class.java).warn("Unknown type {${legacyConfig.testType}") + } + } + } +} + + +private class LegacyConfigurationManagerPyTest(newConfig: PyUniversalPyTestConfiguration) : + LegacyConfigurationManager( + PythonTestConfigurationType.getInstance().LEGACY_PYTEST_FACTORY, newConfig) { + /** + * In Py.test target is provided as keywords, joined with "and". + * "function_foo", "MyClass" or "MyClass and my_method" could be used here. + */ + private val KEYWORDS_SPLIT_PATTERN = java.util.regex.Pattern.compile("\\s+and\\s+", java.util.regex.Pattern.CASE_INSENSITIVE) + + override fun copyFromLegacy() { + // Do not call parent since target is always provided as testToRun here + newConfig.additionalArguments = legacyConfig.params + + // Default is PATH + newConfig.target.targetType = TestTargetType.PATH + + val oldKeywords = legacyConfig.keywords + + val virtualFile = getVirtualFileByPath(legacyConfig.testToRun) ?: return + if (virtualFile.isDirectory) { + // If target is directory, then it can't point to any symbol + newConfig.target.target = virtualFile.path + newConfig.target.targetType = TestTargetType.PATH + newConfig.keywords = oldKeywords + return + } + // If it is file -- it could be file, class, method or functions (see keywords) + val script = virtualFile.asPyFile(newConfig.project) ?: return + + + val keywordsList = oldKeywords.split(KEYWORDS_SPLIT_PATTERN) + if (keywordsList.isEmpty() || keywordsList.size > 2 || keywordsList.find { it.contains(" ") } != null) { + //Give up with interpreting + newConfig.keywords = oldKeywords + newConfig.target.target = script.virtualFile.path + newConfig.target.targetType = TestTargetType.PATH + return + } + val classOrFunctionName = keywordsList[0] + val clazz = script.findTopLevelClass(classOrFunctionName) + + if (keywordsList.size == 1) { // Class or function + val classOrFunction = PyUtil.`as`(clazz ?: + script.findTopLevelFunction(classOrFunctionName), + PyQualifiedNameOwner::class.java) ?: return + newConfig.target.target = classOrFunction.qualifiedName ?: return + newConfig.target.targetType = TestTargetType.PYTHON + } + if (keywordsList.size == 2) { // Class and method + clazz ?: return + val method = clazz.findMethodByName(keywordsList[1], true, TypeEvalContext.userInitiated(newConfig.project, script)) ?: return + newConfig.target.target = method.qualifiedName ?: return + newConfig.target.targetType = TestTargetType.PYTHON + + } + + } +} +//TODO: Support "pattern" field for unittest +private class LegacyConfigurationManagerUnit(newConfig: PyUniversalUnitTestConfiguration) : + LegacyConfigurationManager( + PythonTestConfigurationType.getInstance().LEGACY_UNITTEST_FACTORY, newConfig) { + override fun copyFromLegacy() { + super.copyFromLegacy() + newConfig.additionalArguments = legacyConfig.params + } +} + + +private class LegacyConfigurationManagerNose(newConfig: PyUniversalNoseTestConfiguration) : + LegacyConfigurationManager( + PythonTestConfigurationType.getInstance().LEGACY_NOSETEST_FACTORY, newConfig) { + override fun copyFromLegacy() { + super.copyFromLegacy() + newConfig.additionalArguments = legacyConfig.params + } +} diff --git a/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTests.kt b/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTests.kt index 467e5f6e9bed..94a7d3030c2b 100644 --- a/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTests.kt +++ b/python/src/com/jetbrains/python/testing/universalTests/PyUniversalTests.kt @@ -38,7 +38,6 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.JDOMExternalizerUtil import com.intellij.openapi.util.Pair import com.intellij.openapi.util.Ref -import com.intellij.openapi.util.registry.Registry import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile @@ -56,6 +55,7 @@ import com.jetbrains.python.run.PythonConfigurationFactoryBase import com.jetbrains.python.testing.* import com.jetbrains.reflection.DelegationProperty import com.jetbrains.reflection.Properties +import com.jetbrains.reflection.Property import com.jetbrains.reflection.getProperties import org.jdom.Element import java.io.File @@ -64,13 +64,11 @@ import javax.swing.JComponent /** - * New (universal) API for test runners. - * - * @author Ilya.Kazakevich + * New configuration factories */ - - -fun isUniversalModeEnabled(): Boolean = Registry.`is`("python.tests.enableUniversalTests") +val factories: Array = arrayOf(PyUniversalUnitTestFactory, + PyUniversalPyTestFactory, + PyUniversalNoseTestFactory) internal fun getAdditionalArgumentsPropertyName() = PyUniversalTestConfiguration::additionalArguments.name @@ -79,7 +77,7 @@ internal fun getAdditionalArgumentsPropertyName() = PyUniversalTestConfiguration */ private fun findConfigurationFactoryFromSettings(module: Module): ConfigurationFactory { val name = TestRunnerService.getInstance(module).projectConfiguration - val factories = PyUniversalTestsConfigurationType.configurationFactories + val factories = PythonTestConfigurationType.getInstance().configurationFactories val configurationFactory = factories.find { it.name == name } return configurationFactory ?: factories.first() } @@ -150,6 +148,14 @@ data class ConfigurationTarget(@ConfigField var target: String, @ConfigField var } } + +/** + * To prevent legacy configuration options from clashing with new names, we add prefix + * to use for writing/reading xml + */ +private val Property.prefixedName: String + get() = "_new_" + this.getName() + /** * Parent of all new test configurations. * All config-specific fields are implemented as properties. They are saved/restored automatically and passed to GUI form. @@ -167,6 +173,10 @@ abstract class PyUniversalTestConfiguration(project: Project, val testFrameworkName = configurationFactory.name!! + @Suppress("LeakingThis") // Legacy adapter is used to support legacy configs. Leak is ok here since everything takes place in one thread + @DelegationProperty + val legacyConfigurationAdapter = PyUniversalTestLegacyConfigurationAdapter(this) + private fun getTestSpecForPythonTarget(location: Location<*>): List { if (location !is PsiLocation) { @@ -230,12 +240,18 @@ abstract class PyUniversalTestConfiguration(project: Project, override fun writeExternal(element: Element) { + // Write legacy config to preserve it + legacyConfigurationAdapter.writeExternal(element) super.writeExternal(element) val gson = Gson() getConfigFields().properties.forEach { - JDOMExternalizerUtil.writeField(element, it.getName(), gson.toJson(it.get())) + val value = it.get() + if (value != null) { + // No need to write null since null is default value + JDOMExternalizerUtil.writeField(element, it.prefixedName, gson.toJson(value)) + } } } @@ -245,11 +261,12 @@ abstract class PyUniversalTestConfiguration(project: Project, val gson = Gson() getConfigFields().properties.forEach { - val fromJson: Any? = gson.fromJson(JDOMExternalizerUtil.readField(element, it.getName()), it.getType()) + val fromJson: Any? = gson.fromJson(JDOMExternalizerUtil.readField(element, it.prefixedName), it.getType()) if (fromJson != null) { it.set(fromJson) } } + legacyConfigurationAdapter.readExternal(element) } @@ -273,37 +290,23 @@ abstract class PyUniversalTestConfiguration(project: Project, } } -object PyUniversalTestsConfigurationType : PythonTestConfigurationType() { - override fun getId() = "py_universal_tests" - - override fun getConfigurationFactories(): Array> { - if (isUniversalModeEnabled()) { - return arrayOf(PyUniversalUnitTestFactory, - PyUniversalPyTestFactory, - PyUniversalNoseTestFactory) - } - // Array can't be empty according to contract (type is fetched from first element) - return arrayOf(PyUniversalUnitTestFactory) - } -} - -// TODO: DOC abstract class PyUniversalTestFactory : PythonConfigurationFactoryBase( - PyUniversalTestsConfigurationType) { + PythonTestConfigurationType.getInstance()) { override abstract fun createTemplateConfiguration(project: Project): CONF_T } /** * Only one producer is registered with EP, but it uses factory configured by user to prdouce different configs */ -object PyUniversalTestsConfigurationProducer : RunConfigurationProducer(PyUniversalTestsConfigurationType) { +object PyUniversalTestsConfigurationProducer : RunConfigurationProducer( + PythonTestConfigurationType.getInstance()) { override fun cloneTemplateConfiguration(context: ConfigurationContext): RunnerAndConfigurationSettings { return cloneTemplateConfigurationStatic(context, findConfigurationFactoryFromSettings(context.module)) } override fun findOrCreateConfigurationFromContext(context: ConfigurationContext?): ConfigurationFromContext? { - if (!isUniversalModeEnabled()) { + if (!isNewTestsModeEnabled()) { return null } return super.findOrCreateConfigurationFromContext(context) @@ -323,7 +326,10 @@ object PyUniversalTestsConfigurationProducer : RunConfigurationProducer? { var element = baseElement diff --git a/python/src/com/jetbrains/python/testing/universalTests/PyUniversalUnitTest.kt b/python/src/com/jetbrains/python/testing/universalTests/PyUniversalUnitTest.kt index 3a77acd14afe..8ccf4c21e863 100644 --- a/python/src/com/jetbrains/python/testing/universalTests/PyUniversalUnitTest.kt +++ b/python/src/com/jetbrains/python/testing/universalTests/PyUniversalUnitTest.kt @@ -29,6 +29,7 @@ import com.jetbrains.python.testing.PythonTestConfigurationsModel * unittest */ +//TODO: Support pattern class PyUniversalUnitTestSettingsEditor(configuration: PyUniversalTestConfiguration) : PyUniversalTestSettingsEditor(PyUniversalTestForm.create(configuration)) diff --git a/python/testSrc/com/jetbrains/env/python/testing/CreateConfigurationTestTask.java b/python/testSrc/com/jetbrains/env/python/testing/CreateConfigurationTestTask.java index ef63ddcd88c9..006baf5aadfe 100644 --- a/python/testSrc/com/jetbrains/env/python/testing/CreateConfigurationTestTask.java +++ b/python/testSrc/com/jetbrains/env/python/testing/CreateConfigurationTestTask.java @@ -23,7 +23,7 @@ import com.intellij.psi.PsiElement; import com.jetbrains.env.PyExecutionFixtureTestTask; import com.jetbrains.python.sdk.InvalidSdkException; import com.jetbrains.python.sdkTools.SdkCreationType; -import com.jetbrains.python.testing.PythonTestOldConfigurationProducer; +import com.jetbrains.python.testing.PythonTestLegacyConfigurationProducer; import com.jetbrains.python.testing.TestRunnerService; import org.jetbrains.annotations.NotNull; import org.junit.Assert; @@ -43,13 +43,13 @@ class CreateConfigurationTestTask extends PyExecutionFixtureTestTask { @NotNull private final String myTestRunnerName; @NotNull - private final Class myProducer; + private final Class myProducer; /** * @param producer class of configuration producer to check * @param testRunnerName test runner name (to set as default to make sure producer launched) */ - CreateConfigurationTestTask(@NotNull final Class producer, + CreateConfigurationTestTask(@NotNull final Class producer, @NotNull final String testRunnerName) { super("/testRunner/env/createConfigurationTest/"); myProducer = producer; @@ -74,7 +74,7 @@ class CreateConfigurationTestTask extends PyExecutionFixtureTestTask { private void checkConfigurationCreatedFrom(@NotNull final PsiElement element) { - final PythonTestOldConfigurationProducer producer = createProducer(); + final PythonTestLegacyConfigurationProducer producer = createProducer(); final ConfigurationFromContext context = producer.createConfigurationFromContext(new ConfigurationContext(element)); Assert.assertNotNull(String.format("Failed to create context for %s", myTestRunnerName), context); @@ -82,7 +82,7 @@ class CreateConfigurationTestTask extends PyExecutionFixtureTestTask { } @NotNull - private PythonTestOldConfigurationProducer createProducer() { + private PythonTestLegacyConfigurationProducer createProducer() { try { return myProducer.getConstructor().newInstance(); } diff --git a/python/testSrc/com/jetbrains/env/ut/PyDocTestProcessRunner.java b/python/testSrc/com/jetbrains/env/ut/PyDocTestProcessRunner.java index 2ff7cc6a7d9b..0e4ca2cd8cea 100644 --- a/python/testSrc/com/jetbrains/env/ut/PyDocTestProcessRunner.java +++ b/python/testSrc/com/jetbrains/env/ut/PyDocTestProcessRunner.java @@ -16,7 +16,7 @@ package com.jetbrains.env.ut; import com.jetbrains.env.ProcessWithConsoleRunner; -import com.jetbrains.python.testing.PythonTestOldConfigurationType; +import com.jetbrains.python.testing.PythonTestConfigurationType; import com.jetbrains.python.testing.doctest.PythonDocTestRunConfiguration; import org.jetbrains.annotations.NotNull; @@ -27,7 +27,7 @@ import org.jetbrains.annotations.NotNull; */ public class PyDocTestProcessRunner extends PyScriptTestProcessRunner { public PyDocTestProcessRunner(@NotNull final String scriptName, final int timesToRerunFailedTests) { - super(PythonTestOldConfigurationType.getInstance().PY_DOCTEST_FACTORY, + super(PythonTestConfigurationType.getInstance().PY_DOCTEST_FACTORY, PythonDocTestRunConfiguration.class, scriptName, timesToRerunFailedTests); } } diff --git a/python/testSrc/com/jetbrains/env/ut/PyNoseTestProcessRunner.java b/python/testSrc/com/jetbrains/env/ut/PyNoseTestProcessRunner.java index cc7586fd5151..fdb654a66069 100644 --- a/python/testSrc/com/jetbrains/env/ut/PyNoseTestProcessRunner.java +++ b/python/testSrc/com/jetbrains/env/ut/PyNoseTestProcessRunner.java @@ -16,7 +16,7 @@ package com.jetbrains.env.ut; import com.jetbrains.env.ProcessWithConsoleRunner; -import com.jetbrains.python.testing.PythonTestOldConfigurationType; +import com.jetbrains.python.testing.PythonTestConfigurationType; import com.jetbrains.python.testing.nosetest.PythonNoseTestRunConfiguration; import org.jetbrains.annotations.NotNull; @@ -27,7 +27,7 @@ import org.jetbrains.annotations.NotNull; */ public class PyNoseTestProcessRunner extends PyScriptTestProcessRunner { public PyNoseTestProcessRunner(@NotNull final String scriptName, final int timesToRerunFailedTests) { - super(PythonTestOldConfigurationType.getInstance().PY_NOSETEST_FACTORY, + super(PythonTestConfigurationType.getInstance().LEGACY_NOSETEST_FACTORY, PythonNoseTestRunConfiguration.class, scriptName, timesToRerunFailedTests); } } diff --git a/python/testSrc/com/jetbrains/env/ut/PyTestTestProcessRunner.java b/python/testSrc/com/jetbrains/env/ut/PyTestTestProcessRunner.java index 35ac7bd27e4e..485386c54e8d 100644 --- a/python/testSrc/com/jetbrains/env/ut/PyTestTestProcessRunner.java +++ b/python/testSrc/com/jetbrains/env/ut/PyTestTestProcessRunner.java @@ -16,7 +16,7 @@ package com.jetbrains.env.ut; import com.jetbrains.env.ProcessWithConsoleRunner; -import com.jetbrains.python.testing.PythonTestOldConfigurationType; +import com.jetbrains.python.testing.PythonTestConfigurationType; import com.jetbrains.python.testing.pytest.PyTestRunConfiguration; import org.jetbrains.annotations.NotNull; @@ -29,7 +29,7 @@ import java.io.IOException; */ public class PyTestTestProcessRunner extends PyScriptTestProcessRunner { public PyTestTestProcessRunner(@NotNull final String scriptName, final int timesToRerunFailedTests) { - super(PythonTestOldConfigurationType.getInstance().PY_PYTEST_FACTORY, + super(PythonTestConfigurationType.getInstance().LEGACY_PYTEST_FACTORY, PyTestRunConfiguration.class, scriptName, timesToRerunFailedTests); } diff --git a/python/testSrc/com/jetbrains/env/ut/PyUnitTestProcessRunner.java b/python/testSrc/com/jetbrains/env/ut/PyUnitTestProcessRunner.java index c10387467f8d..d902dba6ccae 100644 --- a/python/testSrc/com/jetbrains/env/ut/PyUnitTestProcessRunner.java +++ b/python/testSrc/com/jetbrains/env/ut/PyUnitTestProcessRunner.java @@ -16,7 +16,7 @@ package com.jetbrains.env.ut; import com.jetbrains.env.ProcessWithConsoleRunner; -import com.jetbrains.python.testing.PythonTestOldConfigurationType; +import com.jetbrains.python.testing.PythonTestConfigurationType; import com.jetbrains.python.testing.unittest.PythonUnitTestRunConfiguration; import org.jetbrains.annotations.NotNull; @@ -27,7 +27,7 @@ import org.jetbrains.annotations.NotNull; */ public class PyUnitTestProcessRunner extends PyScriptTestProcessRunner { public PyUnitTestProcessRunner(@NotNull final String scriptName, final int timesToRerunFailedTests) { - super(PythonTestOldConfigurationType.getInstance().PY_UNITTEST_FACTORY, + super(PythonTestConfigurationType.getInstance().LEGACY_UNITTEST_FACTORY, PythonUnitTestRunConfiguration.class, scriptName, timesToRerunFailedTests); } } diff --git a/python/testSrc/com/jetbrains/env/ut/PyUnitTestTask.java b/python/testSrc/com/jetbrains/env/ut/PyUnitTestTask.java index 80a33a31e14d..242ef76f54b2 100644 --- a/python/testSrc/com/jetbrains/env/ut/PyUnitTestTask.java +++ b/python/testSrc/com/jetbrains/env/ut/PyUnitTestTask.java @@ -40,8 +40,8 @@ import com.jetbrains.python.PyNames; import com.jetbrains.python.sdk.PythonEnvUtil; import com.jetbrains.python.sdk.flavors.JythonSdkFlavor; import com.jetbrains.python.sdk.flavors.PythonSdkFlavor; -import com.jetbrains.python.testing.AbstractPythonOldTestRunConfiguration; -import com.jetbrains.python.testing.PythonTestOldConfigurationType; +import com.jetbrains.python.testing.AbstractPythonLegacyTestRunConfiguration; +import com.jetbrains.python.testing.PythonTestConfigurationType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.Assert; @@ -154,7 +154,7 @@ public abstract class PyUnitTestTask extends PyExecutionFixtureTestTask { @Override public void runTestOn(String sdkHome) throws Exception { final Project project = getProject(); - final ConfigurationFactory factory = PythonTestOldConfigurationType.getInstance().PY_UNITTEST_FACTORY; + final ConfigurationFactory factory = PythonTestConfigurationType.getInstance().LEGACY_UNITTEST_FACTORY; runConfiguration(factory, sdkHome, project); } @@ -162,7 +162,7 @@ public abstract class PyUnitTestTask extends PyExecutionFixtureTestTask { final RunnerAndConfigurationSettings settings = RunManager.getInstance(project).createRunConfiguration("test", factory); - AbstractPythonOldTestRunConfiguration config = (AbstractPythonOldTestRunConfiguration)settings.getConfiguration(); + AbstractPythonLegacyTestRunConfiguration config = (AbstractPythonLegacyTestRunConfiguration)settings.getConfiguration(); config.setSdkHome(sdkHome); @@ -271,7 +271,7 @@ public abstract class PyUnitTestTask extends PyExecutionFixtureTestTask { return 60000; } - protected void configure(AbstractPythonOldTestRunConfiguration config) { + protected void configure(AbstractPythonLegacyTestRunConfiguration config) { } /** diff --git a/python/testSrc/com/jetbrains/python/PythonRunConfigurationTest.java b/python/testSrc/com/jetbrains/python/PythonRunConfigurationTest.java index 40afc8f1c850..420d9bc4b8ce 100644 --- a/python/testSrc/com/jetbrains/python/PythonRunConfigurationTest.java +++ b/python/testSrc/com/jetbrains/python/PythonRunConfigurationTest.java @@ -18,7 +18,7 @@ package com.jetbrains.python; import com.jetbrains.python.fixtures.PyCommandLineTestCase; import com.jetbrains.python.run.PythonConfigurationType; import com.jetbrains.python.run.PythonRunConfiguration; -import com.jetbrains.python.testing.PythonTestOldConfigurationType; +import com.jetbrains.python.testing.PythonTestConfigurationType; import com.jetbrains.python.testing.unittest.PythonUnitTestRunConfiguration; import junit.framework.Assert; @@ -31,7 +31,7 @@ public class PythonRunConfigurationTest extends PyCommandLineTestCase { private static final String PY_SCRIPT = "foo.py"; public void testUnitTestCommandLine() { - PythonUnitTestRunConfiguration configuration = createConfiguration(PythonTestOldConfigurationType.getInstance(), + PythonUnitTestRunConfiguration configuration = createConfiguration(PythonTestConfigurationType.getInstance(), PythonUnitTestRunConfiguration.class); configuration.setScriptName(PY_SCRIPT); final List params = buildRunCommandLine(configuration);