| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/org/documents/epl-v10.php |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.android.ide.eclipse.adt.internal.refactorings.core; |
| |
| import com.android.annotations.NonNull; |
| import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo; |
| import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IPackageFragment; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.internal.corext.refactoring.rename.RenamePackageProcessor; |
| import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring; |
| |
| /** |
| * TODO: Test renaming a DIFFERENT package than the application package! |
| */ |
| @SuppressWarnings({"javadoc", "restriction"}) |
| public class AndroidPackageRenameParticipantTest extends RefactoringTestBase { |
| public void testRefactor1() throws Exception { |
| renamePackage( |
| TEST_PROJECT, |
| false /*renameSubpackages*/, |
| true /*updateReferences*/, |
| "my.pkg.name", |
| |
| "CHANGES:\n" + |
| "-------\n" + |
| "[x] Rename package 'com.example.refactoringtest' to 'my.pkg.name'\n" + |
| "\n" + |
| "[x] MainActivity.java - /testRefactor1/src/com/example/refactoringtest/MainActivity.java\n" + |
| " @@ -3 +3\n" + |
| " + import com.example.refactoringtest.R;\n" + |
| " +\n" + |
| "\n" + |
| "\n" + |
| "[x] activity_main.xml - /testRefactor1/res/layout/activity_main.xml\n" + |
| " @@ -33 +33\n" + |
| " - <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" + |
| " + <fragment android:name=\"my.pkg.name.MyFragment\"/>\n" + |
| "\n" + |
| "\n" + |
| "[x] AndroidManifest.xml - /testRefactor1/AndroidManifest.xml\n" + |
| " @@ -16 +16\n" + |
| " - android:name=\"com.example.refactoringtest.MainActivity\"\n" + |
| " + android:name=\"my.pkg.name.MainActivity\"\n" + |
| " @@ -25 +25\n" + |
| " - android:name=\".MainActivity2\"\n" + |
| " + android:name=\"my.pkg.name.MainActivity2\"", |
| true); |
| } |
| |
| public void testRefactor1_noreferences() throws Exception { |
| renamePackage( |
| TEST_PROJECT, |
| false /*renameSubpackages*/, |
| false /*updateReferences*/, |
| "my.pkg.name", |
| |
| "CHANGES:\n" + |
| "-------\n" + |
| "[x] Rename package 'com.example.refactoringtest' to 'my.pkg.name'", |
| false); |
| } |
| |
| public void testRefactor2() throws Exception { |
| // Tests custom view handling |
| renamePackage( |
| TEST_PROJECT2, |
| false /*renameSubpackages*/, |
| true /*updateReferences*/, |
| "my.pkg.name", |
| |
| "CHANGES:\n" + |
| "-------\n" + |
| "[x] Rename package 'com.example.refactoringtest' to 'my.pkg.name'\n" + |
| "\n" + |
| "[x] MainActivity.java - /testRefactor2/src/com/example/refactoringtest/MainActivity.java\n" + |
| " @@ -3 +3\n" + |
| " + import com.example.refactoringtest.R;\n" + |
| " +\n" + |
| "\n" + |
| "\n" + |
| "[x] customviews.xml - /testRefactor2/res/layout/customviews.xml\n" + |
| " @@ -9 +9\n" + |
| " - <com.example.refactoringtest.CustomView1\n" + |
| " + <my.pkg.name.CustomView1\n" + |
| "\n" + |
| "\n" + |
| "[x] activity_main.xml - /testRefactor2/res/layout/activity_main.xml\n" + |
| " @@ -33 +33\n" + |
| " - <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" + |
| " + <fragment android:name=\"my.pkg.name.MyFragment\"/>\n" + |
| "\n" + |
| "\n" + |
| "[x] customviews.xml - /testRefactor2/res/layout-land/customviews.xml\n" + |
| " @@ -9 +9\n" + |
| " - <com.example.refactoringtest.CustomView1\n" + |
| " + <my.pkg.name.CustomView1\n" + |
| "\n" + |
| "\n" + |
| "[x] AndroidManifest.xml - /testRefactor2/AndroidManifest.xml\n" + |
| " @@ -16 +16\n" + |
| " - android:name=\"com.example.refactoringtest.MainActivity\"\n" + |
| " + android:name=\"my.pkg.name.MainActivity\"\n" + |
| " @@ -25 +25\n" + |
| " - android:name=\".MainActivity2\"\n" + |
| " + android:name=\"my.pkg.name.MainActivity2\"", |
| true); |
| } |
| |
| public void testRefactor2_renamesub() throws Exception { |
| // Tests custom view handling |
| renamePackage( |
| TEST_PROJECT2, |
| true /*renameSubpackages*/, |
| true /*updateReferences*/, |
| "my.pkg.name", |
| |
| "CHANGES:\n" + |
| "-------\n" + |
| "[x] Rename package 'com.example.refactoringtest' and subpackages to 'my.pkg.name'\n" + |
| "\n" + |
| "[x] MainActivity.java - /testRefactor2_renamesub/src/com/example/refactoringtest/MainActivity.java\n" + |
| " @@ -3 +3\n" + |
| " + import com.example.refactoringtest.R;\n" + |
| " +\n" + |
| "\n" + |
| "\n" + |
| "[x] customviews.xml - /testRefactor2_renamesub/res/layout/customviews.xml\n" + |
| " @@ -9 +9\n" + |
| " - <com.example.refactoringtest.CustomView1\n" + |
| " + <my.pkg.name.CustomView1\n" + |
| "\n" + |
| "\n" + |
| "[x] activity_main.xml - /testRefactor2_renamesub/res/layout/activity_main.xml\n" + |
| " @@ -33 +33\n" + |
| " - <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" + |
| " + <fragment android:name=\"my.pkg.name.MyFragment\"/>\n" + |
| "\n" + |
| "\n" + |
| "[x] customviews.xml - /testRefactor2_renamesub/res/layout-land/customviews.xml\n" + |
| " @@ -9 +9\n" + |
| " - <com.example.refactoringtest.CustomView1\n" + |
| " + <my.pkg.name.CustomView1\n" + |
| "\n" + |
| "\n" + |
| "[x] AndroidManifest.xml - /testRefactor2_renamesub/AndroidManifest.xml\n" + |
| " @@ -16 +16\n" + |
| " - android:name=\"com.example.refactoringtest.MainActivity\"\n" + |
| " + android:name=\"my.pkg.name.MainActivity\"\n" + |
| " @@ -25 +25\n" + |
| " - android:name=\".MainActivity2\"\n" + |
| " + android:name=\"my.pkg.name.MainActivity2\"\n" + |
| "\n" + |
| "\n" + |
| "[x] customviews.xml - /testRefactor2_renamesub/res/layout/customviews.xml\n" + |
| " @@ -15 +15\n" + |
| " - <com.example.refactoringtest.subpackage.CustomView2\n" + |
| " + <my.pkg.name.subpackage.CustomView2\n" + |
| "\n" + |
| "\n" + |
| "[x] customviews.xml - /testRefactor2_renamesub/res/layout-land/customviews.xml\n" + |
| " @@ -15 +15\n" + |
| " - <com.example.refactoringtest.subpackage.CustomView2\n" + |
| " + <my.pkg.name.subpackage.CustomView2", |
| true); |
| } |
| |
| public void testRefactor2_renamesub_norefs() throws Exception { |
| // Tests custom view handling |
| renamePackage( |
| TEST_PROJECT2, |
| true /*renameSubpackages*/, |
| false /*updateReferences*/, |
| "my.pkg.name", |
| |
| "CHANGES:\n" + |
| "-------\n" + |
| "[x] Rename package 'com.example.refactoringtest' and subpackages to 'my.pkg.name'", |
| false); |
| } |
| |
| |
| // ---- Test infrastructure ---- |
| |
| protected void renamePackage( |
| @NonNull Object[] testData, |
| boolean renameSubpackages, |
| boolean updateReferences, |
| @NonNull String newName, |
| @NonNull String expected, |
| boolean expectedAppPackageRenameWarning) throws Exception { |
| IProject project = createProject(testData); |
| String expectedWarnings = expectedAppPackageRenameWarning ? |
| EXPECTED_WARNINGS_TEMPLATE.replace("PROJECTNAME", project.getName()) : null; |
| renamePackage(project, renameSubpackages, updateReferences, newName, expected, |
| expectedWarnings); |
| } |
| |
| protected void renamePackage( |
| @NonNull IProject project, |
| boolean renameSubpackages, |
| boolean updateReferences, |
| @NonNull String newName, |
| @NonNull String expected, |
| @NonNull String expectedWarnings) throws Exception { |
| ManifestInfo info = ManifestInfo.get(project); |
| String currentPackage = info.getPackage(); |
| assertNotNull(currentPackage); |
| |
| IPackageFragment pkgFragment = getPackageFragment(project, currentPackage); |
| RenamePackageProcessor processor = new RenamePackageProcessor(pkgFragment); |
| processor.setNewElementName(newName); |
| processor.setRenameSubpackages(renameSubpackages); |
| processor.setUpdateReferences(updateReferences); |
| assertNotNull(processor); |
| |
| RenameRefactoring refactoring = new RenameRefactoring(processor); |
| checkRefactoring(refactoring, expected, expectedWarnings); |
| } |
| |
| private static IPackageFragment getPackageFragment(IProject project, String pkg) |
| throws CoreException, JavaModelException { |
| IPackageFragment pkgFragment = null; |
| IJavaProject javaProject = BaseProjectHelper.getJavaProject(project); |
| assertNotNull(javaProject); |
| IPackageFragment[] fragments = javaProject.getPackageFragments(); |
| for (IPackageFragment fragment : fragments) { |
| String name = fragment.getElementName(); |
| if (pkg.equals(name)) { |
| pkgFragment = fragment; |
| break; |
| } |
| } |
| return pkgFragment; |
| } |
| |
| private static String EXPECTED_WARNINGS_TEMPLATE = |
| "<INFO\n" + |
| "\t\n" + |
| "INFO: You are refactoring the same package as your application's package (specified in the manifest).\n" + |
| "\n" + |
| "Context: L/PROJECTNAME/AndroidManifest.xml\n" + |
| "code: none\n" + |
| "Data: null\n" + |
| "\t\n" + |
| "INFO: Note that this refactoring does NOT also update your application package.\n" + |
| "Context: L/PROJECTNAME/AndroidManifest.xml\n" + |
| "code: none\n" + |
| "Data: null\n" + |
| "\t\n" + |
| "INFO: The application package defines your application's identity.\n" + |
| "Context: L/PROJECTNAME/AndroidManifest.xml\n" + |
| "code: none\n" + |
| "Data: null\n" + |
| "\t\n" + |
| "INFO: If you change it, then it is considered to be a different application.\n" + |
| "Context: L/PROJECTNAME/AndroidManifest.xml\n" + |
| "code: none\n" + |
| "Data: null\n" + |
| "\t\n" + |
| "INFO: (Users of the previous version cannot update to the new version.)\n" + |
| "Context: L/PROJECTNAME/AndroidManifest.xml\n" + |
| "code: none\n" + |
| "Data: null\n" + |
| "\t\n" + |
| "INFO: The application package, and the package containing the code, can differ.\n" + |
| "Context: L/PROJECTNAME/AndroidManifest.xml\n" + |
| "code: none\n" + |
| "Data: null\n" + |
| "\t\n" + |
| "INFO: To really change application package, choose \"Android Tools\" > \"Rename Application Package.\" from the project context menu.\n" + |
| "Context: L/PROJECTNAME/AndroidManifest.xml\n" + |
| "code: none\n" + |
| "Data: null\n" + |
| ">"; |
| } |