package org.jetbrains.android.refactoring;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.actions.InlineAction;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.testFramework.fixtures.IdeaProjectTestFixture;
import com.intellij.testFramework.fixtures.TestFixtureBuilder;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.android.AndroidTestCase;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidInlineStyleTest extends AndroidTestCase {
private static final String BASE_PATH = "refactoring/inlineStyle/";
public void test1() {
doTest(true);
}
public void test2() {
doTest(true);
}
public void test3() {
doTest(true);
}
public void test4() {
doTest(true);
}
public void test5() {
doTestDisabled();
}
public void test6() {
doTest(true);
}
public void test7() {
doTest(false);
}
public void test8() {
doTestDisabled();
}
public void test9() {
doTestErrorMessageShown(true, true, false);
}
public void test10() {
doTestDisabled();
}
public void test11() {
doTestErrorMessageShown(true, true, false);
}
public void test12() {
doTestErrorMessageShown(true, true, true);
}
public void test13() {
doTestErrorMessageShown(true, true, true);
}
public void test14() {
final String libStylesPath = getContentRootPath("lib") + "/res/values/styles.xml";
final String stylesLocalPath = BASE_PATH + getTestName(true) + "_styles.xml";
myFixture.copyFileToProject(stylesLocalPath, libStylesPath);
doTestErrorMessageShown(true, true, true);
myFixture.checkResultByFile(libStylesPath, stylesLocalPath, true);
}
public void test15() {
final String libModuleDir = getContentRootPath("lib");
final String libStylesPath = libModuleDir + "/res/values/styles.xml";
final String appStylePath = "/res/values/styles.xml";
final String appLayoutLocalPath = BASE_PATH + getTestName(true) + "_1.xml";
final String stylesLocalPath = BASE_PATH + getTestName(true) + "_styles.xml";
final String appLayoutPath = "res/layout/layout.xml";
myFixture.copyFileToProject(stylesLocalPath, libStylesPath);
myFixture.copyFileToProject(stylesLocalPath, appStylePath);
myFixture.copyFileToProject(appLayoutLocalPath, appLayoutPath);
final MultiMap<PsiElement,String> conflicts = performAction(false, libModuleDir + "/res/layout").getSecond().getConflicts();
assertEquals(1, conflicts.keySet().size());
assertEquals(1, conflicts.values().size());
myFixture.checkResultByFile(BASE_PATH + getTestName(true) + "_after.xml");
myFixture.checkResultByFile(libStylesPath, BASE_PATH + getTestName(true) + "_styles_after.xml", true);
myFixture.checkResultByFile(appStylePath, stylesLocalPath, true);
myFixture.checkResultByFile(appLayoutPath, appLayoutLocalPath, true);
}
public void test35() throws Exception {
final String libModuleDir = getContentRootPath("lib");
final String libStylesPath = libModuleDir + "/res/values/styles.xml";
final String appStylePath = "/res/values/styles.xml";
final String appLayoutLocalPath = BASE_PATH + getTestName(true) + "_1.xml";
final String stylesLocalPath = BASE_PATH + getTestName(true) + "_styles.xml";
final String appLayoutPath = "res/layout/layout.xml";
myFixture.copyFileToProject(stylesLocalPath, libStylesPath);
myFixture.copyFileToProject(stylesLocalPath, appStylePath);
myFixture.copyFileToProject(appLayoutLocalPath, appLayoutPath);
doTest(true, libModuleDir + "/res/layout");
}
public void test16() {
final String libModuleDir = getContentRootPath("lib");
final String libStylesPath = libModuleDir + "/res/values/styles.xml";
final String appLayoutPath = "res/layout/layout.xml";
myFixture.copyFileToProject(BASE_PATH + getTestName(true) + "_styles.xml", libStylesPath);
myFixture.copyFileToProject(BASE_PATH + getTestName(true) + "_1.xml", appLayoutPath);
final String testName = getTestName(true);
final VirtualFile f = myFixture
.copyFileToProject(BASE_PATH + testName + ".xml", libModuleDir + "/res/layout/test.xml");
myFixture.configureFromExistingVirtualFile(f);
doInlineStyleReferenceAction(false, true);
myFixture.checkResultByFile(BASE_PATH + testName + "_after.xml");
myFixture.checkResultByFile(appLayoutPath, BASE_PATH + getTestName(true) + "_1_after.xml", true);
myFixture.checkResultByFile(libStylesPath, BASE_PATH + getTestName(true) + "_styles_after.xml", true);
}
public void test17() {
final String testName = getTestName(true);
myFixture.copyFileToProject(BASE_PATH + testName + "_styles.xml", "res/values/styles.xml");
myFixture.copyFileToProject(BASE_PATH + testName + "_1.xml", "res/layout/test1.xml");
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/layout/test.xml");
myFixture.configureFromExistingVirtualFile(f);
doCommonInlineAction(true);
myFixture.checkResultByFile(BASE_PATH + testName + "_after.xml");
myFixture.checkResultByFile("res/layout/test1.xml", BASE_PATH + testName + "_1.xml", true);
myFixture.checkResultByFile("res/values/styles.xml", BASE_PATH + testName + "_styles.xml", true);
}
private AndroidInlineTestConfig doCommonInlineAction(boolean inlineThisOnly) {
final AndroidInlineTestConfig config = new AndroidInlineTestConfig(inlineThisOnly);
AndroidInlineStyleHandler.setTestConfig(config);
try {
final Presentation p = myFixture.testAction(new InlineAction());
assertTrue(p.isEnabled());
assertTrue(p.isVisible());
}
finally {
AndroidInlineStyleHandler.setTestConfig(null);
}
return config;
}
public void test18() {
final String testName = getTestName(true);
final String stylesPath = BASE_PATH + testName + "_styles.xml";
myFixture.copyFileToProject(stylesPath, "res/values/styles.xml");
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/layout/test.xml");
myFixture.configureFromExistingVirtualFile(f);
try {
doCommonInlineAction(false);
fail();
}
catch (CommonRefactoringUtil.RefactoringErrorHintException e) {
}
myFixture.checkResultByFile(BASE_PATH + testName + "_after.xml");
myFixture.checkResultByFile("res/values/styles.xml", stylesPath, true);
}
public void test19() {
final String testName = getTestName(true);
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + "_styles.xml", "res/values/styles.xml");
myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/layout/test.xml");
myFixture.copyFileToProject(BASE_PATH + testName + "_1.xml", "res/layout/test1.xml");
myFixture.configureFromExistingVirtualFile(f);
doCommonInlineAction(false);
myFixture.checkResultByFile(BASE_PATH + testName + "_styles_after.xml", true);
myFixture.checkResultByFile("res/layout/test.xml", BASE_PATH + testName + "_after.xml", true);
myFixture.checkResultByFile("res/layout/test1.xml", BASE_PATH + testName + "_1_after.xml", true);
}
public void test20() {
final boolean thisOnly = false;
final String testName = getTestName(true);
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + "_styles.xml", "res/values/styles.xml");
final String layoutPath = BASE_PATH + testName + ".xml";
myFixture.copyFileToProject(layoutPath, "res/layout/test.xml");
myFixture.configureFromExistingVirtualFile(f);
try {
doCommonInlineAction(thisOnly);
fail();
}
catch (CommonRefactoringUtil.RefactoringErrorHintException e) {
}
myFixture.checkResultByFile(BASE_PATH + testName + "_styles_after.xml", true);
myFixture.checkResultByFile("res/layout/test.xml", layoutPath, true);
}
public void test21() {
final String testName = getTestName(true);
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + "_styles.xml", "res/values/styles.xml");
final String layoutPath = BASE_PATH + testName + ".xml";
myFixture.copyFileToProject(layoutPath, "res/layout/test.xml");
myFixture.configureFromExistingVirtualFile(f);
try {
doCommonInlineAction(false);
fail();
}
catch (IncorrectOperationException e) {
assertTrue(e.getMessage().length() > 0);
}
}
public void test22() {
final String testName = getTestName(true);
myFixture.copyFileToProject(BASE_PATH + testName + "_styles.xml", "res/values/styles.xml");
myFixture.copyFileToProject(BASE_PATH + "MyActivity.java", "src/p1/p2/MyActivity.java");
myFixture.copyFileToProject("R.java", "gen/p1/p2/R.java");
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/layout/test.xml");
myFixture.configureFromExistingVirtualFile(f);
final AndroidInlineTestConfig testConfig = new AndroidInlineTestConfig(false);
myFixture.testAction(new AndroidInlineStyleReferenceAction(testConfig));
final MultiMap<PsiElement, String> conflicts = testConfig.getConflicts();
assertEquals(1, conflicts.keySet().size());
assertEquals(1, conflicts.values().size());
myFixture.checkResultByFile(BASE_PATH + testName + "_after.xml");
myFixture.checkResultByFile("src/p1/p2/MyActivity.java", BASE_PATH + "MyActivity.java", true);
myFixture.checkResultByFile("res/values/styles.xml", BASE_PATH + testName + "_styles_after.xml", true);
}
public void test23() {
final String testName = getTestName(true);
myFixture.copyFileToProject(BASE_PATH + testName + "_styles.xml", "res/values/styles.xml");
myFixture.copyFileToProject(BASE_PATH + testName + "_1.xml", "res/layout/test1.xml");
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/layout/test.xml");
myFixture.configureFromExistingVirtualFile(f);
doCommonInlineAction(false);
myFixture.checkResultByFile(BASE_PATH + testName + "_after.xml");
myFixture.checkResultByFile("res/layout/test1.xml", BASE_PATH + testName + "_1_after.xml", true);
myFixture.checkResultByFile("res/values/styles.xml", BASE_PATH + testName + "_styles_after.xml", true);
}
public void test24() {
doTestCommonInlineInValues(true);
}
public void test25() {
doTestInlineActionInValues(true, true, true);
}
public void test26() {
doTestInlineActionInValues(false, true, true);
}
public void test27() {
doTestInlineActionInValues(false, false, false);
}
public void test28() {
doTestCommonInlineInValues(false);
}
public void test29() {
doTestCommonInlineInValues(false);
}
public void test30() {
doTestCommonInlineConflicts();
}
public void test31() {
doTestCommonInlineConflicts();
}
public void test32() {
doTestCommonInlineConflicts();
}
private void doTestCommonInlineConflicts() {
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + getTestName(true) + ".xml", "res/values/test.xml");
myFixture.configureFromExistingVirtualFile(f);
final MultiMap<PsiElement, String> conflicts = doCommonInlineAction(false).getConflicts();
assertEquals(1, conflicts.keySet().size());
assertEquals(1, conflicts.values().size());
myFixture.checkResultByFile(BASE_PATH + getTestName(true) + "_after.xml");
}
public void test33() {
doTestCommonInlineInValues(true);
}
public void test34() {
doTestDisabled();
}
private void doTestCommonInlineErrorHintInValues(boolean thisOnly) {
final String testName = getTestName(true);
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/values/test.xml");
myFixture.configureFromExistingVirtualFile(f);
try {
doCommonInlineAction(thisOnly);
fail();
}
catch (IncorrectOperationException e) {
assertTrue(e.getMessage().length() > 0);
}
}
private void doTestInlineActionInValues(boolean thisOnly, boolean enabled, boolean checkResults) {
final String testName = getTestName(true);
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/values/test.xml");
myFixture.configureFromExistingVirtualFile(f);
doInlineStyleReferenceAction(thisOnly, enabled);
if (checkResults) {
myFixture.checkResultByFile(BASE_PATH + testName + "_after.xml");
}
}
private void doTestCommonInlineInValues(boolean thisOnly) {
final String testName = getTestName(true);
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/values/test.xml");
myFixture.configureFromExistingVirtualFile(f);
doCommonInlineAction(thisOnly);
myFixture.checkResultByFile(BASE_PATH + testName + "_after.xml");
}
private void doTest(boolean inlineThisOnly) {
doTest(inlineThisOnly, "res/layout");
}
private void doTest(boolean inlineThisOnly, String dirToCopy) {
final String testName = getTestName(true);
myFixture.copyFileToProject(BASE_PATH + testName + "_styles.xml", "res/values/styles.xml");
final VirtualFile f = myFixture
.copyFileToProject(BASE_PATH + testName + ".xml", dirToCopy + "/test" + testName + "_" + Boolean.toString(inlineThisOnly) + ".xml");
myFixture.configureFromExistingVirtualFile(f);
doInlineStyleReferenceAction(inlineThisOnly, true);
myFixture.checkResultByFile(BASE_PATH + testName + "_after.xml");
myFixture.checkResultByFile("res/values/styles.xml", BASE_PATH + testName + (
inlineThisOnly ? "_styles.xml" : "_styles_after.xml"), true);
}
private void doInlineStyleReferenceAction(boolean inlineThisOnly, boolean enabled) {
final Presentation p =
myFixture.testAction(new AndroidInlineStyleReferenceAction(new AndroidInlineTestConfig(inlineThisOnly)));
assertEquals(enabled, p.isEnabled());
assertTrue(p.isVisible());
}
private void doTestErrorMessageShown(boolean testInlineThis, boolean testInlineAll, boolean copyStyles, String dirToCopy) {
if (copyStyles) {
myFixture.copyFileToProject(BASE_PATH + getTestName(true) + "_styles.xml",
"res/values/styles.xml");
}
if (testInlineThis) {
doTestErrorMessageShown(true, copyStyles, dirToCopy);
}
if (testInlineAll) {
doTestErrorMessageShown(false, copyStyles, dirToCopy);
}
}
private void doTestErrorMessageShown(boolean testInlineThis, boolean testInlineAll, boolean copyStyles) {
doTestErrorMessageShown(testInlineThis, testInlineAll, copyStyles, "res/layout");
}
private void doTestErrorMessageShown(boolean inlineThisOnly, boolean checkStylesXml, String dirToCopy) {
try {
performAction(inlineThisOnly, dirToCopy);
fail();
}
catch (IncorrectOperationException e) {
assertTrue(e.getMessage().length() > 0);
final String testName = getTestName(true);
myFixture.checkResultByFile(BASE_PATH + testName + ".xml");
if (checkStylesXml) {
myFixture.checkResultByFile("res/values/styles.xml",
BASE_PATH + testName + "_styles.xml", true);
}
}
}
private void doTestDisabled() {
final Presentation presentation = performAction(true, "res/layout").getFirst();
assertFalse(presentation.isEnabled());
assertTrue(presentation.isVisible());
}
private Pair<Presentation, AndroidInlineTestConfig> performAction(boolean inlineThisOnly, String dirToCopy) {
final String testName = getTestName(true);
final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml",
dirToCopy + "/test" + testName + "_" +
Boolean.toString(inlineThisOnly) + ".xml");
myFixture.configureFromExistingVirtualFile(f);
final AndroidInlineTestConfig config = new AndroidInlineTestConfig(inlineThisOnly);
final Presentation presentation = myFixture.testAction(new AndroidInlineStyleReferenceAction(config));
return Pair.create(presentation, config);
}
@Override
protected void configureAdditionalModules(@NotNull TestFixtureBuilder<IdeaProjectTestFixture> projectBuilder,
@NotNull List<MyAdditionalModuleData> modules) {
final String testName = getTestName(true);
if (testName.equals("14") || testName.equals("15") || testName.equals("16") || testName.equals("35")) {
addModuleWithAndroidFacet(projectBuilder, modules, "lib", true);
}
}
}