blob: dbc05f849a497dc2994ef4574744150ae9ab51cd [file] [log] [blame]
package com.intellij.codeInsight.actions;
import com.intellij.lang.LanguageFormatting;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.PlainTextLanguage;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.testFramework.LightPlatformTestCase;
import com.intellij.testFramework.PlatformTestCase;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.picocontainer.MutablePicoContainer;
import java.io.IOException;
import java.util.Collection;
import java.util.Set;
import static com.intellij.psi.search.GlobalSearchScopesCore.directoryScope;
public class ReformatFilesWithFiltersTest extends LightPlatformTestCase {
private static final String TEMP_DIR_NAME = "dir";
private PsiDirectory myWorkingDirectory;
private MockCodeStyleManager myMockCodeStyleManager;
private MockPlainTextFormattingModelBuilder myMockPlainTextFormattingModelBuilder;
private CodeStyleManager myRealCodeStyleManger;
@Override
public void setUp() throws Exception {
PlatformTestCase.initPlatformLangPrefix();
super.setUp();
myWorkingDirectory = TestFileStructure.createDirectory(getProject(), getSourceRoot(), TEMP_DIR_NAME);
myRealCodeStyleManger = CodeStyleManager.getInstance(getProject());
myMockCodeStyleManager = new MockCodeStyleManager();
registerCodeStyleManager(myMockCodeStyleManager);
myMockPlainTextFormattingModelBuilder = new MockPlainTextFormattingModelBuilder();
LanguageFormatting.INSTANCE.addExplicitExtension(PlainTextLanguage.INSTANCE, myMockPlainTextFormattingModelBuilder);
}
@Override
public void tearDown() throws Exception {
registerCodeStyleManager(myRealCodeStyleManger);
LanguageFormatting.INSTANCE.removeExplicitExtension(PlainTextLanguage.INSTANCE, myMockPlainTextFormattingModelBuilder);
TestFileStructure.delete(myWorkingDirectory.getVirtualFile());
super.tearDown();
}
private static void registerCodeStyleManager(@NotNull CodeStyleManager manager) {
String componentKey = CodeStyleManager.class.getName();
MutablePicoContainer container = (MutablePicoContainer)getProject().getPicoContainer();
container.unregisterComponent(componentKey);
container.registerComponentInstance(componentKey, manager);
}
public void testReformatWithoutMask() throws IOException {
TestFileStructure fileTree = new TestFileStructure(getModule(), myWorkingDirectory);
PsiFile java1 = fileTree.addTestFile("Test.java", "empty content");
PsiFile java2 = fileTree.addTestFile("Pair.java", "empty content");
PsiFile java3 = fileTree.addTestFile("Pair2.java", "empty content");
PsiFile php = fileTree.addTestFile("Test.php", "empty content");
PsiFile js = fileTree.addTestFile("Test.js", "empty content");
reformatDirectoryWithFileMask(myWorkingDirectory, null);
assertWasFormatted(java1, java2, java3, php, js);
}
public void testFormatByOnlyOneMask() throws IOException {
TestFileStructure fileTree = new TestFileStructure(getModule(), myWorkingDirectory);
PsiFile java1 = fileTree.addTestFile("Test.java", "empty content");
PsiFile java2 = fileTree.addTestFile("Pair.java", "empty content");
PsiFile java3 = fileTree.addTestFile("Pair2.java", "empty content");
PsiFile php = fileTree.addTestFile("Test.php", "empty content");
PsiFile js = fileTree.addTestFile("Test.js", "empty content");
reformatDirectoryWithFileMask(myWorkingDirectory, "*.java");
assertWasFormatted(java1, java2, java3);
assertWasNotFormatted(php, js);
reformatDirectoryWithFileMask(myWorkingDirectory, "*.js");
assertWasFormatted(js);
assertWasNotFormatted(java1, java2, java3, php);
}
public void testFormatByMultiMask() throws IOException {
TestFileStructure fileTree = new TestFileStructure(getModule(), myWorkingDirectory);
PsiFile java1 = fileTree.addTestFile("Test.java", "empty content");
PsiFile java2 = fileTree.addTestFile("Pair.java", "empty content");
PsiFile java3 = fileTree.addTestFile("Pair2.java", "empty content");
PsiFile php1 = fileTree.addTestFile("Test.php", "empty content");
PsiFile php2 = fileTree.addTestFile("Test2.php", "empty content");
PsiFile js1 = fileTree.addTestFile("Test1.js", "empty content");
PsiFile js2 = fileTree.addTestFile("Test2.js", "empty content");
PsiFile js3 = fileTree.addTestFile("Test3.js", "empty content");
PsiFile py1 = fileTree.addTestFile("Test1.py", "empty content");
PsiFile py2 = fileTree.addTestFile("Test2.py", "empty content");
PsiFile py3 = fileTree.addTestFile("Test3.py", "empty content");
reformatDirectoryWithFileMask(myWorkingDirectory, "*.js, *.java");
assertWasFormatted(js1, js2, js3, java1, java2, java3);
assertWasNotFormatted(php1, php2, py1, py2, py3);
reformatDirectoryWithFileMask(myWorkingDirectory, "*.php, *.js");
assertWasFormatted(js1, js2, js3, php1, php2);
assertWasNotFormatted(java1, java2, java3, py1, py2, py3);
reformatDirectoryWithFileMask(myWorkingDirectory, "*.js, *.php, *.java");
assertWasFormatted(js1, js2, js3, php1, php2, java1, java2, java3);
assertWasNotFormatted(py1, py2, py3);
reformatDirectoryWithFileMask(myWorkingDirectory, "*.js, *.php, *.java, *.py");
assertWasFormatted(js1, js2, js3, php1, php2, java1, java2, java3, py1, py2, py3);
reformatDirectoryWithFileMask(myWorkingDirectory, "*.jsp, *.dart");
assertWasNotFormatted(js1, js2, js3, php1, php2, java1, java2, java3, py1, py2, py3);
}
public void testDirectoryScope() throws IOException {
TestFileStructure fileTree = new TestFileStructure(getModule(), myWorkingDirectory);
PsiFile java1 = fileTree.addTestFile("Test1.java", "empty content");
PsiFile php1 = fileTree.addTestFile("Pair1.php", "empty content");
PsiFile js1 = fileTree.addTestFile("Pair1.js", "empty content");
PsiDirectory outer = fileTree.createDirectoryAndMakeItCurrent("toFormat");
PsiFile java2 = fileTree.addTestFile("Test2.java", "empty content");
PsiFile php2 = fileTree.addTestFile("Pair2.php", "empty content");
PsiFile js2 = fileTree.addTestFile("Pair2.js", "empty content");
PsiDirectory inner = fileTree.createDirectoryAndMakeItCurrent("toFormat");
PsiFile java3 = fileTree.addTestFile("Test3.java", "empty content");
PsiFile php3 = fileTree.addTestFile("Pair3.php", "empty content");
PsiFile js3 = fileTree.addTestFile("Pair3.js", "empty content");
reformatDirectoryWithScopeFilter(myWorkingDirectory, directoryScope(outer, true));
assertWasFormatted(java2, php2, js2, java3, php3, js3);
assertWasNotFormatted(java1, php1, js1);
reformatDirectoryWithScopeFilter(myWorkingDirectory, directoryScope(outer, false));
assertWasFormatted(java2, php2, js2);
assertWasNotFormatted(java1, php1, js1, java3, php3, js3);
reformatDirectoryWithScopeFilter(myWorkingDirectory, directoryScope(inner, true));
assertWasFormatted(java3, php3, js3);
assertWasNotFormatted(java1, php1, js1, java2, php2, js2);
reformatDirectoryWithScopeFilter(myWorkingDirectory, directoryScope(myWorkingDirectory, false).union(directoryScope(inner, false)));
assertWasFormatted(java3, php3, js3, java1, php1, js1);
assertWasNotFormatted(java2, php2, js2);
}
public void testDirectoryScopeWithMask() throws IOException {
TestFileStructure fileTree = new TestFileStructure(getModule(), myWorkingDirectory);
PsiFile java1 = fileTree.addTestFile("Test1.java", "empty content");
PsiFile php1 = fileTree.addTestFile("Pair1.php", "empty content");
PsiFile js1 = fileTree.addTestFile("Pair1.js", "empty content");
PsiDirectory outer = fileTree.createDirectoryAndMakeItCurrent("toFormat");
PsiFile java2 = fileTree.addTestFile("Test2.java", "empty content");
PsiFile php2 = fileTree.addTestFile("Pair2.php", "empty content");
PsiFile js2 = fileTree.addTestFile("Pair2.js", "empty content");
PsiDirectory inner = fileTree.createDirectoryAndMakeItCurrent("toFormat");
PsiFile java3 = fileTree.addTestFile("Test3.java", "empty content");
PsiFile php3 = fileTree.addTestFile("Pair3.php", "empty content");
PsiFile js3 = fileTree.addTestFile("Pair3.js", "empty content");
reformatDirectory(myWorkingDirectory, "*.js", directoryScope(outer, true));
assertWasFormatted(js2, js3);
assertWasNotFormatted(java1, php1, js1, java2, php2, java3, php3);
reformatDirectory(myWorkingDirectory, "*.js", directoryScope(myWorkingDirectory, false));
assertWasFormatted(js1);
assertWasNotFormatted(js2, js3, java1, php1, java2, php2, java3, php3);
reformatDirectory(myWorkingDirectory, "*.java, *.php", directoryScope(myWorkingDirectory, false).union(directoryScope(inner, false)));
assertWasFormatted(java1, php1, java3, php3);
assertWasNotFormatted(java2, php2, js1, js2, js3);
}
public void testIDEA126830() throws IOException {
TestFileStructure fileTree = new TestFileStructure(getModule(), myWorkingDirectory);
fileTree.createDirectoryAndMakeItCurrent("src");
PsiFile java2 = fileTree.addTestFile("Test2.tj", "empty content");
PsiFile php2 = fileTree.addTestFile("Pair2.php", "empty content");
PsiFile js2 = fileTree.addTestFile("Pair2.js", "empty content");
PsiDirectory test = fileTree.createDirectoryAndMakeItCurrent("test");
PsiFile testJava1 = fileTree.addTestFile("testJava1.tj", "empty content");
PsiFile testPhp1 = fileTree.addTestFile("testPhp1.php", "empty content");
PsiFile testJs1 = fileTree.addTestFile("testJs1.js", "empty content");
GlobalSearchScope testScope = directoryScope(test, true);
reformatAndOptimize(myWorkingDirectory, testScope);
assertWasFormatted(testJava1, testPhp1, testJs1);
assertWasNotFormatted(java2, php2, js2);
}
public void assertWasFormatted(PsiFile... files) {
final Set<PsiFile> formattedFiles = myMockCodeStyleManager.getFormattedFiles();
for (PsiFile file : files) {
assertTrue(file.getName() + " should be formatted", formattedFiles.contains(file));
}
}
public void assertWasNotFormatted(PsiFile... files) {
final Set<PsiFile> formattedFiles = myMockCodeStyleManager.getFormattedFiles();
for (PsiFile file : files) {
assertTrue(file.getName() + " should not be formatted", !formattedFiles.contains(file));
}
}
public void reformatDirectoryWithFileMask(@NotNull PsiDirectory directory, @Nullable String mask) {
reformatDirectory(directory, mask, null);
}
public void reformatDirectoryWithScopeFilter(@NotNull PsiDirectory directory, @Nullable SearchScope scope) {
reformatDirectory(directory, null, scope);
}
public void reformatWithRearrange(@NotNull PsiDirectory directory, @Nullable SearchScope scope) {
myMockCodeStyleManager.clearFormattedFiles();
AbstractLayoutCodeProcessor processor = new ReformatCodeProcessor(getProject(), directory, true, false);
ReformatCodeAction.registerScopeFilter(processor, scope);
processor = new RearrangeCodeProcessor(processor, null);
processor.run();
}
private void reformatAndOptimize(@NotNull PsiDirectory workingDirectory, @NotNull GlobalSearchScope scope) {
myMockCodeStyleManager.clearFormattedFiles();
AbstractLayoutCodeProcessor processor = new ReformatCodeProcessor(getProject(), workingDirectory, true, false);
ReformatCodeAction.registerScopeFilter(processor, scope);
processor = new OptimizeImportsProcessor(processor);
processor.run();
}
public void reformatDirectory(@NotNull PsiDirectory directory, @Nullable String mask, @Nullable SearchScope scope) {
myMockCodeStyleManager.clearFormattedFiles();
ReformatCodeProcessor processor = new ReformatCodeProcessor(getProject(), directory, true, false);
ReformatCodeAction.registerFileMaskFilter(processor, mask);
ReformatCodeAction.registerScopeFilter(processor, scope);
processor.run();
}
}