don't create unittest run configuration inside "if __name__ == '__main__'" block (PY-877)

This commit is contained in:
Dmitry Jemerov
2010-07-17 19:46:52 +04:00
parent ad885be9fe
commit 60e17645e3
5 changed files with 41 additions and 5 deletions
@@ -37,7 +37,7 @@ public class PythonRunConfigurationProducer extends RuntimeConfigurationProducer
Module module = ModuleUtil.findModuleForPsiElement(script);
if (module != null) {
for (RunnableScriptFilter f : Extensions.getExtensions(RunnableScriptFilter.EP_NAME)) {
if (f.isRunnableScript(script, module)) {
if (f.isRunnableScript(script, module, location)) {
return null;
}
}
@@ -1,5 +1,6 @@
package com.jetbrains.python.run;
import com.intellij.execution.Location;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.module.Module;
import com.intellij.psi.PsiFile;
@@ -14,5 +15,5 @@ import org.jetbrains.annotations.NotNull;
public interface RunnableScriptFilter {
ExtensionPointName<RunnableScriptFilter> EP_NAME = ExtensionPointName.create("Pythonid.runnableScriptFilter");
boolean isRunnableScript(PsiFile script, @NotNull Module module);
boolean isRunnableScript(PsiFile script, @NotNull Module module, Location location);
}
@@ -52,6 +52,10 @@ public class PythonUnitTestConfigurationProducer extends RuntimeConfigurationPro
}
}
if (PythonUnitTestRunnableScriptFilter.isIfNameMain(location)) {
return null;
}
settings = createConfigurationFromFolder(location);
if (settings != null) return settings;
@@ -1,8 +1,15 @@
package com.jetbrains.python.testing;
import com.intellij.execution.Location;
import com.intellij.openapi.module.Module;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.psi.PyBinaryExpression;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyFile;
import com.jetbrains.python.psi.PyIfStatement;
import com.jetbrains.python.run.RunnableScriptFilter;
import org.jetbrains.annotations.NotNull;
@@ -10,7 +17,30 @@ import org.jetbrains.annotations.NotNull;
* @author yole
*/
public class PythonUnitTestRunnableScriptFilter implements RunnableScriptFilter {
public boolean isRunnableScript(PsiFile script, @NotNull Module module) {
return script instanceof PyFile && PythonUnitTestUtil.getTestCaseClassesFromFile((PyFile) script).size() > 0;
public boolean isRunnableScript(PsiFile script, @NotNull Module module, Location location) {
return script instanceof PyFile && PythonUnitTestUtil.getTestCaseClassesFromFile((PyFile) script).size() > 0 && !isIfNameMain(location);
}
public static boolean isIfNameMain(Location location) {
PsiElement element = location.getPsiElement();
while (true) {
final PyIfStatement ifStatement = PsiTreeUtil.getParentOfType(element, PyIfStatement.class);
if (ifStatement == null) {
break;
}
element = ifStatement;
}
if (element instanceof PyIfStatement) {
PyIfStatement ifStatement = (PyIfStatement)element;
final PyExpression condition = ifStatement.getIfPart().getCondition();
if (condition instanceof PyBinaryExpression) {
PyBinaryExpression binaryExpression = (PyBinaryExpression)condition;
final PyExpression rhs = binaryExpression.getRightExpression();
return binaryExpression.getOperator() == PyTokenTypes.EQEQ &&
binaryExpression.getLeftExpression().getText().equals("__name__") &&
rhs != null && rhs.getText().contains("__main__");
}
}
return false;
}
}
@@ -1,5 +1,6 @@
package com.jetbrains.python.testing.pytest;
import com.intellij.execution.Location;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.psi.PsiFile;
@@ -15,7 +16,7 @@ import org.jetbrains.annotations.NotNull;
* @author yole
*/
public class PyTestRunnableScriptFilter implements RunnableScriptFilter {
public boolean isRunnableScript(PsiFile script, @NotNull Module module) {
public boolean isRunnableScript(PsiFile script, @NotNull Module module, Location location) {
return isPyTestInstalled(module) && isPyTestScript(script);
}