package org.jetbrains.android.refactoring; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.module.Module; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.xml.XmlAttribute; import com.intellij.util.ArrayUtil; import org.jetbrains.android.AndroidTestCase; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author Eugene.Kudelevsky */ public class AndroidExtractStyleTest extends AndroidTestCase { private static final String BASE_PATH = "refactoring/extractStyle/"; public void test1() { doTest("myStyle", new String[]{"android:textColor", "android:background"}, new String[]{"android:layout_width", "android:layout_height", "android:textColor", "android:background"}, false); } public void test2() { doTest("style1.s", new String[]{"android:textColor", "android:background"}, true); } public void test3() { doTest("style2", new String[]{"android:textColor", "android:background"}, true); } public void test4() { doTest("style1.s", new String[]{"android:textColor", "android:background"}, false); } public void test5() { doTestDisabled(); } public void test6() { doTestDisabled(); } public void test7() { doTest("myStyle", new String[]{"android:textColor", "android:background"}, false); } public void test8() { doTestHidden(); } private void doTestHidden() { final String testName = getTestName(true); final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/values/test" + testName + ".xml"); myFixture.configureFromExistingVirtualFile(f); final Presentation presentation = myFixture.testAction(new AndroidExtractStyleAction()); assertFalse(presentation.isVisible()); } private void doTestDisabled() { final String testName = getTestName(true); final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/layout/test" + testName + ".xml"); myFixture.configureFromExistingVirtualFile(f); final Presentation presentation = myFixture.testAction(new AndroidExtractStyleAction()); assertFalse(presentation.isEnabled()); assertTrue(presentation.isVisible()); } private void doTest(@NotNull String styleName, @NotNull String[] attributes, boolean copyInitialStylesXml) { doTest(styleName, attributes, attributes, copyInitialStylesXml); } private void doTest(@NotNull String styleName, @NotNull String[] attributesToExtract, @NotNull String[] expectedExtractableAttrs, boolean copyInitialStylesXml) { final String testName = getTestName(true); if (copyInitialStylesXml) { myFixture.copyFileToProject(BASE_PATH + testName + "_styles.xml", "res/values/styles.xml"); } final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + testName + ".xml", "res/layout/test" + testName + ".xml"); myFixture.configureFromExistingVirtualFile(f); myFixture.testAction(new AndroidExtractStyleAction(new MyConfig(myModule, styleName, attributesToExtract, expectedExtractableAttrs))); myFixture.checkResultByFile(BASE_PATH + testName + "_after.xml"); myFixture.checkResultByFile("res/values/styles.xml", BASE_PATH + testName + "_styles_after.xml", true); } private static class MyConfig extends AndroidExtractStyleAction.MyTestConfig { private final String[] myExpectedExtractableAttributes; MyConfig(@NotNull Module module, @NotNull String styleName, @NotNull String[] attributesToExtract, @NotNull String[] expectedExtractableAttributes) { super(module, styleName, attributesToExtract); myExpectedExtractableAttributes = expectedExtractableAttributes; Arrays.sort(myExpectedExtractableAttributes); } @Override public void validate(@NotNull List<XmlAttribute> extractableAttributes) { final List<String> names = new ArrayList<String>(extractableAttributes.size()); for (XmlAttribute attribute : extractableAttributes) { names.add(attribute.getName()); } final String[] extractableAttributeNames = ArrayUtil.toStringArray(names); Arrays.sort(extractableAttributeNames); assertTrue( "Expected: " + Arrays.toString(myExpectedExtractableAttributes) + "\nActual: " + Arrays.toString(extractableAttributeNames), Arrays.equals(myExpectedExtractableAttributes, extractableAttributeNames) ); } } }