| <?xml version="1.0"?> |
| <!-- |
| Copyright 2002-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. |
| --> |
| <test:suite |
| xmlns:j="jelly:core" |
| xmlns:x="jelly:xml" |
| xmlns:test="jelly:junit"> |
| |
| |
| <test:case name="testUriParse"> |
| <x:parse var="doc" xml="dummy.xml"/> |
| |
| <test:assert xpath="$doc/dummy/entry[@id='2']"/> |
| </test:case> |
| |
| <test:case name="testBodyParse"> |
| |
| <x:parse var="doc"> |
| <foo> |
| <bar a="1"/> |
| </foo> |
| </x:parse> |
| |
| <test:assert xpath="$doc/foo/bar[@a='1']"/> |
| </test:case> |
| |
| <test:case name="testTextParse"> |
| |
| <j:set var="text" encode="false"> |
| <foo> |
| <bar a="1"/> |
| </foo> |
| </j:set> |
| |
| <x:parse var="doc" text="${text}"/> |
| |
| <test:assert xpath="$doc/foo/bar[@a='1']"/> |
| </test:case> |
| |
| <test:case name="testElementAndAttribute"> |
| |
| <x:parse var="doc"> |
| <x:element name="foo"> |
| <x:attribute name="x">1234</x:attribute> |
| |
| <x:element name="bar"> |
| <x:attribute name="y">ABC</x:attribute> |
| hello |
| </x:element> |
| </x:element> |
| </x:parse> |
| |
| <test:assert xpath="$doc/foo"/> |
| <test:assert xpath="$doc/foo[@x='1234']"/> |
| <test:assert xpath="count($doc/bar) = 0"/> |
| |
| <!-- test nested element and attributes --> |
| <test:assert xpath="$doc/foo[@x='1234']/bar[@y='ABC']"/> |
| <test:assert xpath="$doc/foo[@x='1234']/bar[@y='ABC']='hello'"/> |
| </test:case> |
| |
| <test:case name="testBadElementAndAttribute"> |
| |
| |
| <j:catch var="ex"> |
| <x:element name="foo"> |
| some text |
| <x:attribute name="x">1234</x:attribute> |
| </x:element> |
| </j:catch> |
| |
| |
| <test:assert test="${ex != null}"> |
| We should have created an exception as some text is output before the attributes |
| </test:assert> |
| </test:case> |
| |
| <test:case name="assertXPathTests"> |
| |
| <x:parse var="doc"> |
| <foo> |
| <bar>cheese</bar> |
| </foo> |
| </x:parse> |
| |
| |
| <test:assert xpath="$doc/foo/bar">This should never fail</test:assert> |
| <test:assert xpath="$doc/foo/bar = 'cheese'">This should never fail</test:assert> |
| |
| <j:catch var="ex"> |
| <test:assert xpath="$doc/foo/xyz">This should always fail</test:assert> |
| </j:catch> |
| |
| <test:assert test="${ex != null}">We should have created an exception</test:assert> |
| |
| The exception was: ${ex.message} |
| </test:case> |
| |
| <!-- test the use of namespaces with XPath --> |
| <test:case name="assertXPathWithNamespaceTests" xmlns:a="fooURI" xmlns:z="doesNotMatch" xmlns="different"> |
| |
| <x:parse var="doc"> |
| <foo xmlns="fooURI"> |
| <bar>cheese</bar> |
| </foo> |
| </x:parse> |
| |
| <test:assert xpath="$doc/a:foo/a:bar">This should never fail</test:assert> |
| <test:assert xpath="$doc/b:foo/b:bar" xmlns:b="fooURI">This should never fail</test:assert> |
| |
| <j:catch var="ex"> |
| <test:assert xpath="$doc/z:foo/z:bar">This should always fail</test:assert> |
| </j:catch> |
| |
| <test:assert test="${ex != null}">We should have created an exception</test:assert> |
| |
| <j:catch var="ex"> |
| <test:assert xpath="$doc/foo/bar">This should always fail, since foo is not in the empty namespace</test:assert> |
| </j:catch> |
| |
| <test:assert test="${ex != null}">We should have created an exception</test:assert> |
| |
| <!-- |
| || now lets test that the default namespace 'different' is ignored by the XPath expressions |
| || since XPath should ignore the default namespace - you must use a prefix in XPath to denote |
| || a namespace |
| --> |
| <test:assert xpath="$doc/*[local-name()='foo']"/> |
| </test:case> |
| |
| <!-- test xpath sorting --> |
| <test:case name="testXpathSorting"> |
| <x:parse var="nums"> |
| <a> |
| <b v="3"/> |
| <b v="2"/> |
| <b v="1"/> |
| <b v="11"/> |
| <b v="1.4"/> |
| <b v="1.2"/> |
| </a> |
| </x:parse> |
| |
| <x:parse var="deeper"> |
| <a> |
| <b><c><d>3<e>1</e></d></c></b> |
| <b><c><d>2<e>11</e></d></c></b> |
| <b><c><d>1</d></c></b> |
| <b><c><d>11</d></c></b> |
| </a> |
| </x:parse> |
| |
| <!-- test ascending --> |
| <j:set var="result" value=""/> |
| <x:forEach select="$nums/a/b" var="x" sort="number(@v)"> |
| <x:set var="num" select="$x/@v"/> |
| <j:set var="result" value="${result} ${num.get(0).getText()}"/> |
| </x:forEach> |
| |
| <test:assertEquals expected=" 1 1.2 1.4 2 3 11" actual="${result}"/> |
| |
| <!-- test descending --> |
| <j:set var="result" value=""/> |
| <x:forEach select="$nums/a/b" var="x" sort="number(@v)" descending="true"> |
| <x:set var="num" select="$x/@v"/> |
| <j:set var="result" value="${result} ${num.get(0).getText()}"/> |
| </x:forEach> |
| |
| <test:assertEquals expected=" 11 3 2 1.4 1.2 1" actual="${result}"/> |
| |
| <!-- test deeper nesting --> |
| <j:set var="result" value=""/> |
| <x:forEach select="$deeper/a/b" var="x" sort="number(c/d/text())"> |
| <j:set var="result" value="${result} ${x.getStringValue()}"/> |
| </x:forEach> |
| |
| <test:assertEquals expected=" 1 211 31 11" actual="${result}"/> |
| |
| <!-- test sort as strings --> |
| <j:set var="result" value=""/> |
| <x:forEach select="$nums/a/b" var="x" sort="@v"> |
| <x:set var="num" select="$x/@v"/> |
| <j:set var="result" value="${result} ${num.get(0).getText()}"/> |
| </x:forEach> |
| |
| <test:assertEquals expected=" 1 1.2 1.4 11 2 3" actual="${result}"/> |
| |
| <!-- test x:set with sort --> |
| <j:set var="result" value=""/> |
| <x:set var="rset" select="$nums/a/b" sort="number(@v)"/> |
| <j:forEach var="num" items="${rset.iterator()}"> |
| <j:set var="result" value="${result} ${num.attributeValue('v')}"/> |
| </j:forEach> |
| |
| <test:assertEquals expected=" 1 1.2 1.4 2 3 11" actual="${result}"/> |
| |
| <!-- test x:set with sort --> |
| <j:set var="result" value=""/> |
| <x:set var="rset" select="$nums/a/b"/> |
| <x:sort list="${rset}" sort="number(@v)"/> |
| <j:forEach var="num" items="${rset.iterator()}"> |
| <j:set var="result" value="${result} ${num.attributeValue('v')}"/> |
| </j:forEach> |
| |
| <test:assertEquals expected=" 1 1.2 1.4 2 3 11" actual="${result}"/> |
| |
| </test:case> |
| |
| |
| <test:case name="testCommentWithLexical"> |
| |
| <x:parse var="doc"> |
| <foo> |
| <!-- this will not be output --> |
| |
| <x:comment text="this is a comment"/> |
| </foo> |
| </x:parse> |
| |
| <test:assert xpath="$doc/foo"/> |
| |
| <j:set var="t"><x:copyOf select="$doc/foo/comment()" lexical="true"/></j:set> |
| |
| <test:assertEquals expected="<!--this is a comment-->" actual="${t.trim()}"/> |
| |
| </test:case> |
| |
| <test:case name="testCommentWithoutLexical"> |
| |
| <x:parse var="doc"> |
| <foo> |
| <!-- this will not be output --> |
| |
| <x:comment text="this is a comment"/> |
| </foo> |
| </x:parse> |
| |
| <test:assert xpath="$doc/foo"/> |
| |
| <j:set var="t"><x:copyOf select="string($doc/foo/comment())" lexical="true"/></j:set> |
| |
| <test:assertEquals expected="this is a comment" actual="${t.trim()}"/> |
| |
| </test:case> |
| |
| <test:case name="testCommentWithTextAttributeWithLexical"> |
| |
| <x:parse var="doc"> |
| <foo> |
| <!-- this will not be output --> |
| |
| <x:comment text="this is a comment"/> |
| </foo> |
| </x:parse> |
| |
| <test:assert xpath="$doc/foo"/> |
| |
| <j:set var="t"><x:copyOf select="$doc/foo/comment()" lexical="true"/></j:set> |
| |
| <test:assertEquals expected="<!--this is a comment-->" actual="${t.trim()}"/> |
| </test:case> |
| |
| <test:case name="testFileParse"> |
| <j:new var="theSuite" className="java.io.File"> |
| <j:arg value="${basedir}/src/test/org/apache/commons/jelly/tags/xml/suite.jelly"/> |
| </j:new> |
| exists = ${theSuite.exists()}, readable = ${theSuite.canRead()}, class=${theSuite.class.name} |
| <!-- this test fails with beanutils 1.6 |
| <x:parse var="suite" xml="${theSuite}"/> --> |
| </test:case> |
| |
| |
| <test:case name="testSetSingleNodeAndAsString"> |
| <x:parse var="blopElements"> |
| <root> |
| <blop>blop1</blop> |
| <blip/> |
| <blop id="bla">blop0</blop></root> |
| </x:parse> |
| <x:set var="blopSingle" select="$blopElements/root/blop" single="true"/> |
| <!-- should return the second --> |
| <j:invokeStatic var="eltClass" className="java.lang.Class" method="forName"><j:arg value="org.dom4j.Element"/></j:invokeStatic> |
| <test:assert test="${eltClass.isAssignableFrom(blopSingle.getClass())}"/> |
| <j:set var="blopSingleText"><x:expr select="$blopSingle/text()"/></j:set> |
| <test:assertEquals actual="${blopSingleText}" expected="blop1"/> |
| <!-- check if selecting root/blip returns a list --> |
| <x:set var="blip" select="$blopElements/root/blip" single="false"/> |
| <j:invokeStatic var="listClass" className="java.lang.Class" method="forName"><j:arg value="java.util.List"/></j:invokeStatic> |
| <test:assert test="${listClass.isAssignableFrom(blip.getClass())}"/> |
| <!-- check if selecting blop/@id asString returns a string --> |
| <x:set var="blopId" select="$blopElements/root/blop/@id" asString="true"/> |
| <j:invokeStatic var="stringClass" className="java.lang.Class" method="forName"><j:arg value="java.lang.String"/></j:invokeStatic> |
| <test:assert test="${stringClass.isAssignableFrom(blopId.getClass())}"/> |
| </test:case> |
| |
| <test:case name="testEntities"> |
| <x:parse var="doc" xml="entity.xml"/> |
| |
| <!--just the entity is output--> |
| <j:set var="value"><x:copyOf select="$doc/a/node()"/></j:set> |
| <test:assertEquals actual="${value}" expected="y"/> |
| |
| <!--both the entity and it's lexical name are properly output--> |
| <j:set var="value"><x:copyOf select="$doc/a/node()" lexical="true"/></j:set> |
| <test:assertEquals actual="${value}" expected="&x;y"/> |
| </test:case> |
| |
| </test:suite> |