blob: 564604bcc5a65b831dd541d9a113dfccc5fc32b3 [file] [log] [blame]
package org.jetbrains.android.dom;
import com.android.SdkConstants;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInsight.documentation.DocumentationManager;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.ex.QuickFixWrapper;
import com.intellij.lang.documentation.DocumentationProvider;
import com.intellij.lang.documentation.ExternalDocumentationProvider;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.spellchecker.inspections.SpellCheckingInspection;
import com.intellij.spellchecker.quickfixes.AcceptWordAsCorrect;
import com.intellij.spellchecker.quickfixes.RenameTo;
import com.intellij.testFramework.UsefulTestCase;
import org.jetbrains.android.AndroidTestCase;
import org.jetbrains.android.inspections.AndroidDomInspection;
import org.jetbrains.android.inspections.AndroidElementNotAllowedInspection;
import org.jetbrains.android.inspections.AndroidMissingOnClickHandlerInspection;
import org.jetbrains.android.inspections.AndroidUnknownAttributeInspection;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @author coyote
*/
@SuppressWarnings({"JUnitTestCaseWithNonTrivialConstructors"})
abstract class AndroidDomTest extends AndroidTestCase {
protected final String testFolder;
protected AndroidDomTest(boolean createManifest, String testFolder) {
super(createManifest);
this.testFolder = testFolder;
}
@Override
public void setUp() throws Exception {
super.setUp();
myFixture.copyFileToProject("R.java", "gen/p1/p2/R.java");
myFixture.enableInspections(AndroidDomInspection.class,
AndroidUnknownAttributeInspection.class,
AndroidElementNotAllowedInspection.class);
}
@Override
protected String getResDir() {
return "dom/res";
}
protected void doTestJavaCompletion(String aPackage) throws Throwable {
final String fileName = getTestName(false) + ".java";
final VirtualFile file = copyFileToProject(fileName, "src/" + aPackage.replace('/', '.') + '/' + fileName);
myFixture.configureFromExistingVirtualFile(file);
myFixture.complete(CompletionType.BASIC);
myFixture.checkResultByFile(testFolder + '/' + getTestName(false) + "_after.java");
}
protected void doTestNamespaceCompletion(boolean systemNamespace, boolean customNamespace) throws IOException {
final VirtualFile file = copyFileToProject(getTestName(true) + ".xml");
myFixture.configureFromExistingVirtualFile(file);
myFixture.complete(CompletionType.BASIC);
final List<String> variants = myFixture.getLookupElementStrings();
assertNotNull(variants);
final List<String> expectedVariants = new ArrayList<String>();
if (systemNamespace) {
expectedVariants.add("http://schemas.android.com/apk/res/android");
}
if (customNamespace) {
expectedVariants.add("http://schemas.android.com/apk/res/p1.p2");
}
expectedVariants.add(SdkConstants.TOOLS_URI);
assertEquals(expectedVariants, variants);
}
protected void doTestCompletionVariants(String fileName, String... variants) throws Throwable {
VirtualFile file = copyFileToProject(fileName);
myFixture.configureFromExistingVirtualFile(file);
myFixture.complete(CompletionType.BASIC);
List<String> lookupElementStrings = myFixture.getLookupElementStrings();
assertNotNull(lookupElementStrings);
UsefulTestCase.assertSameElements(lookupElementStrings, variants);
}
protected void doTestHighlighting() throws Throwable {
doTestHighlighting(getTestName(true) + ".xml");
}
protected void doTestHighlighting(String file) throws Throwable {
VirtualFile virtualFile = copyFileToProject(file);
myFixture.configureFromExistingVirtualFile(virtualFile);
myFixture.checkHighlighting(true, false, false);
}
protected void doTestJavaHighlighting(String aPackage) throws Throwable {
final String fileName = getTestName(false) + ".java";
final VirtualFile virtualFile = copyFileToProject(fileName, "src/" + aPackage.replace('.', '/') + '/' + fileName);
myFixture.configureFromExistingVirtualFile(virtualFile);
myFixture.checkHighlighting(true, false, false);
}
protected void doTestCompletion() throws Throwable {
doTestCompletion(true);
}
protected void doTestCompletion(boolean lowercaseFirstLetter) throws Throwable {
toTestCompletion(getTestName(lowercaseFirstLetter) + ".xml", getTestName(lowercaseFirstLetter) + "_after.xml");
}
protected void toTestCompletion(String fileBefore, String fileAfter) throws Throwable {
VirtualFile file = copyFileToProject(fileBefore);
myFixture.configureFromExistingVirtualFile(file);
myFixture.complete(CompletionType.BASIC);
myFixture.checkResultByFile(testFolder + '/' + fileAfter);
}
protected void doTestSpellcheckerQuickFixes() throws IOException {
myFixture.enableInspections(SpellCheckingInspection.class);
VirtualFile virtualFile = copyFileToProject(getTestName(true) + ".xml");
myFixture.configureFromExistingVirtualFile(virtualFile);
final List<IntentionAction> fixes = highlightAndFindQuickFixes(null);
assertEquals(2, fixes.size());
assertInstanceOf(((QuickFixWrapper)fixes.get(0)).getFix(), RenameTo.class);
assertInstanceOf(((QuickFixWrapper)fixes.get(1)).getFix(), AcceptWordAsCorrect.class);
}
protected abstract String getPathToCopy(String testFileName);
protected VirtualFile copyFileToProject(String path) throws IOException {
return copyFileToProject(path, getPathToCopy(path));
}
protected VirtualFile copyFileToProject(String from, String to) throws IOException {
return myFixture.copyFileToProject(testFolder + '/' + from, to);
}
protected void doTestAndroidPrefixCompletion(@Nullable String prefix) throws IOException {
final VirtualFile f = copyFileToProject(getTestName(true) + ".xml");
myFixture.configureFromExistingVirtualFile(f);
myFixture.complete(CompletionType.BASIC);
List<String> strs = myFixture.getLookupElementStrings();
if (prefix != null) {
assertNotNull(strs);
assertEquals(strs.get(0), prefix);
}
else if (strs != null && strs.size() > 0) {
final String first = strs.get(0);
assertFalse(first.endsWith(":"));
}
}
protected void doTestExternalDoc(String expectedPart) {
final PsiElement originalElement = myFixture.getFile().findElementAt(
myFixture.getEditor().getCaretModel().getOffset());
final PsiElement docTargetElement = DocumentationManager.getInstance(getProject()).
findTargetElement(myFixture.getEditor(), myFixture.getFile(), originalElement);
final DocumentationProvider provider = DocumentationManager.getProviderFromElement(docTargetElement);
final List<String> urls = provider.getUrlFor(docTargetElement, originalElement);
final String doc = ((ExternalDocumentationProvider)provider).fetchExternalDocumentation(myFixture.getProject(), docTargetElement, urls);
assertNotNull(doc);
assertTrue("Can't find " + expectedPart + " in " + doc, doc.contains(expectedPart));
}
protected List<IntentionAction> highlightAndFindQuickFixes(Class<?> aClass) {
final List<HighlightInfo> infos = myFixture.doHighlighting();
final List<IntentionAction> actions = new ArrayList<IntentionAction>();
for (HighlightInfo info : infos) {
final List<Pair<HighlightInfo.IntentionActionDescriptor, TextRange>> ranges = info.quickFixActionRanges;
if (ranges != null) {
for (Pair<HighlightInfo.IntentionActionDescriptor, TextRange> pair : ranges) {
final IntentionAction action = pair.getFirst().getAction();
if (aClass == null || action.getClass() == aClass) {
actions.add(action);
}
}
}
}
return actions;
}
protected void doTestOnClickQuickfix(VirtualFile file) {
myFixture.configureFromExistingVirtualFile(file);
final List<IntentionAction> actions = highlightAndFindQuickFixes(AndroidMissingOnClickHandlerInspection.MyQuickFix.class);
assertEquals(1, actions.size());
final IntentionAction action = actions.get(0);
assertInstanceOf(action, AndroidMissingOnClickHandlerInspection.MyQuickFix.class);
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
((AndroidMissingOnClickHandlerInspection.MyQuickFix)action).doApplyFix(getProject());
}
});
myFixture.checkResultByFile(testFolder + "/onClickIntention.xml");
}
}