blob: c75487812f0f096633556a9ed68fb48bef49e641 [file] [log] [blame]
package org.intellij.plugins.intelliLang;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.PsiModificationTrackerImpl;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import org.intellij.plugins.intelliLang.inject.InjectLanguageAction;
import org.intellij.plugins.intelliLang.inject.UnInjectLanguageAction;
import org.intellij.plugins.intelliLang.references.FileReferenceInjector;
import org.intellij.plugins.intelliLang.references.InjectedReferencesContributor;
import org.intellij.plugins.intelliLang.references.InjectedReferencesInspection;
import org.jdom.Element;
/**
* @author Dmitry Avdeev
* Date: 02.08.13
*/
public class ReferenceInjectionTest extends LightCodeInsightFixtureTestCase {
public void testInjectReference() throws Exception {
myFixture.configureByText("foo.xml", "<foo xmlns=\"http://foo.bar\" \n" +
" xxx=\"ba<caret>r\"/>");
assertNull(myFixture.getReferenceAtCaretPosition());
assertTrue(new InjectLanguageAction().isAvailable(getProject(), myFixture.getEditor(), myFixture.getFile()));
assertFalse(new UnInjectLanguageAction().isAvailable(getProject(), myFixture.getEditor(), myFixture.getFile()));
InjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile(), new FileReferenceInjector());
assertTrue(myFixture.getReferenceAtCaretPosition() instanceof FileReference);
assertFalse(new InjectLanguageAction().isAvailable(getProject(), myFixture.getEditor(), myFixture.getFile()));
assertTrue(new UnInjectLanguageAction().isAvailable(getProject(), myFixture.getEditor(), myFixture.getFile()));
myFixture.configureByText("bar.xml",
"<foo xmlns=\"<error descr=\"URI is not registered (Settings | Project Settings | Schemas and DTDs)\">http://foo.bar</error>\" \n" +
" xxx=\"<error descr=\"Cannot resolve file 'bar'\">b<caret>ar</error>\"/>");
myFixture.testHighlighting();
UnInjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile());
assertNull(myFixture.getReferenceAtCaretPosition());
}
public void testSurviveSerialization() throws Exception {
myFixture.configureByText("foo.xml", "<foo xmlns=\"http://foo.bar\" \n" +
" xxx=\"ba<caret>r\"/>");
assertNull(myFixture.getReferenceAtCaretPosition());
InjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile(), new FileReferenceInjector());
assertTrue(myFixture.getReferenceAtCaretPosition() instanceof FileReference);
Configuration configuration = Configuration.getInstance();
Element element = configuration.getState();
configuration.loadState(element);
((PsiModificationTrackerImpl)PsiManager.getInstance(getProject()).getModificationTracker()).incCounter();
assertTrue(myFixture.getReferenceAtCaretPosition() instanceof FileReference);
UnInjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile());
assertNull(myFixture.getReferenceAtCaretPosition());
}
public void testInjectIntoTagValue() throws Exception {
myFixture.configureByText("foo.xml", "<foo xmlns=\"http://foo.bar\" <bar>x<caret>xx</bar>/>");
assertNull(myFixture.getReferenceAtCaretPosition());
InjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile(), new FileReferenceInjector());
assertTrue(myFixture.getReferenceAtCaretPosition() instanceof FileReference);
UnInjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile());
assertNull(myFixture.getReferenceAtCaretPosition());
}
public void testInjectIntoJava() throws Exception {
myFixture.configureByText("Foo.java", "class Foo {\n" +
" String bar() {\n" +
" return \"ba<caret>r.xml\";\n" +
" } \n" +
"}");
assertNull(getInjectedReferences());
InjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile(), new FileReferenceInjector());
PsiReference[] references = getInjectedReferences();
PsiReference reference = assertOneElement(references);
assertTrue(reference instanceof FileReference);
UnInjectLanguageAction.invokeImpl(getProject(), myFixture.getEditor(), myFixture.getFile());
assertNull(getInjectedReferences());
}
public void testInjectByAnnotation() throws Exception {
myFixture.configureByText("Foo.java", "class Foo {\n" +
" @org.intellij.lang.annotations.Language(\"file-reference\")\n" +
" String bar() {\n" +
" return \"<error descr=\"Cannot resolve file 'unknown.file'\">unknown.file</error>\";\n" +
" } \n" +
"}");
myFixture.testHighlighting();
}
private PsiReference[] getInjectedReferences() {
PsiElement element = myFixture.getFile().findElementAt(myFixture.getCaretOffset());
element = PsiTreeUtil.getParentOfType(element, PsiLanguageInjectionHost.class);
assertNotNull(element);
return InjectedReferencesContributor.getInjectedReferences(element);
}
@Override
protected void setUp() throws Exception {
super.setUp();
myFixture.enableInspections(new InjectedReferencesInspection());
}
@Override
protected void tearDown() throws Exception {
myFixture.disableInspections(new InjectedReferencesInspection());
super.tearDown();
}
}