85b60df49184b2a357f6579b10799c5b19029924
[idea/community.git] / python / testSrc / com / jetbrains / python / inspections / PyUnresolvedReferencesInspectionTest.java
1 /*
2  * Copyright 2000-2013 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.jetbrains.python.inspections;
17
18 import com.intellij.codeInsight.intention.IntentionAction;
19 import com.intellij.openapi.util.JDOMUtil;
20 import com.intellij.openapi.vfs.VirtualFile;
21 import com.intellij.psi.PsiElement;
22 import com.intellij.xdebugger.impl.XSourcePositionImpl;
23 import com.jetbrains.python.debugger.PyDebuggerEditorsProvider;
24 import com.jetbrains.python.fixtures.PyInspectionTestCase;
25 import com.jetbrains.python.inspections.unresolvedReference.PyUnresolvedReferencesInspection;
26 import com.jetbrains.python.psi.LanguageLevel;
27 import com.jetbrains.python.psi.impl.PyExpressionCodeFragmentImpl;
28 import org.jdom.Element;
29 import org.jetbrains.annotations.NotNull;
30
31 /**
32  * @author yole
33  */
34 public class PyUnresolvedReferencesInspectionTest extends PyInspectionTestCase {
35
36   public void testSelfReference() {
37     doTest();
38   }
39
40   public void testUnresolvedImport() {
41     doTest();
42   }
43
44   public void testStaticMethodParameter() {  // PY-663
45     doTest();
46   }
47
48   public void testOverridesGetAttr() {  // PY-574
49     doTest();
50   }
51
52   public void testUndeclaredAttrAssign() {  // PY-906
53     doTest();
54   }
55
56   public void testSlots() {
57     doTest();
58   }
59
60   public void testSlotsSubclass() {  // PY-5939
61     doTest();
62   }
63
64   public void testImportExceptImportError() {
65     doTest();
66   }
67
68   public void testMro() {  // PY-3989
69     doTest();
70   }
71
72   public void testConditionalImports() { // PY-983
73     doMultiFileTest("a.py");
74   }
75
76   public void testHasattrGuard() { // PY-2309
77     doTest();
78   }
79
80   public void testOperators() {
81     doTest();
82   }
83
84   // PY-2308
85   public void testTypeAssertions() {
86     doTest();
87   }
88
89   public void testUnresolvedImportedModule() {  // PY-2075
90     doTest();
91   }
92
93   public void testSuperType() {  // PY-2320
94     doTest();
95   }
96
97   public void testImportFunction() {  // PY-1896
98     doTest();
99   }
100
101   public void testSuperclassAsLocal() {  // PY-5427
102     doTest();
103   }
104
105   public void testImportToContainingFile() {  // PY-4372
106     doMultiFileTest("p1/m1.py");
107   }
108
109   public void testFromImportToContainingFile() {  // PY-4371
110     doMultiFileTest("p1/m1.py");
111   }
112
113   public void testFromImportToContainingFile2() {  // PY-5945
114     doMultiFileTest("p1/m1.py");
115   }
116
117   public void testPropertyType() {  // PY-5915
118     doTest();
119   }
120
121   // PY-6316
122   public void testNestedComprehensions() {
123     doTest();
124   }
125
126   public void testCompoundDunderAll() {  // PY-6370
127     doTest();
128   }
129
130   public void testFromPackageImportBuiltin() {
131     doMultiFileTest("a.py");
132   }
133
134   // PY-2813
135   public void testNamespacePackageAttributes() {
136     doMultiFileTest("a.py");
137   }
138
139   // PY-6548
140   public void testDocstring() {
141     doTest();
142   }
143
144   public void testIvarInDocstring() {
145     doTest();
146   }
147
148   // PY-6634
149   public void testModuleAttribute() {
150     doTest();
151   }
152
153   // PY-4748
154   public void testStubAssignment() {
155     doMultiFileTest("a.py");
156   }
157
158   // PY-7022
159   public void testReturnedQualifiedReferenceUnionType() {
160     doMultiFileTest("a.py");
161   }
162
163   // PY-2668
164   public void testUnusedImportsInPackage() {
165     doMultiFileTest("p1/__init__.py");
166   }
167
168   // PY-7032
169   public void testDocstringArgsAndKwargs() {
170     doTest();
171   }
172
173   // PY-7136
174   public void testUnusedImportWithClassAttributeReassignment() {
175     doTest();
176   }
177
178   public void testGetattrAttribute() {
179     doTest();
180   }
181
182   // PY-7173
183   public void testDecoratedFunction() {
184     doTest();
185   }
186
187   // PY-7173
188   public void testDecoratedClass() {
189     doTest();
190   }
191
192   // PY-7043
193   public void testDunderPackage() {
194     doTest();
195   }
196
197   // PY-7214
198   public void testBuiltinDerivedClassAttribute() {
199     doTest();
200   }
201
202   // PY-7244
203   public void testAttributesOfGenerics() {
204     doTest();
205   }
206
207   // PY-5995
208   public void testClassInClassBody() {
209     doTest();
210   }
211
212   // PY-7315
213   public void testImportUsedInDocString() {
214     doTest();
215   }
216
217   // PY-6745
218   public void testQualNameAttribute() {
219     runWithLanguageLevel(LanguageLevel.PYTHON33, new Runnable() {
220       @Override
221       public void run() {
222         doTest();
223       }
224     });
225   }
226
227   // PY-7389
228   public void testComprehensionScope27() {
229     runWithLanguageLevel(LanguageLevel.PYTHON27, new Runnable() {
230       @Override
231       public void run() {
232         doTest();
233       }
234     });
235   }
236
237   // PY-7389
238   public void testComprehensionScope33() {
239     runWithLanguageLevel(LanguageLevel.PYTHON33, new Runnable() {
240       @Override
241       public void run() {
242         doTest();
243       }
244     });
245   }
246
247   // PY-7516
248   public void testComprehensionInParameterValue() {
249     doTest();
250   }
251
252   // PY-6617
253   public void testAugAssignmentDefinedInOuterScope() {
254     doTest();
255   }
256
257   // PY-7301
258   public void testUnresolvedBaseClass() {
259     doTest();
260   }
261
262   // PY-5427
263   public void testBaseClassAssignment() {
264     doTest();
265   }
266
267   // PY-4600
268   public void testDynamicAttrsAnnotation() {
269     doTest();
270   }
271
272   // PY-7708
273   public void testXReadLinesForOpen() {
274     doTest();
275   }
276
277   // PY-8063
278   public void testAddForListComprehension() {
279     doTest();
280   }
281
282   // PY-7805
283   public void testUnderscoredBuiltin() {
284     doTest();
285   }
286
287   // PY-9493
288   public void testSuperObjectNew() {
289     doTest();
290   }
291
292   // PY-7823
293   public void testUnresolvedTopLevelInit() {
294     doTest();
295   }
296
297   // PY-7694
298   public void testNegativeAssertType() {
299     doTest();
300   }
301
302   public void testNegativeIf() {
303     doTest();
304   }
305
306   // PY-7614
307   public void testNoseToolsDynamicMembers() {
308     doMultiFileTest("a.py");
309   }
310
311   public void testDateTodayReturnType() {
312     doMultiFileTest("a.py");
313   }
314
315   public void testObjectNewAttributes() {
316     doTest();
317   }
318
319   // PY-10006
320   public void testUnresolvedUnreachable() {
321     doTest();
322   }
323
324   public void testNullReferenceInIncompleteImport() {
325     doMultiFileTest("a.py");
326   }
327
328   // PY-10893
329   public void testCustomNewReturnInAnotherModule() {
330     doMultiFileTest("a.py");
331   }
332
333   public void testBytesIORead() {
334     doTest();
335   }
336
337   // PY-10977
338   public void testContextManagerSubclass() {
339     doTest();
340   }
341
342   // PY-11413
343   public void testReturnSelfInSuperClass() {
344     doTest();
345   }
346
347   // PY-6955
348   public void testUnusedUnresolvedModuleImported() {
349     doTest();
350   }
351
352   // PY-6955
353   public void testUnusedUnresolvedNameImported() {
354     doMultiFileTest();
355   }
356
357   // PY-6955
358   public void testUnusedUnresolvedNameImportedSeveralTimes() {
359     doMultiFileTest();
360   }
361
362   // PY-6955
363   public void testUsedUnresolvedNameImportedSeveralTimes() {
364     doMultiFileTest();
365   }
366
367   // PY-6955
368   public void testUnusedUnresolvedPackageImported() {
369     doTest();
370   }
371
372   // PY-13418
373   public void testOneUnsedOneMarked() {
374     doMultiFileTest();
375   }
376
377   // PY-13140
378   public void testPrivateModuleNames() {
379     doMultiFileTest();
380   }
381
382   // PY-9342, PY-13791
383   public void testMethodSpecialAttributes() {
384     doTest();
385   }
386
387   // PY-11472
388   public void testUnusedImportBeforeStarImport() {
389     doMultiFileTest();
390   }
391
392   // PY-13585
393   public void testUnusedImportBeforeStarDunderAll() {
394     doMultiFileTest();
395   }
396
397   // PY-12738
398   public void testNamespacePackageNameDoesntMatchFileName() {
399     doMultiFileTest();
400   }
401
402   // PY-13259
403   public void testNestedNamespacePackageName() {
404     doMultiFileTest();
405   }
406
407   // PY-11956
408   public void testIgnoredUnresolvedReferenceInUnionType() {
409     final String testName = getTestName(true);
410     final String inspectionName = getInspectionClass().getSimpleName();
411     myFixture.configureByFile("inspections/" + inspectionName + "/" + testName + ".py");
412     myFixture.enableInspections(getInspectionClass());
413     final String attrQualifiedName = "inspections." + inspectionName + "." + testName + ".A.foo";
414     final IntentionAction intentionAction = myFixture.findSingleIntention("Ignore unresolved reference '" + attrQualifiedName + "'");
415     assertNotNull(intentionAction);
416     myFixture.launchAction(intentionAction);
417     myFixture.checkHighlighting(isWarning(), isInfo(), isWeakWarning());
418   }
419
420   protected VirtualFile prepareFile() {
421     myFixture.copyDirectoryToProject(getTestDirectory(false), "");
422     return myFixture.configureByFile(getTestDirectory(false) + "/" + getTestName(true) + ".py").getVirtualFile();
423   }
424
425   protected void doEvaluateExpressionTest(@NotNull VirtualFile mainFile, @NotNull String expression, int lineNumber) {
426     PsiElement element = PyDebuggerEditorsProvider.getContextElement(myFixture.getProject(),
427                                                                      XSourcePositionImpl.create(mainFile, lineNumber));
428     final PyExpressionCodeFragmentImpl fragment = new PyExpressionCodeFragmentImpl(myFixture.getProject(), "fragment.py", expression, true);
429     fragment.setContext(element);
430     myFixture.configureFromExistingVirtualFile(fragment.getVirtualFile());
431     myFixture.enableInspections(getInspectionClass());
432     myFixture.checkHighlighting(isWarning(), isInfo(), isWeakWarning());
433   }
434
435   public void testEvaluateExpressionBuiltins() {
436     VirtualFile mainFile = prepareFile();
437     doEvaluateExpressionTest(mainFile, "len(a)", 2);
438     doEvaluateExpressionTest(mainFile, "a", 2);
439   }
440
441   public void testEvaluateExpressionInsideFunction() {
442     VirtualFile mainFile = prepareFile();
443     doEvaluateExpressionTest(mainFile, "a", 3);
444     doEvaluateExpressionTest(mainFile, "s", 3);
445   }
446
447   // PY-14309
448   public void testEvaluateExpressionClass() {
449     VirtualFile mainFile = prepareFile();
450     doEvaluateExpressionTest(mainFile, "s", 4);
451     doEvaluateExpressionTest(mainFile, "self", 4);
452     doEvaluateExpressionTest(mainFile, "self.a", 4);
453   }
454
455   // PY-13554
456   public void testDocstringTypeFromSubModule() {
457     doMultiFileTest();
458   }
459
460   // PY-13969
461   public void testStubsOfNestedClasses() {
462     doMultiFileTest();
463   }
464
465   // PY-14359, PY-14158
466   public void testInspectionSettingsSerializable() throws Exception {
467     final PyUnresolvedReferencesInspection inspection = new PyUnresolvedReferencesInspection();
468     inspection.ignoredIdentifiers.add("foo.Bar.*");
469     final Element serialized = new Element("tmp");
470     inspection.writeSettings(serialized);
471     assertTrue(JDOMUtil.writeElement(serialized).contains("foo.Bar.*"));
472   }
473
474   public void testMetaClassMembers() {
475     doTest();
476   }
477
478   // PY-14398
479   public void testImportToContainingFileInPackage() {
480     doMultiFileTest("p1/__init__.py");
481   }
482
483   // PY-11401
484   public void testNoUnresolvedReferencesForClassesWithBadMRO() {
485     doTest();
486   }
487
488   // PY-11401
489   public void testFallbackToOldStyleMROIfUnresolvedAncestorsAndC3Fails() {
490     doTest();
491   }
492
493   // PY-11401
494   public void testOverriddenMRO() {
495     doTest();
496   }
497
498   // PY-11401
499   public void testOverriddenMROInAncestors() {
500     doTest();
501   }
502
503   @NotNull
504   @Override
505   protected Class<? extends PyInspection> getInspectionClass() {
506     return PyUnresolvedReferencesInspection.class;
507   }
508 }