}
@Test
public void position() throws XMLDBException, IOException, SAXException {
final XQueryService service =
storeXMLStringAndGetQueryService("numbers.xml", numbers);
queryResource(service, "numbers.xml", "//item[position() = 3]", 1);
queryResource(service, "numbers.xml", "//item[position() < 3]", 2);
queryResource(service, "numbers.xml", "//item[position() <= 3]", 3);
queryResource(service, "numbers.xml", "//item[position() > 3]", 1);
queryResource(service, "numbers.xml", "//item[position() >= 3]", 2);
queryResource(service, "numbers.xml", "//item[position() eq 3]", 1);
queryResource(service, "numbers.xml", "//item[position() lt 3]", 2);
queryResource(service, "numbers.xml", "//item[position() le 3]", 3);
queryResource(service, "numbers.xml", "//item[position() gt 3]", 1);
queryResource(service, "numbers.xml", "//item[position() ge 3]", 2);
queryResource(service, "numbers.xml", "//item[last() - 1]", 1);
queryResource(service, "numbers.xml", "//item[count(('a','b')) - 1]", 1);
String query = "for $a in (<a/>, <b/>, <c/>) return $a/position()";
ResourceSet result = service.queryResource("numbers.xml", query);
assertEquals("XPath: " + query, 3, result.getSize());
XMLResource resource = (XMLResource)result.getResource(0);
assertEquals("XPath: " + query, "1", resource.getContent().toString());
resource = (XMLResource)result.getResource(1);
assertEquals("XPath: " + query, "1", resource.getContent().toString());
resource = (XMLResource)result.getResource(2);
assertEquals("XPath: " + query, "1", resource.getContent().toString());
query = "declare variable $doc { <root>" +
"<a>1</a><a>2</a><a>3</a><a>4</a><a>5</a><a>6</a><a>7</a>" +
"</root> }; " +
"(for $x in $doc/a return $x)[position() mod 3 = 2]";
result = service.queryResource("numbers.xml", query);
assertEquals("XPath: " + query, 2, result.getSize());
query = "declare variable $doc { <root>" +
"<a>1</a><a>2</a><a>3</a><a>4</a><a>5</a><a>6</a><a>7</a>" +
"</root> }; " +
"for $x in $doc/a return $x[position() mod 3 = 2]";
result = service.queryResource("numbers.xml", query);
assertEquals("XPath: " + query, 0, result.getSize());
query = "declare variable $doc { <root>" +
"<a>1</a><a>2</a><a>3</a><a>4</a><a>5</a><a>6</a><a>7</a>" +
"</root> }; " +
"for $x in $doc/a[position() mod 3 = 2] return $x";
result = service.queryResource("numbers.xml", query);
assertEquals("XPath: " + query, 2, result.getSize());
query = "let $test := <test><a> a </a><a>a</a></test>" +
"return distinct-values($test/a/normalize-space(.))";
result = service.queryResource("numbers.xml", query);
assertEquals("XPath: " + query, 1, result.getSize());
resource = (XMLResource)result.getResource(0);
assertEquals("XPath: " + query, "a", resource.getContent().toString());
query = "let $doc := document {<a><b n='1'/><b n='2'/></a>} " +
"return $doc//b/(if (@n = '1') then position() else ())";
result = service.queryResource("numbers.xml", query);
assertEquals("XPath: " + query, 1, result.getSize());
assertEquals("1", result.getResource(0).getContent().toString());
//Try a second time to see if the position is reset
result = service.queryResource("numbers.xml", query);
assertEquals("XPath: " + query, 1, result.getSize());
assertEquals("1", result.getResource(0).getContent().toString());
query = "let $doc := document {<a><b/></a>} " +
"return $doc/a[1] [b[1]]";
service.setProperty(OutputKeys.INDENT, "no");
result = service.queryResource("numbers.xml", query);
assertEquals("XPath: " + query, 1, result.getSize());
assertXMLEqual("<a><b/></a>", result.getResource(0).getContent().toString());
//TODO : make this work ! It currently returns some content
//query = "let $doc := document {<a><b><c>1</c></b><b><c>a</c></b></a>} " +