c812c354c0168a4a90bb0e1f72ed3db61d466f35
[idea/community.git] / python / testSrc / com / jetbrains / python / PyOptimizeImportsTest.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;
17
18 import com.intellij.codeInsight.actions.OptimizeImportsAction;
19 import com.intellij.ide.DataManager;
20 import com.intellij.openapi.application.WriteAction;
21 import com.intellij.openapi.projectRoots.Sdk;
22 import com.intellij.openapi.projectRoots.SdkModificator;
23 import com.intellij.openapi.roots.OrderRootType;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import com.jetbrains.python.fixtures.PyTestCase;
26 import com.jetbrains.python.sdk.PythonSdkType;
27
28 /**
29  * @author yole
30  */
31 public class PyOptimizeImportsTest extends PyTestCase {
32
33   @Override
34   protected void setUp() throws Exception {
35     super.setUp();
36     // importsFromTypingUnusedInTypeComments depends on registered TokenSetContributors
37     PythonDialectsTokenSetProvider.reset();
38   }
39
40   public void testSimple() {
41     doTest();
42   }
43
44   public void testOneOfMultiple() {
45     doTest();
46   }
47
48   public void testImportStar() {
49     doTest();
50   }
51
52   public void testImportStarOneOfMultiple() {
53     doTest();
54   }
55
56   public void testTryExcept() {
57     doTest();
58   }
59
60   public void testFromFuture() {
61     doTest();
62   }
63
64   public void testUnresolved() {  // PY-2201
65     doTest();
66   }
67   
68   public void testSuppressed() {  // PY-5228
69     doTest();
70   }
71
72   public void testSplit() {
73     doTest();
74   }
75
76   public void testOrderByType() {
77     doTest();
78   }
79
80   // PY-12018
81   public void testAlphabeticalOrder() {
82     doTest();
83   }
84
85   public void testInsertBlankLines() {  // PY-8355
86     doTest();
87   }
88
89   // PY-16351
90   public void testNoExtraBlankLineAfterImportBlock() {
91     final String testName = getTestName(true);
92     myFixture.copyDirectoryToProject(testName, "");
93     myFixture.configureByFile("main.py");
94     OptimizeImportsAction.actionPerformedImpl(DataManager.getInstance().getDataContext(myFixture.getEditor().getContentComponent()));
95     myFixture.checkResultByFile(testName + "/main.after.py");
96   }
97
98   // PY-18521
99   public void testImportsFromTypingUnusedInTypeComments() {
100     myFixture.copyDirectoryToProject("../typing", "");
101     doTest();
102   }
103
104   // PY-18970
105   public void testLibraryRootInsideProject() {
106     final String testName = getTestName(true);
107     myFixture.copyDirectoryToProject(testName, "");
108     final VirtualFile libDir = myFixture.findFileInTempDir("lib");
109     assertNotNull(libDir);
110
111     final Sdk sdk = PythonSdkType.findPythonSdk(myFixture.getModule());
112     assertNotNull(sdk);
113     WriteAction.run(() -> {
114       final SdkModificator modificator = sdk.getSdkModificator();
115       assertNotNull(modificator);
116       modificator.addRoot(libDir, OrderRootType.CLASSES);
117       modificator.commitChanges();
118     });
119
120     try {
121       myFixture.configureByFile("main.py");
122       OptimizeImportsAction.actionPerformedImpl(DataManager.getInstance().getDataContext(myFixture.getEditor().getContentComponent()));
123       myFixture.checkResultByFile(testName + "/main.after.py");
124     }
125     finally {
126       //noinspection ThrowFromFinallyBlock
127       WriteAction.run(() -> {
128         final SdkModificator modificator = sdk.getSdkModificator();
129         assertNotNull(modificator);
130         modificator.removeRoot(libDir, OrderRootType.CLASSES);
131         modificator.commitChanges();
132       });
133     }
134   }
135
136   private void doTest() {
137     myFixture.configureByFile(getTestName(true) + ".py");
138     OptimizeImportsAction.actionPerformedImpl(DataManager.getInstance().getDataContext(myFixture.getEditor().getContentComponent()));
139     myFixture.checkResultByFile(getTestName(true) + ".after.py");
140   }
141
142   @Override
143   protected String getTestDataPath() {
144     return super.getTestDataPath() + "/optimizeImports";
145   }
146 }