move tests for scopes into the community project

This commit is contained in:
Sergey Ignatov
2018-10-23 15:53:31 +03:00
parent 2ca275ab97
commit 4954d971af
16 changed files with 897 additions and 0 deletions
@@ -0,0 +1,4 @@
package pack;
class AbaB{
}
@@ -0,0 +1,4 @@
package pack;
class Ba{
}
@@ -0,0 +1,4 @@
package pack1;
class Out {
}
@@ -0,0 +1,4 @@
package pack1.pack2;
class In {
}
@@ -0,0 +1,3 @@
class Test {
}
@@ -0,0 +1,3 @@
package package1;
class Test1 {
}
@@ -0,0 +1,4 @@
package package1.package2.package3;
class Test3 {
}
@@ -0,0 +1,576 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.projectView;
import com.intellij.ide.IdeView;
import com.intellij.ide.projectView.ProjectView;
import com.intellij.ide.projectView.impl.AbstractProjectViewPane;
import com.intellij.ide.projectView.impl.ProjectViewImpl;
import com.intellij.ide.projectView.impl.ProjectViewSharedSettings;
import com.intellij.ide.scopeView.ScopeTreeViewPanel;
import com.intellij.ide.scopeView.ScopeViewPane;
import com.intellij.idea.Bombed;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Disposer;
import com.intellij.psi.*;
import com.intellij.psi.search.scope.ProjectFilesScope;
import com.intellij.psi.search.scope.ProjectProductionScope;
import com.intellij.psi.search.scope.packageSet.FilePatternPackageSet;
import com.intellij.psi.search.scope.packageSet.NamedScope;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesProcessor;
import com.intellij.refactoring.move.moveClassesOrPackages.SingleSourceRootMoveDestination;
import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesProcessor;
import com.intellij.refactoring.rename.RenameProcessor;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.TestSourceBasedTestCase;
import com.intellij.util.xmlb.XmlSerializerUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Calendar;
public class ScopeViewPaneTest extends TestSourceBasedTestCase {
private static final int DELAY = 200;
@Override
public void setUp() throws Exception {
super.setUp();
restoreProjectViewDefaultSettings();
}
@Override
public void tearDown() throws Exception {
try {
restoreProjectViewDefaultSettings();
}
finally {
super.tearDown();
}
}
private static void restoreProjectViewDefaultSettings() {
XmlSerializerUtil.copyBean(new ProjectViewSharedSettings(), ProjectViewSharedSettings.Companion.getInstance());
}
@Bombed(user = "SAM", year = 2019, month = Calendar.JUNE, day = 1)
public void testStructure() {
final Project project = getProject();
final ProjectViewImpl view = (ProjectViewImpl)ProjectView.getInstance(project);
changeView(view, ProjectProductionScope.INSTANCE);
final AbstractProjectViewPane pane = view.getCurrentProjectViewPane();
final PsiDirectory src = getContentDirectory().findSubdirectory("src");
assert src != null;
final PsiDirectory directory1 = src.findSubdirectory("package1");
assert directory1 != null;
final PsiDirectory directory2 = directory1.findSubdirectory("package2");
assert directory2 != null;
final PsiDirectory directory = directory2.findSubdirectory("package3");
assert directory != null;
final PsiFile psiFile = directory.findFile("Test3.java");
assert psiFile != null;
pane.select(psiFile, psiFile.getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2/package3\n" +
" Test3\n" +
" Test1\n" +
" Test\n", false);
final PsiPackage psiPackage = JavaDirectoryService.getInstance().getPackage(directory);
assert psiPackage != null;
WriteCommandAction.runWriteCommandAction(null, () -> psiPackage.getClasses()[0].delete());
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" Test1\n" +
" Test\n", false);
final PsiJavaFile psiFile1 = (PsiJavaFile)directory1.findFile("Test1.java");
assert psiFile1 != null;
final PsiClass aClass = psiFile1.getClasses()[0];
new RenameProcessor(myProject, aClass, "Test111", false, false).run();
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" Test111\n" +
" Test\n", false);
final PsiClass aClass1 = JavaDirectoryService.getInstance().createClass(directory1, "Class");
pane.select(aClass1, aClass1.getContainingFile().getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" Class\n" +
" Test111\n" +
" Test\n", false);
new MoveClassesOrPackagesProcessor(myProject,
new PsiElement[]{aClass1},
new SingleSourceRootMoveDestination(PackageWrapper.create(JavaDirectoryService
.getInstance()
.getPackage(directory)),
directory),
false, false, null).run();
pane.select(aClass1, aClass1.getContainingFile().getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2/package3\n" +
" Class\n" +
" Test111\n" +
" Test\n", false);
final PsiFile textFile = WriteCommandAction.runWriteCommandAction(null, (Computable<PsiFile>)() -> directory2.createFile("t.txt"));
pane.select(textFile, textFile.getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2\n" +
" -package3\n" +
" Class\n" +
" t.txt\n" +
" Test111\n" +
" Test\n", false);
new MoveFilesOrDirectoriesProcessor(myProject, new PsiElement[]{textFile}, directory, false, false, null, null).run();
pane.select(textFile, textFile.getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2/package3\n" +
" Class\n" +
" t.txt\n" +
" Test111\n" +
" Test\n", false);
final PsiDirectory emptyDir = WriteCommandAction.runWriteCommandAction(null,
(Computable<PsiDirectory>)() -> directory2.createSubdirectory("emptyDir"));
final IdeView data = (IdeView)pane.getData(LangDataKeys.IDE_VIEW.getName());
assert data != null;
data.selectElement(emptyDir);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2\n" +
" emptyDir\n" +
" -package3\n" +
" Class\n" +
" t.txt\n" +
" Test111\n" +
" Test\n", false);
Disposer.dispose(pane);
}
public void testInScope() {
ScopeTreeViewPanel pane = null;
try {
final NamedScope namedScope = new NamedScope("sc", new FilePatternPackageSet(null, "*/Test3*"));
pane = new ScopeTreeViewPanel(getProject()){
@Override
protected NamedScope getCurrentScope() {
return namedScope;
}
};
pane.initListeners();
final ProjectViewImpl view = (ProjectViewImpl)ProjectView.getInstance(getProject());
changeView(view, ProjectFilesScope.INSTANCE);
view.setHideEmptyPackages(ScopeViewPane.ID, true);
pane.refreshScope(namedScope);
final PsiClass aClass = getJavaFacade().findClass("package1.package2.package3.Test3");
assert aClass != null;
pane.selectNode(aClass, aClass.getContainingFile(), true);
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1/package2/package3\n" +
" Test3\n", false);
//exclude from scope
new RenameProcessor(myProject, aClass, "ATest3", false, false).run();
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"Root\n", false);
//restore in scope
new RenameProcessor(myProject, aClass, "Test3", false, false).run();
pane.selectNode(aClass, aClass.getContainingFile(), true);
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1/package2/package3\n" +
" Test3\n", false);
final PsiPackage package3 = JavaPsiFacade.getInstance(getProject()).findPackage("package1.package2.package3");
final PsiPackage package1 = JavaPsiFacade.getInstance(getProject()).findPackage("package1");
new MoveClassesOrPackagesProcessor(myProject,
new PsiElement[]{package3},
new SingleSourceRootMoveDestination(PackageWrapper.create(package1),
package1.getDirectories()[0]),
false, false, null).run();
pane.selectNode(aClass, aClass.getContainingFile(), true);
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1/package3\n" +
" Test3\n", false);
final PsiPackage package13 = JavaPsiFacade.getInstance(getProject()).findPackage("package1.package3");
final PsiPackage package123 = JavaPsiFacade.getInstance(getProject()).findPackage("package1.package2");
new MoveClassesOrPackagesProcessor(myProject,
new PsiElement[]{package13},
new SingleSourceRootMoveDestination(PackageWrapper.create(package123),
package123.getDirectories()[0]),
false, false, null).run();
pane.selectNode(aClass, aClass.getContainingFile(), true);
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1/package2/package3\n" +
" Test3\n", false);
}
finally {
if (pane != null) {
Disposer.dispose(pane);
}
}
}
public void testInScopeNoCompacting() {
ScopeTreeViewPanel pane = null;
try {
final NamedScope namedScope = new NamedScope("sc", new FilePatternPackageSet(null, "*/Test3*"));
pane = new ScopeTreeViewPanel(getProject()){
@Override
protected NamedScope getCurrentScope() {
return namedScope;
}
};
pane.initListeners();
final ProjectViewImpl view = (ProjectViewImpl)ProjectView.getInstance(getProject());
changeView(view, ProjectFilesScope.INSTANCE);
view.setHideEmptyPackages(ScopeViewPane.ID, false);
pane.refreshScope(namedScope);
final PsiClass aClass = getJavaFacade().findClass("package1.package2.package3.Test3");
assert aClass != null;
pane.selectNode(aClass, aClass.getContainingFile(), true);
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2\n" +
" -package3\n" +
" Test3\n", false);
//exclude from scope
new RenameProcessor(myProject, aClass, "ATest3", false, false).run();
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"Root\n", false);
//restore in scope
new RenameProcessor(myProject, aClass, "Test3", false, false).run();
pane.selectNode(aClass, aClass.getContainingFile(), true);
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2\n" +
" -package3\n" +
" Test3\n", false);
final PsiPackage package3 = JavaPsiFacade.getInstance(getProject()).findPackage("package1.package2.package3");
final PsiPackage package1 = JavaPsiFacade.getInstance(getProject()).findPackage("package1");
new MoveClassesOrPackagesProcessor(myProject,
new PsiElement[]{package3},
new SingleSourceRootMoveDestination(PackageWrapper.create(package1),
package1.getDirectories()[0]),
false, false, null).run();
pane.selectNode(aClass, aClass.getContainingFile(), true);
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package3\n" +
" Test3\n", false);
final PsiPackage package13 = JavaPsiFacade.getInstance(getProject()).findPackage("package1.package3");
final PsiPackage package123 = JavaPsiFacade.getInstance(getProject()).findPackage("package1.package2");
new MoveClassesOrPackagesProcessor(myProject,
new PsiElement[]{package13},
new SingleSourceRootMoveDestination(PackageWrapper.create(package123),
package123.getDirectories()[0]),
false, false, null).run();
pane.selectNode(aClass, aClass.getContainingFile(), true);
PlatformTestUtil.waitForAlarm(DELAY);
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2\n" +
" -package3\n" +
" Test3\n", false);
}
finally {
if (pane != null) {
Disposer.dispose(pane);
}
}
}
@Bombed(user = "SAM", year = 2020, month = Calendar.JANUARY, day = 1)
public void testCompactEmptyDirectories() {
final Project project = getProject();
final ProjectViewImpl view = (ProjectViewImpl)ProjectView.getInstance(project);
changeView(view, ProjectFilesScope.INSTANCE);
view.setHideEmptyPackages(ScopeViewPane.ID, true);
final AbstractProjectViewPane pane = view.getCurrentProjectViewPane();
final PsiDirectory src = getContentDirectory().findSubdirectory("src");
assert src != null;
final PsiDirectory directory1 = src.findSubdirectory("package1");
assert directory1 != null;
final PsiDirectory directory2 = directory1.findSubdirectory("package2");
assert directory2 != null;
final PsiDirectory directory = directory2.findSubdirectory("package3");
assert directory != null;
final PsiPackage psiPackage = JavaDirectoryService.getInstance().getPackage(directory1);
assert psiPackage != null;
WriteCommandAction.runWriteCommandAction(null, () -> psiPackage.getClasses()[0].delete());
final PsiFile psiFile3 = directory.findFile("Test3.java");
assert psiFile3 != null;
pane.select(psiFile3, psiFile3.getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1/package2/package3\n" +
" Test3\n" +
" Test\n", false);
final PsiJavaFile psiFile = (PsiJavaFile)src.findFile("Test.java");
assert psiFile != null;
final PsiClass aClass111 = psiFile.getClasses()[0];
new RenameProcessor(myProject, aClass111, "Test111", false, false).run();
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1/package2/package3\n" +
" Test3\n" +
" Test111\n", false);
final PsiClass aClass = JavaDirectoryService.getInstance().createClass(directory2, "Class");
pane.select(aClass, aClass.getContainingFile().getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1/package2\n" +
" +package3\n" +
" Class\n" +
" Test111\n", false);
view.setFlattenPackages(ScopeViewPane.ID, true);
pane.select(aClass, aClass.getContainingFile().getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(),
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1/package2\n" +
" Class\n" +
" +package1/package2/package3\n" +
" Test111\n", false);
Disposer.dispose(pane);
}
@Bombed(user = "SAM", year = 2020, month = Calendar.JANUARY, day = 1)
public void testFlattenPackages() {
final Project project = getProject();
final ProjectViewImpl view = (ProjectViewImpl)ProjectView.getInstance(project);
changeView(view, ProjectFilesScope.INSTANCE);
view.setFlattenPackages(ScopeViewPane.ID, true);
final AbstractProjectViewPane pane = view.getCurrentProjectViewPane();
final PsiDirectory src = getContentDirectory().findSubdirectory("src");
assert src != null;
final PsiDirectory directory1 = src.findSubdirectory("package1");
assert directory1 != null;
final PsiDirectory directory2 = directory1.findSubdirectory("package2");
assert directory2 != null;
final PsiDirectory directory = directory2.findSubdirectory("package3");
assert directory != null;
final PsiFile psiFile = directory.findFile("Test3.java");
assert psiFile != null;
pane.select(psiFile, psiFile.getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(), "-Root\n" +
" -structure\n" +
" -src\n" +
" +package1\n" +
" -package1/package2/package3\n" +
" Test3\n" +
" Test\n", false);
final PsiPackage psiPackage = JavaDirectoryService.getInstance().getPackage(directory);
assert psiPackage != null;
ApplicationManager.getApplication().runWriteAction(() -> psiPackage.getClasses()[0].delete());
final PsiJavaFile psiFile1 = (PsiJavaFile)directory1.findFile("Test1.java");
assert psiFile1 != null;
pane.select(psiFile1, psiFile1.getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(), "-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" Test1\n" +
" Test\n", false);
final PsiClass aClass = psiFile1.getClasses()[0];
new RenameProcessor(myProject, aClass, "Test111", false, false).run();
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(), "-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" Test111\n" +
" Test\n", false);
final PsiClass aClass1 = JavaDirectoryService.getInstance().createClass(directory1, "Class");
pane.select(aClass1, aClass1.getContainingFile().getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(), "-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" Class\n" +
" Test111\n" +
" Test\n", false);
view.setHideEmptyPackages(ScopeViewPane.ID, true);
pane.select(aClass1, aClass1.getContainingFile().getVirtualFile(), true);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(), "-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" Class\n" +
" Test111\n" +
" Test\n", false);
Disposer.dispose(pane);
}
@Override
protected String getTestPath() {
return "packageSet";
}
@NotNull
@Override
protected String getTestDirectoryName() {
return "structure";
}
private static void changeView(@NotNull ProjectView view, @NotNull NamedScope scope) {
AbstractProjectViewPane pane = view.getProjectViewPaneById(ScopeViewPane.ID);
for (String id : pane.getSubIds()) {
if (id.startsWith(scope.toString())) {
view.changeViewCB(ScopeViewPane.ID, id);
assertSame("view not changed", pane, view.getCurrentProjectViewPane());
return;
}
}
fail("scope not found: " + scope);
}
}
@@ -0,0 +1,54 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.scopes;
import com.intellij.codeInsight.CodeInsightTestCase;
import com.intellij.ide.util.scopeChooser.ScopeChooserConfigurable;
import com.intellij.ide.util.scopeChooser.ScopeConfigurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.ui.MasterDetailsStateService;
import com.intellij.packageDependencies.DependencyValidationManager;
import com.intellij.psi.search.scope.packageSet.NamedScope;
import com.intellij.psi.search.scope.packageSet.PatternPackageSet;
public class ScopeConfigurableTest extends CodeInsightTestCase {
public void testModified() throws ConfigurationException {
DependencyValidationManager manager = DependencyValidationManager.getInstance(getProject());
final ScopeChooserConfigurable.ScopeChooserConfigurableState state = new ScopeChooserConfigurable.ScopeChooserConfigurableState();
NamedScope utilScope = new NamedScope("util", new PatternPackageSet( "java.util.*", PatternPackageSet.SCOPE_LIBRARY, null));
manager.addScope(utilScope);
state.myOrder.add(utilScope.getName());
NamedScope xScope = new NamedScope("xxx", new PatternPackageSet("*..*", PatternPackageSet.SCOPE_ANY, null));
manager.addScope(xScope);
state.myOrder.add(xScope.getName());
try {
ScopeChooserConfigurable configurable = new ScopeChooserConfigurable(getProject());
MasterDetailsStateService.getInstance(getProject()).setComponentState(ScopeChooserConfigurable.SCOPE_CHOOSER_CONFIGURABLE_UI_KEY, state);
configurable.reset();
assertFalse(configurable.isModified());
configurable.apply();
assertFalse(configurable.isModified());
}
finally {
manager.removeAllSets();
}
}
public void testScopeConfigurablesModified() throws ConfigurationException {
DependencyValidationManager manager = DependencyValidationManager.getInstance(getProject());
NamedScope utilscope = new NamedScope("util", new PatternPackageSet("java.util.*", PatternPackageSet.SCOPE_LIBRARY, null));
manager.addScope(utilscope);
try {
for (NamedScope scope : manager.getScopes()) {
System.out.println("scope = " + scope);
ScopeConfigurable configurable = new ScopeConfigurable(scope, true, getProject(), null);
configurable.reset();
assertFalse("Configurable " + configurable + " is modified immediately after creation", configurable.isModified());
assertTrue(!configurable.isModified());
configurable.apply();
}
}
finally {
manager.removeAllSets();
}
}
}
@@ -0,0 +1,112 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.scopes;
import com.intellij.module.ModuleGroupTestsKt;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.command.undo.UndoManager;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.module.EmptyModuleType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packageDependencies.DependencyValidationManager;
import com.intellij.packageDependencies.ui.RefactoringScopeElementListenerProvider;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.scope.packageSet.*;
import com.intellij.psi.util.PsiUtilCore;
import com.intellij.refactoring.rename.RenameUtil;
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
import com.intellij.usageView.UsageInfo;
import java.io.IOException;
public class ScopeRefactoringTest extends JavaCodeInsightFixtureTestCase {
public void testClassRename() {
doTestClassRename("src:p.A", "src:p.B");
}
public void testUnionPattern() {
doTestClassRename("src:p.A||src:p.X", "src:p.B||src:p.X");
}
public void testDoNotRenameEntryInDifferentPackage() {
doTestClassRename("src:x.p.A||src:p.A", "src:x.p.A||src:p.B");
}
public void testClassRenameWhenFilePatternIsUsed() {
doTestClassRename("file:p/A.java", "file:p/B.java");
}
private void doTestClassRename(String oldPattern, String newPattern) {
final PsiClass psiClass = myFixture.addClass("package p; public class A {}");
final VirtualFile file = PsiUtilCore.getVirtualFile(psiClass);
assertNotNull(file);
myFixture.openFileInEditor(file);
final String scopeName = "myscope";
PackageSet packageSet;
try {
packageSet = PackageSetFactory.getInstance().compile(oldPattern);
}
catch (ParsingException e) {
throw new RuntimeException(e);
}
NamedScope namedScope = new NamedScope(scopeName, packageSet);
final DependencyValidationManager validationManager = DependencyValidationManager.getInstance(getProject());
validationManager.addScope(namedScope);
WriteCommandAction.runWriteCommandAction(
getProject(),
() -> RenameUtil.doRename(psiClass, "B", UsageInfo.EMPTY_ARRAY, getProject(),
new RefactoringScopeElementListenerProvider().getListener(psiClass)));
namedScope = validationManager.getScope(scopeName);
assertNotNull(namedScope);
PackageSet value = namedScope.getValue();
assertNotNull(value);
String valueText = value.getText();
assertEquals(newPattern, valueText);
final FileEditor selectedEditor = FileEditorManager.getInstance(getProject()).getSelectedEditor(file);
UndoManager.getInstance(getProject()).undo(selectedEditor);
namedScope = validationManager.getScope(scopeName);
assertNotNull(namedScope);
value = namedScope.getValue();
assertNotNull(value);
valueText = value.getText();
assertEquals(oldPattern, valueText);
validationManager.setScopes(new NamedScope[0]);
}
public void testRenameModule() throws IOException {
String path = FileUtil.createTempDirectory("renameModuleInScope", null).getAbsolutePath();
Module module = WriteAction.compute(
() -> ModuleManager.getInstance(getProject()).newModule(path + "/m.iml", EmptyModuleType.EMPTY_MODULE));
String scopeName = "module";
NamedScopeManager.getInstance(getProject()).addScope(new NamedScope(scopeName, new FilePatternPackageSet(module.getName(), "*/")));
String newName = "newModuleName";
ModuleGroupTestsKt.renameModule(module, newName);
NamedScope scope = NamedScopeManager.getInstance(getProject()).getScope(scopeName);
assertEquals(newName, assertInstanceOf(scope.getValue(), FilePatternPackageSet.class).getModulePattern());
}
public void testRenameModuleInCompositeScope() throws IOException {
String path = FileUtil.createTempDirectory("renameModuleInScope", null).getAbsolutePath();
Module module = WriteAction.compute(
() -> ModuleManager.getInstance(getProject()).newModule(path + "/m.iml", EmptyModuleType.EMPTY_MODULE));
String scopeName = "module";
NamedScopeManager.getInstance(getProject()).addScope(new NamedScope(scopeName,
UnionPackageSet.create(
new FilePatternPackageSet(module.getName(), "*/a.txt"),
new FilePatternPackageSet(module.getName(), "*/b.txt"))));
String newName = "newModuleName";
ModuleGroupTestsKt.renameModule(module, newName);
NamedScope scope = NamedScopeManager.getInstance(getProject()).getScope(scopeName);
PackageSet firstSet = assertInstanceOf(scope.getValue(), UnionPackageSet.class).getSets()[0];
PackageSet secondSet = assertInstanceOf(scope.getValue(), UnionPackageSet.class).getSets()[1];
assertEquals(newName, assertInstanceOf(firstSet, FilePatternPackageSet.class).getModulePattern());
assertEquals(newName, assertInstanceOf(secondSet, FilePatternPackageSet.class).getModulePattern());
}
}
@@ -0,0 +1,129 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.scopes;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.module.ModifiableModuleModel;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packageDependencies.ui.DependenciesPanel;
import com.intellij.packageDependencies.ui.FileTreeModelBuilder;
import com.intellij.packageDependencies.ui.Marker;
import com.intellij.packageDependencies.ui.TreeModel;
import com.intellij.psi.PsiFile;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.TestSourceBasedTestCase;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.tree.TreeUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import java.util.HashSet;
import java.util.Set;
public class ScopeViewTest extends TestSourceBasedTestCase {
private static final Marker ALL_MARKED = new Marker() {
@Override
public boolean isMarked(@NotNull VirtualFile file) {
return true;
}
};
public void testFiles() {
final Set<PsiFile> set = new HashSet<>();
ContainerUtil.addAll(set, getPackageDirectory("package1").getFiles());
ContainerUtil.addAll(set, getPackageDirectory("package1/package2/package3").getFiles());
ContainerUtil.addAll(set, getPackageDirectory(".").getFiles());
final DependenciesPanel.DependencyPanelSettings panelSettings = new DependenciesPanel.DependencyPanelSettings();
panelSettings.UI_COMPACT_EMPTY_MIDDLE_PACKAGES = false;
panelSettings.UI_FLATTEN_PACKAGES = false;
panelSettings.UI_SHOW_FILES = true;
panelSettings.UI_FILTER_LEGALS = false;
panelSettings.UI_SHOW_MODULES = true;
panelSettings.UI_GROUP_BY_SCOPE_TYPE = false;
TreeModel model = FileTreeModelBuilder.createTreeModel(getProject(), false, set, ALL_MARKED, panelSettings);
JTree tree = new Tree();
tree.setModel(model);
TreeUtil.expandAll(tree);
PlatformTestUtil.assertTreeEqual(tree,
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2\n" +
" -package3\n" +
" Test3.java\n" +
" Test1.java\n" +
" Test.java\n");
panelSettings.UI_COMPACT_EMPTY_MIDDLE_PACKAGES = true;
model = FileTreeModelBuilder.createTreeModel(getProject(), false, set, ALL_MARKED, panelSettings);
tree.setModel(model);
TreeUtil.expandAll(tree);
TreeUtil.traverse((TreeNode)model.getRoot(), node -> {
((DefaultMutableTreeNode)node).setUserObject(node.toString());
return true;
});
PlatformTestUtil.assertTreeEqual(tree,
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" -package2/package3\n" +
" Test3.java\n" +
" Test1.java\n" +
" Test.java\n");
panelSettings.UI_FLATTEN_PACKAGES = true;
model = FileTreeModelBuilder.createTreeModel(getProject(), false, set, ALL_MARKED, panelSettings);
tree.setModel(model);
TreeUtil.expandAll(tree);
PlatformTestUtil.assertTreeEqual(tree,
"-Root\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" Test1.java\n" +
" -package1/package2/package3\n" +
" Test3.java\n" +
" Test.java\n");
}
public void testModuleGroups() throws Exception {
ModifiableModuleModel moduleModel = ModuleManager.getInstance(myProject).getModifiableModel();
moduleModel.setModuleGroupPath(myModule, new String[]{"a", "b"});
moduleModel.renameModule(myModule, "module");
WriteAction.run(moduleModel::commit);
createModule("util"); // groups aren't shown for single-module projects so we need to add an empty second module
Set<PsiFile> files = ContainerUtil.set(getPackageDirectory("package1").getFiles());
DependenciesPanel.DependencyPanelSettings settings = new DependenciesPanel.DependencyPanelSettings();
settings.UI_GROUP_BY_SCOPE_TYPE = false;
TreeModel model = FileTreeModelBuilder.createTreeModel(getProject(), false, files, ALL_MARKED, settings);
JTree tree = new Tree(model);
TreeUtil.expandAll(tree);
PlatformTestUtil.assertTreeEqual(tree, "-Root\n" +
" -a\n" +
" -b\n" +
" -module\n" +
" -structure\n" +
" -src\n" +
" -package1\n" +
" Test1.java\n");
}
@NotNull
@Override
protected String getTestDirectoryName() {
return "structure";
}
@Override
protected String getTestPath() {
return "packageSet";
}
}