blob: 161eda9f32365335d3e2252383a556fdcf2918fb [file] [log] [blame]
package com.intellij.codeInsight;
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.xml.XmlFile
import com.intellij.psi.xml.XmlTag
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.application.WriteAction
/**
* @author mike
*/
public class XmlXIncludeTest extends LightCodeInsightFixtureTestCase {
private static final String BASE_PATH = "/psi/xi";
public void testBasicXi() throws Exception {
configure();
assertSubtagNames("before", "include1", "after");
}
public void testXpointerXi1() throws Exception {
configure();
assertSubtagNames("before", "foo", "bar", "after");
}
@Override
protected String getBasePath() {
return "/xml/tests/testData/" + BASE_PATH;
}
private void assertSubtagNames(String... expectedNames) {
final XmlTag tag = ((XmlFile)myFixture.file).document.rootTag
final List<String> names = tag.getSubTags().collect { it.name }
assertEquals(
"subtags are different",
StringUtil.join(expectedNames, "\n"), StringUtil.join(names, "\n")
);
}
private void configure() throws Exception {
myFixture.configureByFiles(getName() + ".xml", "/include1.xml");
}
public void testModifyingIncludedFile() {
myFixture.configureByText 'a.xml', '''
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<before/>
<xi:include href="include1.xml" xpointer="xpointer(/include1/*)"/>
<after/>
</root>
'''
def inc1 = myFixture.copyFileToProject("include1.xml")
assertSubtagNames("before", "foo", "bar", "after")
changeText inc1, '<include1><a/></include1>'
assertSubtagNames("before", "a", "after")
}
public void testModifyingTransitivelyIncludedFile() {
myFixture.configureByText 'a.xml', '''
<root xmlns:xi="http://www.w3.org/2001/XInclude">
<before/>
<xi:include href="include1.xml" xpointer="xpointer(/include1/*)"/>
<after/>
</root>
'''
myFixture.addFileToProject("include1.xml", """
<include1 xmlns:xi="http://www.w3.org/2001/XInclude">
<foo attr1="val1"> <fooChild/> </foo>
<bar/>
<xi:include href="include2.xml""/>
</include1>
""")
def inc2 = myFixture.addFileToProject("include2.xml", '<a/>')
assertSubtagNames("before", "foo", "bar", "a", "after")
changeText inc2.virtualFile, '<b/>'
assertSubtagNames("before", "foo", "bar", "b", "after")
}
private changeText(VirtualFile inc1, String s) {
def token = WriteAction.start()
try {
FileDocumentManager.instance.getDocument(inc1).setText s
PsiDocumentManager.getInstance(project).commitAllDocuments()
}
finally {
token.finish()
}
}
}