summaryrefslogtreecommitdiff
path: root/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java')
-rw-r--r--java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java193
1 files changed, 193 insertions, 0 deletions
diff --git a/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java
new file mode 100644
index 000000000000..2d4c2118c040
--- /dev/null
+++ b/java/typeMigration/test/com/intellij/refactoring/TypeMigrationTestBase.java
@@ -0,0 +1,193 @@
+package com.intellij.refactoring;
+
+import com.intellij.openapi.command.WriteCommandAction;
+import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiField;
+import com.intellij.psi.PsiType;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.search.LocalSearchScope;
+import com.intellij.refactoring.typeMigration.TypeMigrationProcessor;
+import com.intellij.refactoring.typeMigration.TypeMigrationRules;
+import com.intellij.testFramework.PlatformTestUtil;
+import com.intellij.usageView.UsageInfo;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+
+/**
+ * @author anna
+ * Date: 30-Apr-2008
+ */
+public abstract class TypeMigrationTestBase extends MultiFileTestCase {
+ @Override
+ protected String getTestDataPath() {
+ return PlatformTestUtil.getCommunityPath() + "/java/typeMigration/testData";
+ }
+
+ protected void doTestFieldType(@NonNls String fieldName, PsiType fromType, PsiType toType) {
+ doTestFieldType(fieldName, "Test", fromType, toType);
+ }
+
+ protected void doTestFieldType(@NonNls final String fieldName, String className, final PsiType rootType, final PsiType migrationType) {
+ final RulesProvider provider = new RulesProvider() {
+ @Override
+ public TypeMigrationRules provide() throws Exception {
+ final TypeMigrationRules rules = new TypeMigrationRules(rootType);
+ rules.setMigrationRootType(migrationType);
+ return rules;
+ }
+
+ @Override
+ public PsiElement victims(PsiClass aClass) {
+ final PsiField field = aClass.findFieldByName(fieldName, false);
+ assert field != null : fieldName + " not found in " + aClass;
+ return field;
+ }
+ };
+
+ start(provider, className);
+ }
+
+ protected void doTestMethodType(@NonNls final String methodName, final PsiType rootType, final PsiType migrationType) {
+ doTestMethodType(methodName, "Test", rootType, migrationType);
+ }
+
+ protected void doTestMethodType(@NonNls final String methodName, @NonNls String className, final PsiType rootType, final PsiType migrationType) {
+ final RulesProvider provider = new RulesProvider() {
+ @Override
+ public TypeMigrationRules provide() throws Exception {
+ final TypeMigrationRules rules = new TypeMigrationRules(rootType);
+ rules.setMigrationRootType(migrationType);
+ return rules;
+ }
+
+ @Override
+ public PsiElement victims(PsiClass aClass) {
+ return aClass.findMethodsByName(methodName, false)[0];
+ }
+ };
+
+ start(provider, className);
+ }
+
+ protected void doTestFirstParamType(@NonNls final String methodName, final PsiType rootType, final PsiType migrationType) {
+ doTestFirstParamType(methodName, "Test", rootType, migrationType);
+ }
+
+ protected void doTestFirstParamType(@NonNls final String methodName, String className, final PsiType rootType, final PsiType migrationType) {
+ final RulesProvider provider = new RulesProvider() {
+ @Override
+ public TypeMigrationRules provide() throws Exception {
+ final TypeMigrationRules rules = new TypeMigrationRules(rootType);
+ rules.setMigrationRootType(migrationType);
+ return rules;
+ }
+
+ @Override
+ public PsiElement victims(PsiClass aClass) {
+ return aClass.findMethodsByName(methodName, false)[0].getParameterList().getParameters()[0];
+ }
+ };
+
+ start(provider, className);
+ }
+
+ public void start(final RulesProvider provider) {
+ start(provider, "Test");
+ }
+
+ public void start(final RulesProvider provider, final String className) {
+ doTest(new PerformAction() {
+ @Override
+ public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception {
+ TypeMigrationTestBase.this.performAction(className, rootDir.getName(), provider);
+ }
+ });
+ }
+
+ private void performAction(String className, String rootDir, RulesProvider provider) throws Exception {
+ PsiClass aClass = myJavaFacade.findClass(className, GlobalSearchScope.allScope(getProject()));
+
+ assertNotNull("Class " + className + " not found", aClass);
+
+ final TypeMigrationRules rules = provider.provide();
+ rules.setBoundScope(new LocalSearchScope(aClass.getContainingFile()));
+ final TestTypeMigrationProcessor pr = new TestTypeMigrationProcessor(getProject(), provider.victims(aClass), rules);
+
+ final UsageInfo[] usages = pr.findUsages();
+ final String report = pr.getLabeler().getMigrationReport();
+
+ WriteCommandAction.runWriteCommandAction(null, new Runnable() {
+ public void run() {
+ pr.performRefactoring(usages);
+ }
+ });
+
+
+ String itemName = className + ".items";
+ String patternName = getTestDataPath() + getTestRoot() + getTestName(true) + "/after/" + itemName;
+
+ File patternFile = new File(patternName);
+
+ if (!patternFile.exists()) {
+ PrintWriter writer = new PrintWriter(new FileOutputStream(patternFile));
+ try {
+ writer.print(report);
+ writer.close();
+ }
+ finally {
+ writer.close();
+ }
+
+ System.out.println("Pattern not found, file " + patternName + " created.");
+
+ LocalFileSystem.getInstance().refreshAndFindFileByIoFile(patternFile);
+ }
+
+ File graFile = new File(FileUtil.getTempDirectory() + File.separator + rootDir + File.separator + itemName);
+
+ PrintWriter writer = new PrintWriter(new FileOutputStream(graFile));
+ try {
+ writer.print(report);
+ writer.close();
+ }
+ finally {
+ writer.close();
+ }
+
+ LocalFileSystem.getInstance().refreshAndFindFileByIoFile(graFile);
+ FileDocumentManager.getInstance().saveAllDocuments();
+ }
+
+ interface RulesProvider {
+ TypeMigrationRules provide() throws Exception;
+
+ PsiElement victims(PsiClass aClass);
+ }
+
+ private static class TestTypeMigrationProcessor extends TypeMigrationProcessor {
+ public TestTypeMigrationProcessor(final Project project, final PsiElement root, final TypeMigrationRules rules) {
+ super(project, root, rules);
+ }
+
+ @NotNull
+ @Override
+ public UsageInfo[] findUsages() {
+ return super.findUsages();
+ }
+
+ @Override
+ public void performRefactoring(final UsageInfo[] usages) {
+ super.performRefactoring(usages);
+ }
+ }
+} \ No newline at end of file