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");