Home | History | Annotate | Download | only in core
      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