| /* |
| * 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.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); |
| } |
| } |