1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php 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.android.ide.eclipse.adt.internal.refactorings.core; 17 18 import com.android.annotations.NonNull; 19 import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo; 20 import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper; 21 22 import org.eclipse.core.resources.IProject; 23 import org.eclipse.core.runtime.CoreException; 24 import org.eclipse.jdt.core.IJavaProject; 25 import org.eclipse.jdt.core.IPackageFragment; 26 import org.eclipse.jdt.core.JavaModelException; 27 import org.eclipse.jdt.internal.corext.refactoring.rename.RenamePackageProcessor; 28 import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring; 29 30 /** 31 * TODO: Test renaming a DIFFERENT package than the application package! 32 */ 33 @SuppressWarnings({"javadoc", "restriction"}) 34 public class AndroidPackageRenameParticipantTest extends RefactoringTestBase { 35 public void testRefactor1() throws Exception { 36 renamePackage( 37 TEST_PROJECT, 38 false /*renameSubpackages*/, 39 true /*updateReferences*/, 40 "my.pkg.name", 41 42 "CHANGES:\n" + 43 "-------\n" + 44 "[x] Rename package 'com.example.refactoringtest' to 'my.pkg.name'\n" + 45 "\n" + 46 "[x] MainActivity.java - /testRefactor1/src/com/example/refactoringtest/MainActivity.java\n" + 47 " @@ -3 +3\n" + 48 " + import com.example.refactoringtest.R;\n" + 49 " +\n" + 50 "\n" + 51 "\n" + 52 "[x] activity_main.xml - /testRefactor1/res/layout/activity_main.xml\n" + 53 " @@ -33 +33\n" + 54 " - <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" + 55 " + <fragment android:name=\"my.pkg.name.MyFragment\"/>\n" + 56 "\n" + 57 "\n" + 58 "[x] AndroidManifest.xml - /testRefactor1/AndroidManifest.xml\n" + 59 " @@ -16 +16\n" + 60 " - android:name=\"com.example.refactoringtest.MainActivity\"\n" + 61 " + android:name=\"my.pkg.name.MainActivity\"\n" + 62 " @@ -25 +25\n" + 63 " - android:name=\".MainActivity2\"\n" + 64 " + android:name=\"my.pkg.name.MainActivity2\"", 65 true); 66 } 67 68 public void testRefactor1_noreferences() throws Exception { 69 renamePackage( 70 TEST_PROJECT, 71 false /*renameSubpackages*/, 72 false /*updateReferences*/, 73 "my.pkg.name", 74 75 "CHANGES:\n" + 76 "-------\n" + 77 "[x] Rename package 'com.example.refactoringtest' to 'my.pkg.name'", 78 false); 79 } 80 81 public void testRefactor2() throws Exception { 82 // Tests custom view handling 83 renamePackage( 84 TEST_PROJECT2, 85 false /*renameSubpackages*/, 86 true /*updateReferences*/, 87 "my.pkg.name", 88 89 "CHANGES:\n" + 90 "-------\n" + 91 "[x] Rename package 'com.example.refactoringtest' to 'my.pkg.name'\n" + 92 "\n" + 93 "[x] MainActivity.java - /testRefactor2/src/com/example/refactoringtest/MainActivity.java\n" + 94 " @@ -3 +3\n" + 95 " + import com.example.refactoringtest.R;\n" + 96 " +\n" + 97 "\n" + 98 "\n" + 99 "[x] customviews.xml - /testRefactor2/res/layout/customviews.xml\n" + 100 " @@ -9 +9\n" + 101 " - <com.example.refactoringtest.CustomView1\n" + 102 " + <my.pkg.name.CustomView1\n" + 103 "\n" + 104 "\n" + 105 "[x] activity_main.xml - /testRefactor2/res/layout/activity_main.xml\n" + 106 " @@ -33 +33\n" + 107 " - <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" + 108 " + <fragment android:name=\"my.pkg.name.MyFragment\"/>\n" + 109 "\n" + 110 "\n" + 111 "[x] customviews.xml - /testRefactor2/res/layout-land/customviews.xml\n" + 112 " @@ -9 +9\n" + 113 " - <com.example.refactoringtest.CustomView1\n" + 114 " + <my.pkg.name.CustomView1\n" + 115 "\n" + 116 "\n" + 117 "[x] AndroidManifest.xml - /testRefactor2/AndroidManifest.xml\n" + 118 " @@ -16 +16\n" + 119 " - android:name=\"com.example.refactoringtest.MainActivity\"\n" + 120 " + android:name=\"my.pkg.name.MainActivity\"\n" + 121 " @@ -25 +25\n" + 122 " - android:name=\".MainActivity2\"\n" + 123 " + android:name=\"my.pkg.name.MainActivity2\"", 124 true); 125 } 126 127 public void testRefactor2_renamesub() throws Exception { 128 // Tests custom view handling 129 renamePackage( 130 TEST_PROJECT2, 131 true /*renameSubpackages*/, 132 true /*updateReferences*/, 133 "my.pkg.name", 134 135 "CHANGES:\n" + 136 "-------\n" + 137 "[x] Rename package 'com.example.refactoringtest' and subpackages to 'my.pkg.name'\n" + 138 "\n" + 139 "[x] MainActivity.java - /testRefactor2_renamesub/src/com/example/refactoringtest/MainActivity.java\n" + 140 " @@ -3 +3\n" + 141 " + import com.example.refactoringtest.R;\n" + 142 " +\n" + 143 "\n" + 144 "\n" + 145 "[x] customviews.xml - /testRefactor2_renamesub/res/layout/customviews.xml\n" + 146 " @@ -9 +9\n" + 147 " - <com.example.refactoringtest.CustomView1\n" + 148 " + <my.pkg.name.CustomView1\n" + 149 "\n" + 150 "\n" + 151 "[x] activity_main.xml - /testRefactor2_renamesub/res/layout/activity_main.xml\n" + 152 " @@ -33 +33\n" + 153 " - <fragment android:name=\"com.example.refactoringtest.MyFragment\"/>\n" + 154 " + <fragment android:name=\"my.pkg.name.MyFragment\"/>\n" + 155 "\n" + 156 "\n" + 157 "[x] customviews.xml - /testRefactor2_renamesub/res/layout-land/customviews.xml\n" + 158 " @@ -9 +9\n" + 159 " - <com.example.refactoringtest.CustomView1\n" + 160 " + <my.pkg.name.CustomView1\n" + 161 "\n" + 162 "\n" + 163 "[x] AndroidManifest.xml - /testRefactor2_renamesub/AndroidManifest.xml\n" + 164 " @@ -16 +16\n" + 165 " - android:name=\"com.example.refactoringtest.MainActivity\"\n" + 166 " + android:name=\"my.pkg.name.MainActivity\"\n" + 167 " @@ -25 +25\n" + 168 " - android:name=\".MainActivity2\"\n" + 169 " + android:name=\"my.pkg.name.MainActivity2\"\n" + 170 "\n" + 171 "\n" + 172 "[x] customviews.xml - /testRefactor2_renamesub/res/layout/customviews.xml\n" + 173 " @@ -15 +15\n" + 174 " - <com.example.refactoringtest.subpackage.CustomView2\n" + 175 " + <my.pkg.name.subpackage.CustomView2\n" + 176 "\n" + 177 "\n" + 178 "[x] customviews.xml - /testRefactor2_renamesub/res/layout-land/customviews.xml\n" + 179 " @@ -15 +15\n" + 180 " - <com.example.refactoringtest.subpackage.CustomView2\n" + 181 " + <my.pkg.name.subpackage.CustomView2", 182 true); 183 } 184 185 public void testRefactor2_renamesub_norefs() throws Exception { 186 // Tests custom view handling 187 renamePackage( 188 TEST_PROJECT2, 189 true /*renameSubpackages*/, 190 false /*updateReferences*/, 191 "my.pkg.name", 192 193 "CHANGES:\n" + 194 "-------\n" + 195 "[x] Rename package 'com.example.refactoringtest' and subpackages to 'my.pkg.name'", 196 false); 197 } 198 199 200 // ---- Test infrastructure ---- 201 202 protected void renamePackage( 203 @NonNull Object[] testData, 204 boolean renameSubpackages, 205 boolean updateReferences, 206 @NonNull String newName, 207 @NonNull String expected, 208 boolean expectedAppPackageRenameWarning) throws Exception { 209 IProject project = createProject(testData); 210 String expectedWarnings = expectedAppPackageRenameWarning ? 211 EXPECTED_WARNINGS_TEMPLATE.replace("PROJECTNAME", project.getName()) : null; 212 renamePackage(project, renameSubpackages, updateReferences, newName, expected, 213 expectedWarnings); 214 } 215 216 protected void renamePackage( 217 @NonNull IProject project, 218 boolean renameSubpackages, 219 boolean updateReferences, 220 @NonNull String newName, 221 @NonNull String expected, 222 @NonNull String expectedWarnings) throws Exception { 223 ManifestInfo info = ManifestInfo.get(project); 224 String currentPackage = info.getPackage(); 225 assertNotNull(currentPackage); 226 227 IPackageFragment pkgFragment = getPackageFragment(project, currentPackage); 228 RenamePackageProcessor processor = new RenamePackageProcessor(pkgFragment); 229 processor.setNewElementName(newName); 230 processor.setRenameSubpackages(renameSubpackages); 231 processor.setUpdateReferences(updateReferences); 232 assertNotNull(processor); 233 234 RenameRefactoring refactoring = new RenameRefactoring(processor); 235 checkRefactoring(refactoring, expected, expectedWarnings); 236 } 237 238 private static IPackageFragment getPackageFragment(IProject project, String pkg) 239 throws CoreException, JavaModelException { 240 IPackageFragment pkgFragment = null; 241 IJavaProject javaProject = BaseProjectHelper.getJavaProject(project); 242 assertNotNull(javaProject); 243 IPackageFragment[] fragments = javaProject.getPackageFragments(); 244 for (IPackageFragment fragment : fragments) { 245 String name = fragment.getElementName(); 246 if (pkg.equals(name)) { 247 pkgFragment = fragment; 248 break; 249 } 250 } 251 return pkgFragment; 252 } 253 254 private static String EXPECTED_WARNINGS_TEMPLATE = 255 "<INFO\n" + 256 "\t\n" + 257 "INFO: You are refactoring the same package as your application's package (specified in the manifest).\n" + 258 "\n" + 259 "Context: L/PROJECTNAME/AndroidManifest.xml\n" + 260 "code: none\n" + 261 "Data: null\n" + 262 "\t\n" + 263 "INFO: Note that this refactoring does NOT also update your application package.\n" + 264 "Context: L/PROJECTNAME/AndroidManifest.xml\n" + 265 "code: none\n" + 266 "Data: null\n" + 267 "\t\n" + 268 "INFO: The application package defines your application's identity.\n" + 269 "Context: L/PROJECTNAME/AndroidManifest.xml\n" + 270 "code: none\n" + 271 "Data: null\n" + 272 "\t\n" + 273 "INFO: If you change it, then it is considered to be a different application.\n" + 274 "Context: L/PROJECTNAME/AndroidManifest.xml\n" + 275 "code: none\n" + 276 "Data: null\n" + 277 "\t\n" + 278 "INFO: (Users of the previous version cannot update to the new version.)\n" + 279 "Context: L/PROJECTNAME/AndroidManifest.xml\n" + 280 "code: none\n" + 281 "Data: null\n" + 282 "\t\n" + 283 "INFO: The application package, and the package containing the code, can differ.\n" + 284 "Context: L/PROJECTNAME/AndroidManifest.xml\n" + 285 "code: none\n" + 286 "Data: null\n" + 287 "\t\n" + 288 "INFO: To really change application package, choose \"Android Tools\" > \"Rename Application Package.\" from the project context menu.\n" + 289 "Context: L/PROJECTNAME/AndroidManifest.xml\n" + 290 "code: none\n" + 291 "Data: null\n" + 292 ">"; 293 } 294