diff --git a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGBoundaryNodeRuleTest.java b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGBoundaryNodeRuleTest.java index e076d4bc93..3c6bfc60ba 100644 --- a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGBoundaryNodeRuleTest.java +++ b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGBoundaryNodeRuleTest.java @@ -118,6 +118,18 @@ public void testPolygonEmptyMultiLineStringClosed() runRelate(a, b, BoundaryNodeRule.ENDPOINT_BOUNDARY_RULE, "FFFFFF102" ); } + public void testLineStringInteriorTouchMultivalent() + { + String a = "POLYGON EMPTY"; + String b = "MULTILINESTRING ((0 0, 0 1), (0 1, 1 1, 1 0, 0 0))"; + + // closed line has no boundary under SFS rule + runRelate(a, b, BoundaryNodeRule.OGC_SFS_BOUNDARY_RULE, "FFFFFF1F2" ); + + // closed line has boundary under ENDPOINT rule + runRelate(a, b, BoundaryNodeRule.ENDPOINT_BOUNDARY_RULE, "FFFFFF102" ); + } + void runRelate(String wkt1, String wkt2, BoundaryNodeRule bnRule, String expectedIM) { Geometry g1 = read(wkt1); diff --git a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java index 1d50364658..21f1aac5fe 100644 --- a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java +++ b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTest.java @@ -597,6 +597,37 @@ public void testRepeatedPointAA() { checkRelate(a, b, "212F01FF2"); } - + //================ Repeated Points ============== + + public void testEmptyEquals() { + String empties[] = { + "POINT EMPTY", + "LINESTRING EMPTY", + "POLYGON EMPTY", + "MULTIPOINT EMPTY", + "MULTILINESTRING EMPTY", + "MULTIPOLYGON EMPTY", + "GEOMETRYCOLLECTION EMPTY" + }; + int nempty = 7; + for (int i = 0; i < nempty; i++) { + for (int j = 0; j < nempty; j++) { + String a = empties[i]; + String b = empties[j]; + checkRelate(a, b, "FFFFFFFF2"); + //-- currently in JTS empty geometries do NOT test equal + checkEquals(a, b, false); + } + } + } + + //================ Prepared Relate ============== + + public void testPreparedAA() { + String a = "POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))"; + String b = "POLYGON((0.5 0.5, 1.5 0.5, 1.5 1.5, 0.5 1.5, 0.5 0.5))"; + checkPrepared(a, b); + } + } diff --git a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTestCase.java b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTestCase.java index 54088ecd49..01a479ebe8 100644 --- a/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTestCase.java +++ b/modules/core/src/test/java/org/locationtech/jts/operation/relateng/RelateNGTestCase.java @@ -83,6 +83,36 @@ protected void checkPredicate(TopologyPredicate pred, String wkta, String wktb, assertEquals(expectedValue, actualVal); } + void checkPrepared(String wkta, String wktb) + { + Geometry a = read(wkta); + Geometry b = read(wktb); + RelateNG prep_a = RelateNG.prepare(a); + + assertEquals("equalsTopo", prep_a.evaluate(b, RelatePredicate.equalsTopo()), + RelateNG.relate(a, b, RelatePredicate.equalsTopo())); + + assertEquals("intersects", prep_a.evaluate(b, RelatePredicate.intersects()), + RelateNG.relate(a, b, RelatePredicate.intersects())); + assertEquals("disjoint", prep_a.evaluate(b, RelatePredicate.disjoint()), + RelateNG.relate(a, b, RelatePredicate.disjoint())); + assertEquals("covers", prep_a.evaluate(b, RelatePredicate.covers()), + RelateNG.relate(a, b, RelatePredicate.covers())); + assertEquals("coveredBy", prep_a.evaluate(b, RelatePredicate.coveredBy()), + RelateNG.relate(a, b, RelatePredicate.coveredBy())); + assertEquals("within", prep_a.evaluate(b, RelatePredicate.within()), + RelateNG.relate(a, b, RelatePredicate.within())); + assertEquals("contains", prep_a.evaluate(b, RelatePredicate.contains()), + RelateNG.relate(a, b, RelatePredicate.contains())); + assertEquals("crosses", prep_a.evaluate(b, RelatePredicate.crosses()), + RelateNG.relate(a, b, RelatePredicate.crosses())); + assertEquals("touches", prep_a.evaluate(b, RelatePredicate.touches()), + RelateNG.relate(a, b, RelatePredicate.touches())); + + assertEquals("relate", prep_a.evaluate(b).toString(), + RelateNG.relate(a, b).toString()); + } + TopologyPredicate trace(TopologyPredicate pred) { if (! isTrace) return pred;