package org.expath.ns;
import static org.basex.query.QueryError.*;
import static org.junit.Assert.*;
import org.basex.*;
import org.basex.query.*;
import org.basex.query.value.item.*;
import org.basex.util.*;
import org.junit.*;
/**
* This class tests the XQuery Geo functions prefixed with "geo".
*
* @author BaseX Team 2005-17, BSD License
* @author Masoumeh Seydi
*/
public final class GeoTest extends SandboxTest {
/** Test method. */
@Test
public void dimension() {
run("geo:dimension(" +
"<gml:Point><gml:coordinates>1,2</gml:coordinates></gml:Point>)", "0");
error("geo:dimension(text {'a'})", INVCAST_X_X_X);
error("geo:dimension(<gml:unknown/>)", GeoErrors.qname(1));
error("geo:dimension(<gml:Point>" +
"<gml:coordinates>1 2</gml:coordinates></gml:Point>)",
GeoErrors.qname(2));
}
/** Test method. */
@Test
public void geometryType() {
run("geo:geometryType(<gml:MultiPoint><gml:Point>" +
"<gml:coordinates>1,1</gml:coordinates></gml:Point>" +
"<gml:Point><gml:coordinates>1,2</gml:coordinates></gml:Point>" +
"</gml:MultiPoint>)", "gml:MultiPoint");
error("geo:geometryType(text {'srsName'})", INVCAST_X_X_X);
error("geo:geometryType(<gml:unknown/>)", GeoErrors.qname(1));
error("geo:geometryType(<gml:Point><gml:coordinates>1 2</gml:coordinates>" +
"</gml:Point>)", GeoErrors.qname(2));
}
/** Test method. */
@Test
public void srid() {
run("geo:srid(<gml:Polygon srsName=" +
"\"http://www.opengis.net/gml/srs/epsg.xml#4326\">" +
"<outerboundaryIs><gml:LinearRing><coordinates>" +
"-150,50 -150,60 -125,60 -125,50 -150,50" +
"</coordinates></gml:LinearRing></outerboundaryIs></gml:Polygon>)", "0");
error("geo:srid(text {'a'})", INVCAST_X_X_X);
error("geo:srid(<gml:unknown/>)", GeoErrors.qname(1));
error("geo:srid(<gml:LinearRing><gml:pos>1,1 20,1 50,30 1,1</gml:pos>" +
"</gml:LinearRing>)", GeoErrors.qname(2));
}
/** Test method. */
@Test
public void envelope() {
run("geo:envelope(<gml:LinearRing><gml:coordinates>1,1 20,1 50,30 1,1" +
"</gml:coordinates></gml:LinearRing>)",
"<gml:Polygon xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>1.0,1.0 1.0,30.0 50.0,30.0 50.0,1.0 1.0,1.0" +
"</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>");
error("geo:envelope(text {'a'})", INVCAST_X_X_X);
error("geo:envelope(<gml:unknown/>)", GeoErrors.qname(1));
error("geo:envelope(<gml:LinearRing><gml:pos>1,1 20,1 50,30 1,1</gml:pos>" +
"</gml:LinearRing>)", GeoErrors.qname(2));
}
/** Test method. */
@Test
public void asText() {
run("geo:asText(<gml:LineString><gml:coordinates>1,1 55,99 2,1" +
"</gml:coordinates></gml:LineString>)", "LINESTRING (1 1, 55 99, 2 1)");
error("geo:asText(text {'a'})", INVCAST_X_X_X);
error("geo:asText(<gml:unknown/>)", GeoErrors.qname(1));
error("geo:asText(<gml:LineString><gml:coordinates>1,1</gml:coordinates>" +
"</gml:LineString>)", GeoErrors.qname(2));
}
/** Test method. */
@Test
public void asBinary() {
run("string(geo:asBinary(<gml:LineString><gml:coordinates>1,1 55,99 2,1" +
"</gml:coordinates></gml:LineString>))",
"AAAAAAIAAAADP/AAAAAAAAA/8AAAAAAAAEBLgAAAAAAAQFjAAAAAAABAAAAAAAAAAD/wAAAAAAAA");
error("geo:asBinary(text {'a'})", INVCAST_X_X_X);
error("geo:asBinary(<gml:unknown/>)", GeoErrors.qname(1));
error("geo:asBinary(<gml:LinearRing><gml:coordinates>1,1 55,99 2,1" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(2));
}
/** Test method. */
@Test
public void isSimple() {
run("geo:isSimple(<gml:LineString><gml:coordinates>1,1 20,1 10,4 20,-10" +
"</gml:coordinates></gml:LineString>)", "false");
error("geo:isSimple(text {'a'})", INVCAST_X_X_X);
error("geo:isSimple(<gml:unknown/>)", GeoErrors.qname(1));
error("geo:isSimple(<gml:LinearRing><gml:coordinates>1,1 55,99 2,1" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(2));
}
/** Test method. */
@Test
public void boundary() {
run("geo:boundary(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>11,11 18,11 18,18 11,18 11,11</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>)",
"<gml:LineString xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>11.0,11.0 18.0,11.0 18.0,18.0 11.0,18.0 11.0,11.0</gml:coordinates>" +
"</gml:LineString>");
run("geo:boundary(" +
"<gml:Point><gml:coordinates>2,3</gml:coordinates></gml:Point>)",
"<gml:MultiGeometry xmlns:gml=\"http://www.opengis.net/gml\"/>");
error("geo:boundary(text {'a'})", INVCAST_X_X_X);
error("geo:boundary(a)", NOCTX_X);
error("geo:boundary(<gml:geo/>)", GeoErrors.qname(1));
error("geo:boundary(<gml:Point><gml:pos>1 2</gml:pos></gml:Point>)",
GeoErrors.qname(2));
}
/** Test method. */
@Test
public void equals() {
run("geo:equals(<gml:LinearRing><gml:coordinates>1,1 2,1 5,3 1,1" +
"</gml:coordinates></gml:LinearRing>, " +
"<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>1,1 2,1 5,3 1,1</gml:coordinates></gml:LinearRing>" +
"</gml:outerBoundaryIs></gml:Polygon>)", "false");
error("geo:equals(text {'a'}, a)", NOCTX_X);
error("geo:equals(<gml:unknown/>, <gml:LinearRing><gml:coordinates>" +
"1,1 2,1 5,3 1,1</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(1));
error("geo:equals(<gml:LinearRing><gml:coordinates>1,1 55,99 2,1" +
"</gml:coordinates></gml:LinearRing>," +
"<gml:LineString><gml:coordinates>1,1 55,99 2,1" +
"</gml:coordinates></gml:LineString>)", GeoErrors.qname(2));
}
/** Test method. */
@Test
public void disjoint() {
run("geo:disjoint(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>, " +
"<gml:LineString><gml:coordinates>0,0 2,1 3,3</gml:coordinates>" +
"</gml:LineString>)", "false");
error("geo:disjoint(a, text {'a'})", NOCTX_X);
error("geo:disjoint(<gml:Ring/>, " +
"<gml:LinearRing><gml:coordinates>1,1 2,1 5,3 1,1</gml:coordinates>" +
"</gml:LinearRing>)", GeoErrors.qname(1));
error("geo:disjoint(<gml:LineString><gml:coordinates></gml:coordinates>" +
"</gml:LineString>)", JAVAARITY_X_X_X_X);
}
/** Test method. */
@Test
public void intersects() {
run("geo:intersects(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>, <gml:LineString><gml:coordinates>0,0 2,1 3,3" +
"</gml:coordinates></gml:LineString>)", "true");
error("geo:intersects(a, text {'a'})", NOCTX_X);
error("geo:intersects(<gml:Point><gml:coordinates>10,10 12,11</gml:coordinates>" +
"</gml:Point>, <gml:LinearRing><gml:coordinates>1,1 2,1 5,3 1,1" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(2));
error("geo:intersects(<gml:Point><gml:coordinates>1,1</gml:coordinates>" +
"</gml:Point>, <gml:Line><gml:coordinates>0,0 2,1 3,3</gml:coordinates>" +
"</gml:Line>)", GeoErrors.qname(1));
}
/** Test method. */
@Test
public void touches() {
run("geo:touches(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>, <gml:LineString><gml:coordinates>0,0 2,1 3,3" +
"</gml:coordinates></gml:LineString>)", "false");
error("geo:touches(a, text {'a'})", NOCTX_X);
error("geo:touches(<gml:Point><gml:coordinates>10,10 12,11</gml:coordinates>" +
"</gml:Point>, <gml:LinearRing><gml:coordinates>1,1 2,1 5,3 1,1" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(2));
error("geo:touches(<gml:Point><gml:coordinates>1,1</gml:coordinates>" +
"</gml:Point>, <gml:Line><gml:coordinates>0,0 2,1 3,3" +
"</gml:coordinates></gml:Line>)", GeoErrors.qname(1));
}
/** Test method. */
@Test
public void crosses() {
run("geo:crosses(" +
"<gml:Point><gml:coordinates>10,11</gml:coordinates></gml:Point>, " +
"<gml:LineString><gml:coordinates>0,0 2,2</gml:coordinates></gml:LineString>)",
"false");
error("geo:crosses(a, text {'a'})", NOCTX_X);
error("geo:crosses(<gml:Point><gml:coordinates>10,10 12,11" +
"</gml:coordinates></gml:Point>, " +
"<gml:LinearRing><gml:coordinates>1,1 2,1 5,3 1,1</gml:coordinates>" +
"</gml:LinearRing>)", GeoErrors.qname(2));
error("geo:crosses(<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>)",
JAVAARITY_X_X_X_X);
}
/** Test method. */
@Test
public void within() {
run("geo:within(<gml:LinearRing><gml:coordinates>1,1 2,1 5,3 1,1" +
"</gml:coordinates></gml:LinearRing>, " +
"<gml:LinearRing><gml:coordinates>1,1 20,1 50,30 1,1</gml:coordinates>" +
"</gml:LinearRing>)", "false");
error("geo:within()", JAVAARITY_X_X_X_X);
error("geo:within(" +
"<gml:unknown><gml:coordinates>1,1</gml:coordinates></gml:unknown>, " +
"<gml:LinearRing><gml:coordinates>1,1 2,1 5,3 1,1" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(1));
error("geo:within(<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>)",
JAVAARITY_X_X_X_X);
}
/** Test method. */
@Test
public void contains() {
run("geo:contains(" +
"<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>, " +
"<gml:Point><gml:coordinates>1.00,1.00</gml:coordinates></gml:Point>)",
"true");
error("geo:contains()", JAVAARITY_X_X_X_X);
error("geo:contains(" +
"<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>, " +
"<gml:Line><gml:coordinates>1,1 2,1 5,3 1,1</gml:coordinates></gml:Line>)",
GeoErrors.qname(1));
error("geo:contains(" +
"<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>)",
JAVAARITY_X_X_X_X);
}
/** Test method. */
@Test
public void overlaps() {
run("geo:overlaps(" +
"<gml:LineString><gml:coordinates>1,1 55,99 2,1</gml:coordinates>" +
"</gml:LineString>, <gml:LineString><gml:coordinates>1,1 55,0" +
"</gml:coordinates></gml:LineString>)", "false");
error("geo:overlaps()", JAVAARITY_X_X_X_X);
error("geo:overlaps(<gml:LineString><gml:coordinates>1,1 55,99 2,1" +
"</gml:coordinates></gml:LineString>," +
"<gml:LineString></gml:LineString>)", GeoErrors.qname(2));
error("geo:overlaps(" +
"<gml:unknown><gml:coordinates>1,1</gml:coordinates></gml:unknown>)",
JAVAARITY_X_X_X_X);
}
/** Test method. */
@Test
public void relate() {
run("geo:relate(" +
"<gml:Point><gml:coordinates>18,11</gml:coordinates></gml:Point>, " +
"<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>" +
"10,10 20,10 30,40 20,40 10,10</gml:coordinates></gml:LinearRing>" +
"</gml:outerBoundaryIs></gml:Polygon>, \"0********\")", "true");
error("geo:relate(<gml:Point><gml:coordinates>18,11</gml:coordinates></gml:Point>,"
+ "<gml:LineString><gml:coordinates>11,10 20,1 20,20</gml:coordinates>" +
"</gml:LineString>, \"0******\")", GeoErrors.qname(6));
error("geo:relate(" +
"<gml:Point><gml:coordinates>18,11</gml:coordinates></gml:Point>," +
"<gml:LineString><gml:coordinates>11,10 20,1 20,20</gml:coordinates>" +
"</gml:LineString>, \"0*******12*F\")", GeoErrors.qname(6));
error("geo:relate()", JAVAARITY_X_X_X_X);
error("geo:relate(" +
"<gml:Line><gml:coordinates>1,1 55,99 2,1</gml:coordinates></gml:Line>," +
"<gml:LineString></gml:LineString>, \"0********\")", GeoErrors.qname(1));
error("geo:relate(" +
"<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>," +
" \"0********\")", JAVAARITY_X_X_X_X);
}
/** Test method. */
@Test
public void distance() {
run("geo:distance(<gml:LinearRing><gml:coordinates>10,400 20,200 30,100 " +
"20,100 10,400</gml:coordinates></gml:LinearRing>, " +
"<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>" +
"10,10 20,10 30,40 20,40 10,10</gml:coordinates></gml:LinearRing>" +
"</gml:outerBoundaryIs></gml:Polygon>)", "60");
error("geo:distance()", JAVAARITY_X_X_X_X);
error("geo:distance(" +
"<gml:LinearRing><gml:coordinates>1,1 55,99 2,1</gml:coordinates>" +
"</gml:LinearRing>, <gml:LineString></gml:LineString>)", GeoErrors.qname(2));
error("geo:distance(" +
"<gml:Point><gml:coordinates>1,1</gml:coordinates></gml:Point>)",
JAVAARITY_X_X_X_X);
}
/** Test method. */
@Test
public void buffer() {
run("geo:buffer(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>10,10 20,10 30,40 20,40 10,10</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>,xs:double(0))",
"<gml:Polygon xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>" +
"10.0,10.0 20.0,40.0 30.0,40.0 20.0,10.0 10.0,10.0</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>");
run("geo:buffer(<gml:LineString><gml:coordinates>1,1 5,9 2,1" +
"</gml:coordinates></gml:LineString>, xs:double(0))",
"<gml:Polygon xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:outerBoundaryIs><gml:LinearRing><gml:coordinates/>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>");
error("geo:buffer(" +
"<gml:LinearRing><gml:coordinates>1,1 55,99 2,1</gml:coordinates>" +
"</gml:LinearRing>, xs:double(1))", GeoErrors.qname(2));
error("geo:buffer(<gml:LinearRing><gml:coordinates>1,1 55,99 1,1" +
"</gml:coordinates></gml:LinearRing>, 's')", JAVAARGS_X_X_X);
error("geo:buffer(xs:double(1))", JAVAARITY_X_X_X_X);
}
/** Test method. */
@Test
public void convexHull() {
run("geo:convexHull(<gml:LinearRing><gml:coordinates>1,1 55,99 2,2 1,1" +
"</gml:coordinates></gml:LinearRing>)",
"<gml:Polygon xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>" +
"1.0,1.0 55.0,99.0 2.0,2.0 1.0,1.0</gml:coordinates></gml:LinearRing>" +
"</gml:outerBoundaryIs></gml:Polygon>");
error("geo:convexHull(<gml:LinearRing><gml:coordinates>1,1 55,99 1,1" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(2));
error("geo:convexHull()", JAVAARITY_X_X_X_X);
error("geo:convexHull(<gml:LinearRing/>)", GeoErrors.qname(2));
}
/** Test method. */
@Test
public void intersection() {
run("geo:intersection(<gml:LinearRing><gml:coordinates>1,1 55,99 2,3 1,1" +
"</gml:coordinates></gml:LinearRing>," +
"<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>" +
"10,10 20,10 30,40 10,10</gml:coordinates></gml:LinearRing>" +
"</gml:outerBoundaryIs></gml:Polygon>)",
"<gml:LineString xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates/></gml:LineString>");
run("geo:intersection(<gml:LinearRing><gml:coordinates>1,1 55,99 2,3 1,1" +
"</gml:coordinates></gml:LinearRing>," +
"<gml:Point><gml:coordinates>2,3</gml:coordinates></gml:Point>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>");
error("geo:intersection(<gml:LinearRing><gml:coordinates></gml:coordinates>" +
"</gml:LinearRing>)", JAVAARITY_X_X_X_X);
error("geo:intersection(<gml:Geo><gml:coordinates>2,3</gml:coordinates>" +
"</gml:Geo>,<gml:Point><gml:coordinates>2,3</gml:coordinates></gml:Point>)",
GeoErrors.qname(1));
error("geo:intersection(<gml:LinearRing/>, <gml:Point/>)", GeoErrors.qname(2));
}
/** Test method. */
@Test
public void union() {
run("geo:union(<gml:Point><gml:coordinates>2</gml:coordinates></gml:Point>," +
"<gml:Point><gml:coordinates>2,3</gml:coordinates></gml:Point>)",
"<gml:MultiPoint xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:pointMember><gml:Point><gml:coordinates>2.0,0.0" +
"</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember>" +
"<gml:Point><gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>" +
"</gml:pointMember></gml:MultiPoint>");
run("geo:union(<gml:Point><gml:coordinates>2</gml:coordinates></gml:Point>," +
"<gml:Point><gml:coordinates>3</gml:coordinates></gml:Point>)",
"<gml:MultiPoint xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:pointMember><gml:Point>" +
"<gml:coordinates>2.0,0.0</gml:coordinates></gml:Point></gml:pointMember>" +
"<gml:pointMember><gml:Point><gml:coordinates>3.0,0.0</gml:coordinates>" +
"</gml:Point></gml:pointMember></gml:MultiPoint>");
error("geo:union(<gml:Point><gml:coordinates></gml:coordinates></gml:Point>," +
"<gml:Point><gml:coordinates>2,3</gml:coordinates></gml:Point>)",
GeoErrors.qname(2));
error("geo:union(text {'a'}, <gml:Point><gml:coordinates>2,3" +
"</gml:coordinates></gml:Point>)", INVCAST_X_X_X);
}
/** Test method. */
@Test
public void difference() {
run("geo:difference(" +
"<gml:Point><gml:coordinates>20,1</gml:coordinates></gml:Point>," +
"<gml:LinearRing><gml:coordinates>0,0 20,20 20,30 0,20 0,0" +
"</gml:coordinates></gml:LinearRing>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>20.0,1.0</gml:coordinates></gml:Point>");
error("geo:difference(" +
"<gml:Point><gml:coordinates></gml:coordinates></gml:Point>," +
"<gml:Point><gml:coordinates>2,3</gml:coordinates></gml:Point>)",
GeoErrors.qname(2));
error("geo:difference(text {'a'}, <gml:Point><gml:coordinates>2,3" +
"</gml:coordinates></gml:Point>)", INVCAST_X_X_X);
}
/** Test method. */
@Test
public void symDifference() {
run("geo:symDifference(" +
"<gml:Point><gml:coordinates>20,1</gml:coordinates></gml:Point>," +
"<gml:LinearRing><gml:coordinates>0,0 20,20 20,30 0,20 0,0" +
"</gml:coordinates></gml:LinearRing>)",
"<gml:MultiGeometry xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:geometryMember><gml:Point><gml:coordinates>" +
"20.0,1.0</gml:coordinates></gml:Point></gml:geometryMember>" +
"<gml:geometryMember><gml:LineString><gml:coordinates>0.0,0.0 20.0,20.0" +
" 20.0,30.0 0.0,20.0 0.0,0.0</gml:coordinates></gml:LineString>" +
"</gml:geometryMember></gml:MultiGeometry>");
error("geo:symDifference(" +
"<gml:unknown><gml:coordinates>1,1</gml:coordinates></gml:unknown>," +
"<gml:Point><gml:coordinates>2,3</gml:coordinates></gml:Point>)",
GeoErrors.qname(1));
error("geo:symDifference(text {'a'}, <gml:Point><gml:coordinates>2,3" +
"</gml:coordinates></gml:Point>)", INVCAST_X_X_X);
}
/** Test method. */
@Test
public void geometryN() {
run("geo:geometryN(" +
"<gml:Point><gml:coordinates>2,1</gml:coordinates></gml:Point>, 1)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>2.0,1.0</gml:coordinates></gml:Point>");
error("geo:geometryN(" +
"<gml:unknown><gml:coordinates>1,1</gml:coordinates></gml:unknown>,1)",
GeoErrors.qname(1));
error("geo:geometryN(" +
"<gml:Point><gml:coordinates>2,1</gml:coordinates></gml:Point>, 0)",
GeoErrors.qname(4));
error("geo:geometryN(" +
"<gml:Point><gml:coordinates>2,1</gml:coordinates></gml:Point>, 2)",
GeoErrors.qname(4));
error("geo:geometryN(text {'a'}, <gml:Point><gml:coordinates>2,3" +
"</gml:coordinates></gml:Point>)", JAVAARGS_X_X_X
);
}
/** Test method. */
@Test
public void x() {
run("geo:x(<gml:Point><gml:coordinates>2,1</gml:coordinates></gml:Point>)", "2");
error("geo:x(<gml:MultiPoint><gml:Point><gml:coordinates>1,1" +
"</gml:coordinates></gml:Point><gml:Point><gml:coordinates>1,2" +
"</gml:coordinates></gml:Point></gml:MultiPoint>)", GeoErrors.qname(3));
error("geo:x(" +
"<gml:LinearRing><gml:coordinates>0,0 20,0 0,20 0,0</gml:coordinates>" +
"</gml:LinearRing>)", GeoErrors.qname(3));
error("geo:x(<gml:Point><gml:coordinates></gml:coordinates></gml:Point>)",
GeoErrors.qname(2));
error("geo:x(<gml:geo><gml:coordinates>2,1</gml:coordinates></gml:geo>)",
GeoErrors.qname(1));
error("geo:x(text {'a'})", INVCAST_X_X_X);
}
/** Test method. */
@Test
public void y() {
run("geo:y(<gml:Point><gml:coordinates>2,1</gml:coordinates></gml:Point>)",
"1");
run("geo:y(<gml:Point><gml:coordinates>2</gml:coordinates></gml:Point>)", "0");
error("geo:y(<gml:MultiPoint><gml:Point><gml:coordinates>1,1" +
"</gml:coordinates></gml:Point><gml:Point><gml:coordinates>1,2" +
"</gml:coordinates></gml:Point></gml:MultiPoint>)", GeoErrors.qname(3));
error("geo:y(" +
"<gml:LinearRing><gml:coordinates>0,0 20,0 0,20 0,0" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(3));
error("geo:y(<gml:Point><gml:coordinates></gml:coordinates></gml:Point>)",
GeoErrors.qname(2));
error("geo:y(<gml:geo><gml:coordinates>2,1</gml:coordinates></gml:geo>)",
GeoErrors.qname(1));
error("geo:y(a)", NOCTX_X);
}
/** Test method. */
@Test
public void z() {
run("geo:z(<gml:Point><gml:coordinates>2,1,3</gml:coordinates></gml:Point>)",
"3");
run("geo:z(<gml:Point><gml:coordinates>2</gml:coordinates></gml:Point>)",
"NaN");
error("geo:z(<gml:MultiPoint><gml:Point><gml:coordinates>1,1" +
"</gml:coordinates></gml:Point><gml:Point><gml:coordinates>1,2" +
"</gml:coordinates></gml:Point></gml:MultiPoint>)", GeoErrors.qname(3));
error("geo:z(" +
"<gml:LinearRing><gml:coordinates>0,0 20,0 0,20 0,0" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(3));
error("geo:z(<gml:Point><gml:coordinates></gml:coordinates></gml:Point>)",
GeoErrors.qname(2));
error("geo:z(<gml:geo><gml:coordinates>2,1</gml:coordinates></gml:geo>)",
GeoErrors.qname(1));
error("geo:z(a)", NOCTX_X);
}
/** Test method. */
@Test
public void length() {
run("geo:length(" +
"<gml:Point><gml:coordinates>2,1,3</gml:coordinates></gml:Point>)", "0");
run("geo:length(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>1,1 2,1 5,3 1,1</gml:coordinates></gml:LinearRing>" +
"</gml:outerBoundaryIs></gml:Polygon>)", "9.07768723046357");
run("geo:length(<gml:MultiPoint><gml:Point><gml:coordinates>1,1" +
"</gml:coordinates></gml:Point><gml:Point><gml:coordinates>1,2" +
"</gml:coordinates></gml:Point></gml:MultiPoint>)", "0");
error("geo:length(<gml:LinearRing><gml:coordinates>0,0 0,20 0,0" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(2));
error("geo:length(<gml:Point><gml:coordinates></gml:coordinates></gml:Point>)",
GeoErrors.qname(2));
error("geo:length(<gml:geo><gml:coordinates>2,1</gml:coordinates></gml:geo>)",
GeoErrors.qname(1));
}
/** Test method. */
@Test
public void startPoint() {
run("geo:startPoint(<gml:LinearRing><gml:coordinates>1,1 20,1 20,20 1,1" +
"</gml:coordinates></gml:LinearRing>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>1.0,1.0</gml:coordinates></gml:Point>");
run("geo:startPoint(<gml:LineString><gml:coordinates>1,1 20,1 20,20 1,1" +
"</gml:coordinates></gml:LineString>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>1.0,1.0</gml:coordinates></gml:Point>");
error("geo:startPoint(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>)", GeoErrors.qname(3));
error("geo:startPoint(" +
"<gml:LineString><gml:coordinates>1,1</gml:coordinates></gml:LineString>)",
GeoErrors.qname(2));
error("geo:startPoint()", JAVAARITY_X_X_X_X);
error("geo:startPoint(text {'gml:Point'})", INVCAST_X_X_X);
error("geo:startPoint(<gml:geo><gml:coordinates>2,1</gml:coordinates></gml:geo>)",
GeoErrors.qname(1));
}
/** Test method. */
@Test
public void endPoint() {
run("geo:endPoint(<gml:LinearRing><gml:coordinates>2,3 20,1 20,20 2,3" +
"</gml:coordinates></gml:LinearRing>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>");
run("geo:endPoint(<gml:LineString><gml:coordinates>11,10 20,1 20,20 12,13" +
"</gml:coordinates></gml:LineString>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>12.0,13.0</gml:coordinates></gml:Point>");
error("geo:endPoint(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>)", GeoErrors.qname(3));
error("geo:endPoint(" +
"<gml:LineString><gml:coordinates>1,1</gml:coordinates></gml:LineString>)",
GeoErrors.qname(2));
error("geo:endPoint()", JAVAARITY_X_X_X_X);
error("geo:endPoint(text {'gml:Point'})", INVCAST_X_X_X);
error("geo:endPoint(<gml:geo><gml:coordinates>2,1</gml:coordinates></gml:geo>)",
GeoErrors.qname(1));
}
/** Test method. */
@Test
public void isClosed() {
run("geo:isClosed(<gml:LinearRing><gml:coordinates>2,3 20,1 20,20 2,3" +
"</gml:coordinates></gml:LinearRing>)", "true");
run("geo:isClosed(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>)", "false");
run("geo:isClosed(<gml:LineString><gml:coordinates>11,10 20,1 20,20 12,13" +
"</gml:coordinates></gml:LineString>)", "false");
error("geo:isClosed(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>1,1 2,1 5,3 1,1</gml:coordinates></gml:LinearRing>" +
"</gml:outerBoundaryIs></gml:Polygon>)", GeoErrors.qname(3));
error("geo:isClosed(" +
"<gml:LineString><gml:coordinates>1,1</gml:coordinates></gml:LineString>)",
GeoErrors.qname(2));
error("geo:isClosed()", JAVAARITY_X_X_X_X);
error("geo:isClosed(text {'gml:Point'})", INVCAST_X_X_X);
error("geo:isClosed(" +
"<gml:Point><gml:coordinates>2,1</gml:coordinates></gml:Point>)",
GeoErrors.qname(3));
}
/** Test method. */
@Test
public void isRing() {
run("geo:isRing(<gml:LinearRing><gml:coordinates>2,3 20,1 20,20 2,3" +
"</gml:coordinates></gml:LinearRing>)", "true");
run("geo:isRing(<gml:LineString><gml:coordinates>11,10 20,1 20,20 12,13" +
"</gml:coordinates></gml:LineString>)", "false");
error("geo:isRing(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>)", GeoErrors.qname(3));
error("geo:isClosed(" +
"<gml:Point><gml:coordinates>2,3</gml:coordinates></gml:Point>)",
GeoErrors.qname(3));
error("geo:isRing(" +
"<gml:LineString><gml:coordinates>1,1</gml:coordinates></gml:LineString>)",
GeoErrors.qname(2));
error("geo:isRing()", JAVAARITY_X_X_X_X);
error("geo:isRing(text {'gml:Point'})", INVCAST_X_X_X);
error("geo:isRing(<Point><gml:coordinates>2,1</gml:coordinates></Point>)",
GeoErrors.qname(1));
}
/** Test method. */
@Test
public void numPoints() {
run("geo:numPoints(<gml:LinearRing><gml:coordinates>2,3 20,1 20,20 2,3" +
"</gml:coordinates></gml:LinearRing>)", "4");
run("geo:numPoints(<gml:LineString><gml:coordinates>11,10 20,1 20,20 12,13" +
"</gml:coordinates></gml:LineString>)", "4");
run("geo:numPoints(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>)", "6");
error("geo:numPoints(<gml:LineString><gml:coordinates>1,1</gml:coordinates>" +
"</gml:LineString>)", GeoErrors.qname(2));
error("geo:numPoints()", JAVAARITY_X_X_X_X);
error("geo:numPoints(text {'gml:Point'})", INVCAST_X_X_X);
error("geo:numPoints(<Point><gml:coordinates>2,1</gml:coordinates></Point>)",
GeoErrors.qname(1));
}
/** Test method. */
@Test
public void pointN() {
run("geo:pointN(<gml:LinearRing><gml:coordinates>2,3 20,1 20,20 2,3" +
"</gml:coordinates></gml:LinearRing>, 1)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>");
run("geo:pointN(<gml:LineString><gml:coordinates>11,10 20,1 20,20 12,13" +
"</gml:coordinates></gml:LineString>, 4)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>12.0,13.0</gml:coordinates></gml:Point>");
error("geo:pointN(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>, 4)", GeoErrors.qname(3));
error("geo:pointN(" +
"<gml:unknown><gml:coordinates>1,1</gml:coordinates></gml:unknown>,1)",
GeoErrors.qname(1));
error("geo:pointN(<gml:LineString><gml:coordinates>11,10 20,1 20,20 12,13" +
"</gml:coordinates></gml:LineString>, 5)", GeoErrors.qname(4));
error("geo:pointN(<gml:LineString><gml:coordinates>11,10 20,1 20,20 12,13" +
"</gml:coordinates></gml:LineString>, 0)", GeoErrors.qname(4));
error("geo:pointN(text {'a'},3)", INVCAST_X_X_X);
}
/** Test method. */
@Test
public void area() {
run("geo:area(<gml:MultiPoint><gml:Point><gml:coordinates>1,1" +
"</gml:coordinates></gml:Point><gml:Point><gml:coordinates>1,2" +
"</gml:coordinates></gml:Point></gml:MultiPoint>)", "0");
run("geo:area(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>11,11 18,11 18,18 11,18 11,11</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>)", "49");
run("geo:area(<gml:LineString><gml:coordinates>" +
"11,10 20,1 20,20</gml:coordinates></gml:LineString>)", "0");
error("geo:area(<gml:LinearRing><gml:coordinates>0,0 0,20 0,0" +
"</gml:coordinates></gml:LinearRing>)", GeoErrors.qname(2));
error("geo:area()", JAVAARITY_X_X_X_X);
error("geo:area(<gml:geo><gml:coordinates>2,1</gml:coordinates></gml:geo>)",
GeoErrors.qname(1));
}
/** Test method. */
@Test
public void centroid() {
run("geo:centroid(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>11,11 18,11 18,18 11,18 11,11</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>14.5,14.5</gml:coordinates></gml:Point>");
run("geo:centroid(" +
"<gml:Point><gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>");
run("geo:centroid(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>1.8468564716806986,1.540569415042095" +
"</gml:coordinates></gml:Point>");
error("geo:centroid(" +
"<gml:unknown><gml:coordinates>1,1</gml:coordinates></gml:unknown>)",
GeoErrors.qname(1));
error("geo:centroid()", JAVAARITY_X_X_X_X);
error("geo:centroid(text {'a'})", INVCAST_X_X_X);
}
/** Test method. */
@Test
public void pointOnSurface() {
run("geo:pointOnSurface(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>11,11 18,11 18,18 11,18 11,11</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>14.5,14.5</gml:coordinates></gml:Point>");
run("geo:pointOnSurface(" +
"<gml:Point><gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>");
run("geo:pointOnSurface(<gml:MultiLineString><gml:LineString><gml:coordinates>" +
"1,1 0,0 2,1</gml:coordinates></gml:LineString><gml:LineString>" +
"<gml:coordinates>2,1 3,3 4,4</gml:coordinates></gml:LineString>" +
"</gml:MultiLineString>)",
"<gml:Point xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>3.0,3.0</gml:coordinates></gml:Point>");
error("geo:pointOnSurface(" +
"<gml:unknown><gml:coordinates>1,1</gml:coordinates></gml:unknown>)",
GeoErrors.qname(1));
error("geo:pointOnSurface()", JAVAARITY_X_X_X_X);
error("geo:pointOnSurface(text {'a'})", INVCAST_X_X_X);
}
/** Test method. */
@Test
public void exteriorRing() {
run("geo:exteriorRing(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>11,11 18,11 18,18 11,18 11,11</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>)",
"<gml:LineString xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>11.0,11.0 18.0,11.0 18.0,18.0 11.0,18.0 11.0,11.0" +
"</gml:coordinates></gml:LineString>");
error("geo:exteriorRing(" +
"<gml:Point><gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>)",
GeoErrors.qname(3));
error("geo:exteriorRing(" +
"<gml:unknown><gml:coordinates>1,1</gml:coordinates></gml:unknown>)",
GeoErrors.qname(1));
error("geo:exteriorRing()", JAVAARITY_X_X_X_X);
error("geo:exteriorRing(text {'a'})", INVCAST_X_X_X);
}
/** Test method. */
@Test
public void numInteriorRing() {
run("geo:numInteriorRing(" +
"<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>11,11 18,11 18,18 11,18 11,11</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>)", "0");
error("geo:numInteriorRing(" +
"<gml:Point><gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>)",
GeoErrors.qname(3));
error("geo:numInteriorRing(" +
"<gml:unknown><gml:coordinates>1,1</gml:coordinates></gml:unknown>)",
GeoErrors.qname(1));
error("geo:numInteriorRing()", JAVAARITY_X_X_X_X);
error("geo:numInteriorRing(text {'a'})", INVCAST_X_X_X);
}
/** Test method. */
@Test
public void interiorRingN() {
run("geo:interiorRingN(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>11,11 18,11 18,18 11,18 11,11</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs>" +
"<gml:LinearRing><gml:coordinates>2,2 3,2 3,3 2,3 2,2" +
"</gml:coordinates></gml:LinearRing></gml:innerBoundaryIs>" +
"<gml:innerBoundaryIs><gml:LinearRing><gml:coordinates>" +
"10,10 20,10 20,20 10,20 10,10</gml:coordinates></gml:LinearRing>" +
"</gml:innerBoundaryIs></gml:Polygon>, 1)",
"<gml:LineString xmlns:gml=\"http://www.opengis.net/gml\">" +
"<gml:coordinates>2.0,2.0 3.0,2.0 3.0,3.0 2.0,3.0 2.0,2.0" +
"</gml:coordinates></gml:LineString>");
error("geo:interiorRingN(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>11,11 18,11 18,18 11,18 11,11</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>, 1)",
GeoErrors.qname(4));
error("geo:interiorRingN(<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing>" +
"<gml:coordinates>11,11 18,11 18,18 11,18 11,11</gml:coordinates>" +
"</gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>, 0)",
GeoErrors.qname(4));
error("geo:interiorRingN(" +
"<gml:Point><gml:coordinates>2.0,3.0</gml:coordinates></gml:Point>, 1)",
GeoErrors.qname(3));
error("geo:interiorRingN(text {'<gml:Polygon/'}, 1)", INVCAST_X_X_X);
error("geo:interiorRingN()", JAVAARITY_X_X_X_X);
}
/**
* Query.
* @param query query
* @param result result
*/
private static void run(final String query, final String result) {
final String qu = "import module namespace geo='http://expath.org/ns/geo'; " +
"declare namespace gml='http://www.opengis.net/gml';" + query;
assertEquals(result, query(qu).replaceAll(Prop.NL + "\\s*", ""));
}
/**
* Checks if a query yields the specified error code.
* @param query query string
* @param qe expected error
*/
private static void error(final String query, final QueryError qe) {
error(query, qe.qname(), qe);
}
/**
* Checks if a query yields the specified error code.
* @param query query string
* @param name name of error
*/
private static void error(final String query, final QNm name) {
error(query, name, null);
}
/**
* Checks if a query yields the specified error code.
* @param query query string
* @param error expected error
* @param qe query error
*/
private static void error(final String query, final QNm error, final QueryError qe) {
final String q = "import module namespace geo='http://expath.org/ns/geo'; " +
"declare namespace gml='http://www.opengis.net/gml';" + query;
try(QueryProcessor qp = new QueryProcessor(q, context)) {
final String res = qp.value().serialize().toString().replaceAll("(\\r|\\n) *", "");
fail("Query did not fail:\n" + query + "\n[E] " + error + "...\n[F] " + res);
} catch(final QueryException ex) {
final QueryError qerr = ex.error();
if(qe != null && qerr != null && qe != qerr) {
Util.stack(ex);
final StringBuilder sb = new StringBuilder("Wrong error code:\n[E] ");
fail(sb.append(qe.name()).append("\n[F] ").append(qerr.name()).toString());
} else if(!ex.qname().eq(error)) {
Util.stack(ex);
final StringBuilder sb = new StringBuilder("Wrong error code:\n[E] ");
fail(sb.append(error).append("\n[F] ").append(ex.qname()).toString());
}
} catch(final Exception ex) {
Util.stack(ex);
fail(ex.toString());
}
}
}