Fixed bug 297958: [xpath2] fn:nilled never returns true https://bugs.eclipse.org/bugs/show_bug.cgi?id=297958
diff --git a/tests/org.eclipse.wst.xml.xpath2.processor.tests/bugTestFiles/bugNilled.xml b/tests/org.eclipse.wst.xml.xpath2.processor.tests/bugTestFiles/bugNilled.xml new file mode 100644 index 0000000..7566560 --- /dev/null +++ b/tests/org.eclipse.wst.xml.xpath2.processor.tests/bugTestFiles/bugNilled.xml
@@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="bugNilled.xsd"> + <!-- Nillable, but not nilled --> + <element1>1</element1> + + <!-- Nillable and nilled --> + <element2 xsi:nil="true"/> + + <!-- Not nillable, and obviously not nilled (it would give a validation error)--> + <element3>42</element3> + + <!-- Not processed / validated, and so never nill --> + <element4 xsi:nil="true">42</element4> +</root>
diff --git a/tests/org.eclipse.wst.xml.xpath2.processor.tests/bugTestFiles/bugNilled.xsd b/tests/org.eclipse.wst.xml.xpath2.processor.tests/bugTestFiles/bugNilled.xsd new file mode 100644 index 0000000..a7e2b6d --- /dev/null +++ b/tests/org.eclipse.wst.xml.xpath2.processor.tests/bugTestFiles/bugNilled.xsd
@@ -0,0 +1,14 @@ +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="root"> + <xs:complexType> + <xs:sequence> + <xs:element name="element1" type = "xs:integer" nillable="true"/> + <xs:element name="element2" type = "xs:integer" nillable="true"/> + <xs:element name="element3" type = "xs:integer" nillable="false"/> + <xs:any namespace="##any" processContents="skip"/> + </xs:sequence> + </xs:complexType> + </xs:element> + +</xs:schema> \ No newline at end of file
diff --git a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java index dd96447..1088e0e 100644 --- a/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java +++ b/tests/org.eclipse.wst.xml.xpath2.processor.tests/src/org/eclipse/wst/xml/xpath2/processor/test/TestBugs.java
@@ -32,13 +32,10 @@ * bug 281046 implementation of xs:base64Binary data type * Jesper S Moller - bug 286061 correct handling of quoted string * Jesper S Moller - bug 280555 - Add pluggable collation support + * Jesper S Moller - bug 297958 Fix fn:nilled for elements *******************************************************************************/ package org.eclipse.wst.xml.xpath2.processor.test; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; import java.net.URL; import java.util.Comparator; @@ -47,14 +44,6 @@ import org.apache.xerces.xs.XSModel; import org.eclipse.core.runtime.Platform; -import org.eclipse.wst.sse.core.StructuredModelManager; -import org.eclipse.wst.sse.core.internal.provisional.IModelLoader; -import org.eclipse.wst.sse.core.internal.provisional.IModelManager; -import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; -import org.eclipse.wst.sse.core.internal.util.Utilities; -import org.eclipse.wst.xml.core.internal.modelhandler.ModelHandlerForXML; -import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML; -import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; import org.eclipse.wst.xml.xpath2.processor.CollationProvider; import org.eclipse.wst.xml.xpath2.processor.DefaultDynamicContext; import org.eclipse.wst.xml.xpath2.processor.DefaultEvaluator; @@ -62,14 +51,12 @@ import org.eclipse.wst.xml.xpath2.processor.Evaluator; import org.eclipse.wst.xml.xpath2.processor.ResultSequence; import org.eclipse.wst.xml.xpath2.processor.ast.XPath; -import org.eclipse.wst.xml.xpath2.processor.internal.types.AnyType; import org.eclipse.wst.xml.xpath2.processor.internal.types.XSBoolean; import org.eclipse.wst.xml.xpath2.processor.internal.types.XSDecimal; import org.eclipse.wst.xml.xpath2.processor.internal.types.XSDouble; import org.eclipse.wst.xml.xpath2.processor.internal.types.XSDuration; import org.eclipse.wst.xml.xpath2.processor.internal.types.XSFloat; import org.osgi.framework.Bundle; -import org.w3c.dom.Document; public class TestBugs extends AbstractPsychoPathTest { @@ -484,6 +471,40 @@ assertEquals("true", actual); } + public void testNilled() throws Exception { + // This is a terrible shortcoming in the test suite, I'd say + URL fileURL = bundle.getEntry("/bugTestFiles/bugNilled.xml"); + URL schemaURL = bundle.getEntry("/bugTestFiles/bugNilled.xsd"); + + loadDOMDocument(fileURL, schemaURL); + + // Get XSModel object for the Schema + XSModel schema = getGrammar(schemaURL); + + DynamicContext dc = setupDynamicContext(schema); + + assertTrue(evaluateBoolean(dc, "empty( nilled( / ) )")); + assertTrue(evaluateBoolean(dc, "empty( nilled( /root/@attr1 ) )")); + assertTrue(evaluateBoolean(dc, "empty( nilled( /root/element1/text() ) )")); + + assertFalse(evaluateBoolean(dc, "nilled(/root/element1)")); + assertTrue(evaluateBoolean(dc, "nilled(/root/element2)")); + assertFalse(evaluateBoolean(dc, "nilled(/root/element3)")); + assertFalse(evaluateBoolean(dc, "nilled(/root/element4)")); + } + + // I can't stand to see so much duplicated code!!! + private boolean evaluateBoolean(DynamicContext dc, String xpath) throws Exception { + XPath path = compileXPath(dc, xpath); + + Evaluator eval = new DefaultEvaluator(dc, domDoc); + ResultSequence rs = eval.evaluate(path); + + XSBoolean result = (XSBoolean) rs.first(); + + return result.value(); + } + public void testXSNonPositiveInteger() throws Exception { // Bug 277599 bundle = Platform.getBundle("org.w3c.xqts.testsuite");