blob: b37e5b199ed083639fc55fa81830717813881969 [file]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package xmlcursor.xpath.common;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.junit.jupiter.api.Test;
import xmlcursor.common.Common;
import javax.xml.namespace.QName;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static xmlcursor.common.BasicCursorTestCase.cur;
import static xmlcursor.common.BasicCursorTestCase.obj;
/**
* Verifies XPath nodetest functions
*/
public class XPathNodeTest {
private static String fixPath(String path) {
return "." + path;
}
public void testAllNodes() {
//e.g //A/B/*: tested by Zvon
}
@Test
void testComment() throws Exception {
try (XmlCursor m_xc = cur(Common.XML_FOO_NS_PREFIX)) {
String sExpected = "<xml-fragment xmlns:edi=\"http://ecommerce.org/schema\"><!-- the 'price' element's namespace is http://ecommerce.org/schema -->" + Common.XMLFRAG_ENDTAG;//the comment string
String sXPath = "//comment()";
m_xc.selectPath(fixPath(sXPath));
m_xc.toNextSelection();
assertEquals(m_xc.xmlText(), sExpected);
}
}
@Test
void testNode() throws Exception {
String sXPath = "//foo/node()";
String[] sExpected = {
Common.XMLFRAG_BEGINTAG + " " + Common.XMLFRAG_ENDTAG,
"<node>foo</node>",
Common.XMLFRAG_BEGINTAG + "txt" + Common.XMLFRAG_ENDTAG
};
// TODO: add asserts
try (XmlCursor m_xc = cur("<foo> <node>foo</node>txt</foo>")) {
m_xc.selectPath(fixPath(sXPath));
int i = 0;
// assertEquals("node() failed", sExpected.length, m_xc.getSelectionCount());
while (m_xc.hasNextSelection()) {
m_xc.toNextSelection();
//assertEquals(m_xc.xmlText(), sExpected[i++]);
}
}
}
@Test
void testPI() throws Exception {
String sXPath1 = "//processing-instruction()";
String sXPath2 = "//processing-instruction(\"xml-stylesheet\")";
String sXPath3 = "//processing-instruction(\"xsl\")";
String sExpected = Common.XMLFRAG_BEGINTAG + "<?xml-stylesheet type=\"text/xsl\" xmlns=\"http://openuri.org/shipping/\"?>" + Common.XMLFRAG_ENDTAG;
try (XmlCursor m_xc = cur(Common.XML_FOO_PROCINST)) {
m_xc.selectPath(fixPath(sXPath1));
assertEquals(m_xc.getSelectionCount(), 1);
m_xc.toNextSelection();
assertEquals(m_xc.xmlText(), sExpected);
m_xc.clearSelections();
m_xc.selectPath(fixPath(sXPath2));
assertEquals(m_xc.xmlText(), sExpected);
m_xc.clearSelections();
//shouldn't select any nodes
m_xc.selectPath(fixPath(sXPath3));
assertEquals(m_xc.getSelectionCount(), 0);
}
}
@Test
void testText() throws Exception {
String sXml = "<?xml-stylesheet type=\"text/xsl\" xmlns=\"http://openuri.org/shipping/\"?><br>foo<foo>text</foo></br>";
String sXPath = "//text()";
String sExpected1 = Common.XMLFRAG_BEGINTAG + "foo" + Common.XMLFRAG_ENDTAG;
String sExpected2 = Common.XMLFRAG_BEGINTAG + "text" + Common.XMLFRAG_ENDTAG;
try (XmlCursor m_xc = cur(sXml)) {
m_xc.selectPath(sXPath);
assertEquals(m_xc.getSelectionCount(), 2);
m_xc.toNextSelection();
assertEquals(m_xc.xmlText(), sExpected1);
m_xc.toNextSelection();
assertEquals(m_xc.xmlText(), sExpected2);
}
}
@Test
void testTextObject() throws Exception {
String sXml = "<?xml-stylesheet type=\"text/xsl\" xmlns=\"http://openuri.org/shipping/\"?><br>foo<foo>text</foo></br>";
String sXPath = "//text()";
String sExpected1 = Common.XMLFRAG_BEGINTAG + "foo<foo>text</foo>" + Common.XMLFRAG_ENDTAG;
String sExpected2 = Common.XMLFRAG_BEGINTAG + "text" + Common.XMLFRAG_ENDTAG;
XmlObject m_xo = obj(sXml);
XmlObject[] res = m_xo.selectPath(sXPath);
assertEquals(res.length, 2);
assertEquals(res[0].xmlText(), sExpected1);
assertEquals(res[1].xmlText(), sExpected2);
}
@Test
void testNodeEquality() throws Exception {
try (XmlCursor c = cur("<root><book isbn='012345' id='09876'/></root>")) {
c.selectPath("//book[@isbn='012345'] is //book[@id='09876']");
assertEquals(1, c.getSelectionCount());
c.toNextSelection();
assertEquals(Common.wrapInXmlFrag("true"), c.xmlText());
}
}
@Test
void testNodeOrder() throws Exception {
try (XmlCursor c = cur("<root><book isbn='012345'/><book id='09876'/></root>")) {
c.selectPath("//book[@isbn='012345'] << //book[@id='09876']");
assertEquals(1, c.getSelectionCount());
c.toNextSelection();
assertEquals(Common.wrapInXmlFrag("true"), c.xmlText());
c.selectPath("//book[@isbn='012345'] >> //book[@id='09876']");
assertEquals(1, c.getSelectionCount());
c.toNextSelection();
assertEquals(Common.wrapInXmlFrag("false"), c.xmlText());
}
}
@Test
void testParent() throws Exception {
String sXml = "<A><B><C></C></B></A>";
XmlObject o;
try (XmlCursor c = cur(sXml)) {
c.toFirstContentToken();
c.toFirstChild();
c.toFirstChild();
o = c.getObject();
}
assertEquals("<C/>", xmlText(o));
XmlObject[] res = o.selectPath("..");
assertEquals(1, res.length);
assertEquals("<B><C/></B>", xmlText(res[0]));
}
private String xmlText(XmlObject o) {
try (XmlCursor c = o.newCursor()) {
return c.xmlText();
}
}
@Test
void testParent1() throws Exception {
String sXml =
"<AttributeCertificate " +
"xmlns=\"http://www.eurecom.fr/security/xac#\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
"<Content>" +
"<Validity>" +
"<ValidityFrom>2005-02-10T11:02:57.590+01:00</ValidityFrom>" +
"<ValidityTo>2006-02-10T11:02:57.590+01:00</ValidityTo>" +
"</Validity></Content></AttributeCertificate>";
XmlObject o;
try (XmlCursor c = cur(sXml)) {
c.toFirstContentToken();
c.toFirstChild();
c.toFirstChild();
o = c.getObject();
}
QName qn = getName(o);
assertEquals("http://www.eurecom.fr/security/xac#", qn.getNamespaceURI());
assertEquals("Validity", qn.getLocalPart());
XmlObject[] res = o.selectPath("..");
assertEquals(1, res.length);
XmlObject x = res[0];
qn = getName(x);
assertEquals("http://www.eurecom.fr/security/xac#", qn.getNamespaceURI());
assertEquals("Content", qn.getLocalPart());
}
private QName getName(XmlObject o) {
try (XmlCursor c = o.newCursor()) {
return c.getName();
}
}
}