blob: 1df0b0c5ebbaa612b660ca0d8f6e07fcb3eba9dc [file] [log] [blame]
/*
* 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" +
">";
}