blob: 46168ffa4020e14bd51407629099e8bd30c3944f [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jetbrains.python;
import com.google.common.collect.Lists;
import com.intellij.codeInsight.completion.impl.CamelHumpMatcher;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.Lookup;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.testFramework.PsiTestUtil;
import com.jetbrains.python.documentation.DocStringFormat;
import com.jetbrains.python.documentation.PyDocumentationSettings;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.impl.PythonLanguageLevelPusher;
import java.util.Arrays;
import java.util.List;
public class PythonCompletionTest extends PyTestCase {
private void doTest() {
CamelHumpMatcher.forceStartMatching(getTestRootDisposable());
final String testName = "completion/" + getTestName(true);
myFixture.configureByFile(testName + ".py");
myFixture.completeBasic();
myFixture.checkResultByFile(testName + ".after.py");
}
private void doMultiFileTest() {
myFixture.copyDirectoryToProject("completion/" + getTestName(true), "");
myFixture.configureByFile("a.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/" + getTestName(true) + "/a.after.py");
}
public void testLocalVar() {
doTest();
}
public void testSelfMethod() {
doTest();
}
public void testSelfField() {
doTest();
}
public void testFuncParams() {
doTest();
}
public void testFuncParamsStar() {
doTest();
}
public void testInitParams() {
doTest();
}
public void testSuperInitParams() { // PY-505
doTest();
}
public void testSuperInitKwParams() { // PY-778
doTest();
}
public void testPredefinedMethodName() {
doTest();
}
public void testPredefinedMethodNot() {
doTest();
}
public void testClassPrivate() {
doTest();
}
public void testClassPrivateNotInherited() {
doTest();
}
public void testClassPrivateNotPublic() {
doTest();
}
public void testTwoUnderscores() {
doTest();
}
public void testOneUnderscore() {
final String testName = "completion/" + getTestName(true);
myFixture.configureByFile(testName + ".py");
myFixture.completeBasic();
myFixture.type('\n');
myFixture.checkResultByFile(testName + ".after.py");
}
public void testKwParamsInCodeUsage() { //PY-1002
doTest();
}
public void testKwParamsInCodeGetUsage() { //PY-1002
doTest();
}
public void testSuperInitKwParamsNotOnlySelfAndKwArgs() { //PY-1050
doTest();
}
public void testSuperInitKwParamsNoCompletion() {
doTest();
}
public void testIsInstance() {
doTest();
}
public void testIsInstanceAssert() {
doTest();
}
public void testIsInstanceTuple() {
doTest();
}
public void testPropertyParens() { // PY-1037
doTest();
}
public void testClassNameFromVarName() {
doTest();
}
public void testClassNameFromVarNameChained() { // PY-5629
doTest();
}
public void testPropertyType() {
doTest();
}
public void testSeenMembers() { // PY-1181
final String testName = "completion/" + getTestName(true);
myFixture.configureByFile(testName + ".py");
final LookupElement[] elements = myFixture.completeBasic();
assertNotNull(elements);
assertEquals(1, elements.length);
assertEquals("children", elements[0].getLookupString());
}
public void testImportModule() {
final String testName = "completion/" + getTestName(true);
myFixture.configureByFiles(testName + ".py", "completion/someModule.py");
myFixture.completeBasic();
myFixture.checkResultByFile(testName + ".after.py");
}
public void testPy255() {
final String dirname = "completion/";
final String testName = dirname + "moduleClass";
myFixture.configureByFiles(testName + ".py", dirname + "__init__.py");
myFixture.copyDirectoryToProject(dirname + "mymodule", dirname + "mymodule");
myFixture.completeBasic();
myFixture.checkResultByFile(testName + ".after.py");
}
public void testPy874() {
final String dirname = "completion/";
final String testName = dirname + "py874";
myFixture.configureByFile(testName + ".py");
myFixture.copyDirectoryToProject(dirname + "root", dirname + "root");
myFixture.completeBasic();
myFixture.checkResultByFile(testName + ".after.py");
}
public void testClassMethod() { // PY-833
doTest();
}
public void testStarImport() {
myFixture.configureByFiles("completion/starImport/starImport.py", "completion/starImport/importSource.py");
myFixture.completeBasic();
assertSameElements(myFixture.getLookupElementStrings(), Arrays.asList("my_foo", "my_bar"));
}
public void testSlots() { // PY-1211
doTest();
}
public void testReturnType() {
doTest();
}
public void testWithType() { // PY-4198
setLanguageLevel(LanguageLevel.PYTHON26);
doTest();
}
public void testChainedCall() { // PY-1565
doTest();
}
public void testFromImportBinary() {
myFixture.copyFileToProject("completion/root/binary_mod.pyd");
myFixture.copyFileToProject("completion/root/binary_mod.so");
myFixture.configureByFiles("completion/fromImportBinary.py", "completion/root/__init__.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/fromImportBinary.after.py");
}
public void testNonExistingProperty() { // PY-1748
doTest();
}
public void testImportItself() { // PY-1895
myFixture.copyDirectoryToProject("completion/importItself/package1", "package1");
myFixture.configureFromTempProjectFile("package1/submodule1.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/importItself.after.py");
}
public void testImportedFile() { // PY-1955
final String dirname = "completion/";
myFixture.copyDirectoryToProject(dirname + "root", dirname + "root");
myFixture.configureByFile(dirname + "importedFile.py");
myFixture.completeBasic();
myFixture.checkResultByFile(dirname + "importedFile.after.py");
}
public void testImportedModule() { // PY-1956
final String dirname = "completion/";
myFixture.copyDirectoryToProject(dirname + "root", dirname + "root");
myFixture.configureByFile(dirname + "importedModule.py");
myFixture.completeBasic();
myFixture.checkResultByFile(dirname + "importedModule.after.py");
}
public void testDictKeys() { // PY-2245
doTest();
}
public void testDictKeys2() { //PY-4181
doTest();
}
public void testDictKeys3() { //PY-5546
doTest();
}
public void testNoParensForDecorator() { // PY-2210
doTest();
}
private void doTest3K() {
PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), LanguageLevel.PYTHON30);
try {
doTest();
}
finally {
PythonLanguageLevelPusher.setForcedLanguageLevel(myFixture.getProject(), null);
}
}
public void testSuperMethod() { // PY-170
doTest();
}
public void testLocalVarInDictKey() { // PY-2558
doTest();
}
public void testDictKeyPrefix() {
doTest();
}
public void testDictKeyPrefix2() { //PY-3683
doTest();
}
public void testNoIdentifiersInImport() {
doTest();
}
public void testSuperClassAttributes() {
doTest();
}
public void testSuperClassAttributesNoCompletionInFunc() {
doTest();
}
public void testRelativeImport() { // PY-2816
myFixture.copyDirectoryToProject("completion/relativeImport", "relativeImport");
myFixture.configureByFile("relativeImport/pkg/main.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/relativeImport/pkg/main.after.py");
}
public void testRelativeImportNameFromInitPy() { // PY-2816
myFixture.copyDirectoryToProject("completion/relativeImport", "relativeImport");
myFixture.configureByFile("relativeImport/pkg/name.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/relativeImport/pkg/name.after.py");
}
public void testImport() {
doTest();
}
public void testDuplicateImportKeyword() { // PY-3034
doMultiFileTest();
}
public void testImportInMiddleOfHierarchy() { // PY-3016
doMultiFileTest();
}
public void testVeryPrivate() { // PY-3246
doTest();
}
public void testReexportModules() { // PY-2385
doMultiFileTest();
}
public void testModuleDotPy() { // PY-5813
doMultiFileTest();
}
public void testHasAttr() { // PY-4423
doTest();
}
public void testEpydocParamTag() {
final PyDocumentationSettings settings = PyDocumentationSettings.getInstance(myFixture.getModule());
settings.setFormat(DocStringFormat.EPYTEXT);
try {
doTest();
}
finally {
settings.setFormat(DocStringFormat.PLAIN);
}
}
public void testEpydocTags() {
final PyDocumentationSettings settings = PyDocumentationSettings.getInstance(myFixture.getModule());
settings.setFormat(DocStringFormat.EPYTEXT);
try {
myFixture.configureByFile("completion/epydocTags.py");
myFixture.completeBasic();
final List<String> lookupElementStrings = myFixture.getLookupElementStrings();
assertNotNull(lookupElementStrings);
assertTrue(lookupElementStrings.contains("@param"));
}
finally {
settings.setFormat(DocStringFormat.PLAIN);
}
}
public void testEpydocTagsMiddle() {
final PyDocumentationSettings settings = PyDocumentationSettings.getInstance(myFixture.getModule());
settings.setFormat(DocStringFormat.EPYTEXT);
try {
myFixture.configureByFile("completion/epydocTagsMiddle.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/epydocTagsMiddle.after.py");
}
finally {
settings.setFormat(DocStringFormat.PLAIN);
}
}
public void testIdentifiersInPlainDocstring() {
final PyDocumentationSettings settings = PyDocumentationSettings.getInstance(myFixture.getModule());
settings.setFormat(DocStringFormat.PLAIN);
myFixture.configureByFile("completion/identifiersInPlainDocstring.py");
final LookupElement[] elements = myFixture.completeBasic();
assertNotNull(elements);
assertContainsElements(Lists.newArrayList(elements),
LookupElementBuilder.create("bar").withAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE));
}
public void testPep328Completion() { // PY-3409
myFixture.copyDirectoryToProject("completion/pep328", "pep328");
myFixture.configureByFile("pep328/package/subpackage1/moduleX.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/pep328/package/subpackage1/moduleX.after.py");
}
public void testImportedSubmoduleCompletion() { // PY-3227
myFixture.copyDirectoryToProject("completion/submodules", "submodules");
myFixture.configureByFile("submodules/foo.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/submodules/foo.after.py");
}
public void testFromImportedModuleCompletion() { // PY-3595
myFixture.copyDirectoryToProject("completion/py3595", "");
myFixture.configureByFile("moduleX.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/py3595/moduleX.after.py");
}
public void testExportedConstants() { // PY-3658
myFixture.copyDirectoryToProject("completion/exportedConstants", "");
myFixture.configureByFile("a.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/exportedConstants/a.after.py");
}
public void testAlias() { // PY-3672
doTest();
}
public void testDuplicateColon() { // PY-2652
doTest();
}
public void testMro() { // PY-3989
doTest();
}
public void testPrivateMemberType() { // PY-4589
doTest();
}
public void testCompleteBeforeSyntaxError() { // PY-3792
doTest();
}
// PY-4279
public void testFieldReassignment() {
doTest();
}
public void testSuperInit() { // PY-5066
doTest();
}
public void testAssignedNearby() {
doTest();
}
public void testDunderAll() {
doMultiFileTest();
}
public void testAsName() {
doMultiFileTest();
}
public void testKeywordArgumentsForImplicitCall() {
doTest();
}
public void testTypeMembers() { // PY-5311
assertFalse(doTestByText("a = 'string'\n" +
"a.<caret>").contains("mro"));
}
private List<String> doTestByText(String text) {
myFixture.configureByText(PythonFileType.INSTANCE, text);
myFixture.completeBasic();
return myFixture.getLookupElementStrings();
}
public void testDunderAllReference() { // PY-5502
doTest();
}
public void testDunderAllReferenceImport() { // PY-6306
doTest();
}
public void testOldStyleClassAttributes() {
doTest();
}
// PY-5821
public void testGlobalName() {
doTest();
}
// PY-6037
public void testExceptName() {
doTest();
}
public void testQualifiedAssignment() { // PY-6121
doTest();
}
public void testRelativeImportExcludeToplevel() { // PY-6304
setLanguageLevel(LanguageLevel.PYTHON27);
try {
myFixture.copyDirectoryToProject("completion/relativeImportExcludeToplevel", "");
myFixture.configureByFile("pack/subpack/modX.py");
myFixture.completeBasic();
final List<String> lookupElementStrings = myFixture.getLookupElementStrings();
assertNotNull(lookupElementStrings);
assertFalse(lookupElementStrings.contains("sys"));
}
finally {
setLanguageLevel(null);
}
}
// PY-2813
public void testFromNamespacePackageImport() {
doMultiFileTest();
}
// PY-6829
public void testFakeNameInQualifiedReference() {
doTest();
}
// PY-6603
public void testNoInitForSubmodules() {
doMultiFileTest();
}
public void testUnknownNewReturnType() { // PY-6671
doTest();
}
public void testDunderClass() { // PY-7327
doTest();
}
public void testArgs() { // PY-7208
doTestByText("def foo(*<caret>)");
myFixture.checkResult("def foo(*args)");
}
public void testKwArgs() { // PY-7208
doTestByText("def foo(**<caret>)");
myFixture.checkResult("def foo(**kwargs)");
}
public void testLocalImportedModule() { // PY-3668
myFixture.copyDirectoryToProject("completion/py3668", "");
myFixture.configureByFile("py3668.py");
myFixture.completeBasic();
myFixture.checkResultByFile("completion/py3668/py3668.after.py");
}
public void testDuplicateDunderAll() { // PY-6483
doTestByText("VAR = 1\nVAR = 2\n__all__ = ['<caret>']");
myFixture.checkResult("VAR = 1\n" +
"VAR = 2\n" +
"__all__ = ['VAR']");
}
// PY-7805
public void testNoUnderscoredBuiltin() {
doTest();
}
public void testParameterFromUsages() {
doTest();
}
// PY-1219
public void testReCompileMatch() {
doTest();
}
public void testReturnTypeOfCallFromUsages() {
final List<String> results = doTestByText("def f(x):\n" +
" return x\n" +
"\n" +
"f('foo').<caret>\n");
assertTrue(results.contains("lower"));
}
public void testOverwriteEqualsSign() { // PY-1337
doTestByText("def foo(school=None, kiga=None): pass\n" +
"foo(<caret>school=None)");
myFixture.type("sch");
myFixture.finishLookup(Lookup.REPLACE_SELECT_CHAR);
myFixture.checkResult("def foo(school=None, kiga=None): pass\n" +
"foo(school=None)");
}
public void testOverwriteBracket() { // PY-6095
doTestByText("bar = {'a': '1'}\n" +
"print ba<caret>['a']");
myFixture.finishLookup(Lookup.REPLACE_SELECT_CHAR);
myFixture.checkResult("bar = {'a': '1'}\n" +
"print bar<caret>['a']");
}
// PY-1860
public void testDunderMetaClass() {
doTestByText("class C(object):\n" +
" __meta<caret>\n");
myFixture.checkResult("class C(object):\n" +
" __metaclass__ = \n");
}
// PY-13140
public void testModulePrivateNamesCompletedInsideImport() {
myFixture.copyDirectoryToProject("completion/" + getTestName(true), "");
myFixture.configureByFile("a.py");
myFixture.completeBasic();
List<String> suggested = myFixture.getLookupElementStrings();
assertNotNull(suggested);
assertContainsElements(suggested, "normal_name", "_private_name", "__magic_name__");
}
// PY-4073
public void testFunctionSpecialAttributes() {
runWithLanguageLevel(LanguageLevel.PYTHON27, new Runnable() {
@Override
public void run() {
List<String> suggested = doTestByText("def func(): pass; func.func_<caret>");
assertNotNull(suggested);
assertContainsElements(suggested, PyNames.LEGACY_FUNCTION_SPECIAL_ATTRIBUTES);
suggested = doTestByText("def func(): pass; func.__<caret>");
assertNotNull(suggested);
assertContainsElements(suggested, PyNames.FUNCTION_SPECIAL_ATTRIBUTES);
assertDoesntContain(suggested, PyNames.PY3_ONLY_FUNCTION_SPECIAL_ATTRIBUTES);
}
});
}
// PY-9342
public void testBoundMethodSpecialAttributes() {
List<String> suggested = doTestByText("{}.update.im_<caret>");
assertNotNull(suggested);
assertContainsElements(suggested, PyNames.LEGACY_METHOD_SPECIAL_ATTRIBUTES);
suggested = doTestByText("{}.update.__<caret>");
assertNotNull(suggested);
assertContainsElements(suggested, PyNames.METHOD_SPECIAL_ATTRIBUTES);
assertDoesntContain(suggested, PyNames.FUNCTION_SPECIAL_ATTRIBUTES);
}
// PY-9342
public void testWeakQualifierBoundMethodAttributes() {
assertUnderscoredMethodSpecialAttributesSuggested();
}
private void assertUnderscoredMethodSpecialAttributesSuggested() {
myFixture.configureByFile("completion/" + getTestName(true) + ".py");
myFixture.completeBasic();
final List<String> suggested = myFixture.getLookupElementStrings();
assertNotNull(suggested);
assertContainsElements(suggested, PyNames.METHOD_SPECIAL_ATTRIBUTES);
assertDoesntContain(suggested, PyNames.FUNCTION_SPECIAL_ATTRIBUTES);
}
// PY-9342
public void testUnboundMethodSpecialAttributes() {
runWithLanguageLevel(LanguageLevel.PYTHON27, new Runnable() {
@Override
public void run() {
assertUnderscoredMethodSpecialAttributesSuggested();
}
});
runWithLanguageLevel(LanguageLevel.PYTHON32, new Runnable() {
@Override
public void run() {
assertUnderscoredFunctionAttributesSuggested();
}
});
}
// PY-9342
public void testStaticMethodSpecialAttributes() {
assertUnderscoredFunctionAttributesSuggested();
}
// PY-9342
public void testLambdaSpecialAttributes() {
assertUnderscoredFunctionAttributesSuggested();
}
// PY-9342
public void testReassignedMethodSpecialAttributes() {
assertUnderscoredMethodSpecialAttributesSuggested();
}
private void assertUnderscoredFunctionAttributesSuggested() {
myFixture.configureByFile("completion/" + getTestName(true) + ".py");
myFixture.completeBasic();
final List<String> suggested = myFixture.getLookupElementStrings();
assertNotNull(suggested);
assertContainsElements(suggested, PyNames.FUNCTION_SPECIAL_ATTRIBUTES);
assertDoesntContain(suggested, PyNames.METHOD_SPECIAL_ATTRIBUTES);
}
// PY-14519
public void testOsPath() {
myFixture.copyDirectoryToProject("completion/" + getTestName(true), "");
myFixture.configureByFile("a.py");
myFixture.completeBasic();
final List<String> suggested = myFixture.getLookupElementStrings();
assertNotNull(suggested);
assertContainsElements(suggested, "path");
}
// PY-14331
public void testExcludedTopLevelPackage() {
myFixture.copyDirectoryToProject("completion/" + getTestName(true), "");
myFixture.configureByFile("a.py");
PsiTestUtil.addExcludedRoot(myFixture.getModule(), myFixture.findFileInTempDir("pkg1"));
final LookupElement[] variants = myFixture.completeBasic();
assertNotNull(variants);
assertEmpty(variants);
}
// PY-14331
public void testExcludedSubPackage() {
myFixture.copyDirectoryToProject("completion/" + getTestName(true), "");
myFixture.configureByFile("a.py");
PsiTestUtil.addExcludedRoot(myFixture.getModule(), myFixture.findFileInTempDir("pkg1/subpkg1"));
final LookupElement[] variants = myFixture.completeBasic();
assertNotNull(variants);
assertEmpty(variants);
}
}