Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
r17393 r17400 114 114 boolean ignoreWaySegmentCombination(Way w1, Way w2) { 115 115 if (w1 == w2) 116 return false;117 if (areLayerOrLevelDifferent(w1, w2)) {118 116 return true; 119 } 117 if (areLayerOrLevelDifferent(w1, w2)) 118 return true; 120 119 if (isBuilding(w1) && isBuilding(w2)) 121 return true; 122 if (w1.hasKey(HIGHWAY) && w2.hasKey(HIGHWAY) && !Objects.equals(w1.get("level"), w2.get("level"))) { 123 return true; 124 } 120 return true; // handled by mapcss tests 125 121 if (((isResidentialArea(w1) || w1.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY)) && isResidentialArea(w2)) 126 122 || ((isResidentialArea(w2) || w2.hasKey(BARRIER, HIGHWAY, RAILWAY, WATERWAY)) && isResidentialArea(w1))) 127 123 return true; 128 if (isSubwayOrTramOrRazed(w2)) { 129 return true; 130 } 124 if (isWaterArea(w1) && isWaterArea(w2)) 125 return true; // handled by mapcss tests 131 126 if (w1.hasKey(RAILWAY) && w2.hasKey(RAILWAY) && w1.hasTag(RAILWAY, "yard") != w2.hasTag(RAILWAY, "yard")) { 132 127 return true; // see #20089 133 128 } 134 if (isCoastline(w1) != isCoastline(w2)) { 135 return true; 136 } 137 if ((w1.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w2.hasTag(WATERWAY, "riverbank")) 138 || (w2.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w1.hasTag(WATERWAY, "riverbank"))) { 139 return true; 140 } 141 return isProposedOrAbandoned(w2); 129 return (w1.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w2.hasTag(WATERWAY, "riverbank")) 130 || (w2.hasTag(WATERWAY, "river", "stream", "canal", "drain", "ditch") && w1.hasTag(WATERWAY, "riverbank")); 142 131 } 143 132 … … 274 263 275 264 /** 276 * Self crossing ways test (for all the rest)265 * Self crossing ways test (for all ways) 277 266 */ 278 267 public static class SelfCrossing extends CrossingWays { 279 268 280 269 protected static final int CROSSING_SELF = 604; 281 282 CrossingWays.Ways normalTest = new Ways();283 CrossingWays.Boundaries boundariesTest = new Boundaries();284 270 285 271 /** … … 291 277 292 278 @Override 293 public boolean isPrimitiveUsable(OsmPrimitive p) {294 return super.isPrimitiveUsable(p) && !(normalTest.isPrimitiveUsable(p)295 || boundariesTest.isPrimitiveUsable(p));296 }297 298 @Override299 279 boolean ignoreWaySegmentCombination(Way w1, Way w2) { 300 return w1 != w2; // should not happen280 return false; // we should not get here 301 281 } 302 282 } … … 332 312 } 333 313 314 static boolean isWaterArea(OsmPrimitive w) { 315 return w.hasTag("natural", "water") || w.hasTag(LANDUSE, "reservoir"); 316 } 317 334 318 static boolean isHighway(OsmPrimitive w) { 335 319 return w.hasTagDifferent(HIGHWAY, "rest_area", "services", "bus_stop", "platform"); … … 358 342 @Override 359 343 public void visit(Way w) { 360 if (this instanceof SelfCrossing) { 344 boolean findSelfCrossingOnly = this instanceof SelfCrossing; 345 if (findSelfCrossingOnly) { 361 346 // free memory, we are not interested in previous ways 362 347 cellSegments.clear(); … … 378 363 List<WaySegment> highlight; 379 364 380 if (!es1.intersects(es2) || ignoreWaySegmentCombination(es1.way, es2.way)) { 365 if (!es1.intersects(es2) 366 || (!findSelfCrossingOnly && ignoreWaySegmentCombination(es1.way, es2.way))) { 381 367 continue; 382 368 } … … 475 461 * @return {@code true} if one or more segments of the way are crossing 476 462 * @see SelfIntersectingWay 477 * @since xxx463 * @since 17393 478 464 */ 479 465 public static boolean isSelfCrossing(Way way) { -
trunk/test/unit/org/openstreetmap/josm/data/validation/tests/CrossingWaysTest.java
r17275 r17400 6 6 import static org.junit.jupiter.api.Assertions.assertTrue; 7 7 8 import java.nio.file.Files; 9 import java.nio.file.Paths; 8 10 import java.util.HashMap; 9 11 import java.util.List; 10 12 13 import org.junit.jupiter.api.Test; 11 14 import org.junit.jupiter.api.extension.RegisterExtension; 12 import org.junit.jupiter.api.Test;13 15 import org.openstreetmap.josm.TestUtils; 14 16 import org.openstreetmap.josm.data.coor.EastNorth; 15 17 import org.openstreetmap.josm.data.coor.LatLon; 18 import org.openstreetmap.josm.data.osm.DataSet; 16 19 import org.openstreetmap.josm.data.osm.Node; 17 20 import org.openstreetmap.josm.data.osm.Way; 18 21 import org.openstreetmap.josm.data.osm.WaySegment; 22 import org.openstreetmap.josm.data.validation.TestError; 19 23 import org.openstreetmap.josm.data.validation.tests.CrossingWays.Boundaries; 20 24 import org.openstreetmap.josm.data.validation.tests.CrossingWays.SelfCrossing; 21 25 import org.openstreetmap.josm.data.validation.tests.CrossingWays.Ways; 26 import org.openstreetmap.josm.io.OsmReader; 22 27 import org.openstreetmap.josm.testutils.JOSMTestRules; 23 28 … … 34 39 @RegisterExtension 35 40 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") 36 public JOSMTestRules rule = new JOSMTestRules().preferences() ;41 public JOSMTestRules rule = new JOSMTestRules().preferences().projection(); 37 42 38 43 private static Way newUsableWay(String tags) { … … 127 132 testMessage(601, test, "amenity=restaurant", "amenity=restaurant"); 128 133 testMessage(611, test, "building=yes", "amenity=restaurant"); 134 testMessage(611, test, "building=yes", "natural=water"); 129 135 testMessage(612, test, "building=yes", "highway=road"); 130 136 testMessage(613, test, "building=yes", "railway=rail"); … … 133 139 testMessage(620, test, "highway=road", "highway=road"); 134 140 testMessage(621, test, "highway=road", "amenity=restaurant"); 141 testMessage(621, test, "highway=road", "natural=water"); 135 142 testMessage(622, test, "highway=road", "railway=rail"); 136 143 testMessage(623, test, "highway=road", "waterway=river"); 137 144 testMessage(630, test, "railway=rail", "railway=rail"); 138 145 testMessage(631, test, "railway=rail", "amenity=restaurant"); 146 testMessage(631, test, "railway=rail", "natural=water"); 139 147 testMessage(632, test, "railway=rail", "waterway=river"); 140 148 testMessage(641, test, "landuse=residential", "amenity=restaurant"); … … 146 154 testMessage(663, test, "barrier=hedge", "railway=rail"); 147 155 testMessage(664, test, "barrier=hedge", "waterway=river"); 156 testMessage(665, test, "barrier=hedge", "natural=water"); 148 157 149 158 assertFalse(test.isPrimitiveUsable(newUsableWay("amenity=restaurant"))); … … 174 183 SelfCrossing test = new CrossingWays.SelfCrossing(); 175 184 // isPrimitiveUsable 176 assertFalse(test.isPrimitiveUsable(newUsableWay("highway=motorway")));177 assertFalse(test.isPrimitiveUsable(newUsableWay("barrier=yes")));178 assertFalse(test.isPrimitiveUsable(newUsableWay("boundary=administrative")));179 185 assertFalse(test.isPrimitiveUsable(TestUtils.newWay("amenity=restaurant"))); // Unusable (0 node) 180 assertTrue(test.isPrimitiveUsable(newUsableWay("amenity=restaurant"))); // Usable (2 nodes) 181 } 186 } 187 188 /** 189 * Various cases of crossing linear ways and areas, mainly for coverage 190 * @throws Exception if an error occurs 191 */ 192 @Test 193 void testCoverage() throws Exception { 194 DataSet ds = OsmReader.parseDataSet( 195 Files.newInputStream(Paths.get(TestUtils.getTestDataRoot(), "crossingWays.osm")), null); 196 CrossingWays crossingWays = new CrossingWays.Ways(); 197 crossingWays.startTest(null); 198 crossingWays.visit(ds.allPrimitives()); 199 crossingWays.endTest(); 200 201 for (TestError e : crossingWays.getErrors()) { 202 // we don't report self crossing ways in this test 203 assertEquals(2, e.getPrimitives().size(), e.getPrimitives().toString()); 204 // see #20121: crossing water areas should not be reported 205 assertFalse(e.getPrimitives().stream().filter(Way.class::isInstance).allMatch(CrossingWays::isWaterArea)); 206 } 207 208 CrossingWays selfCrossing = new CrossingWays.SelfCrossing(); 209 selfCrossing.startTest(null); 210 selfCrossing.visit(ds.allPrimitives()); 211 selfCrossing.endTest(); 212 assertEquals(1, selfCrossing.getErrors().size()); 213 214 CrossingWays crossingBoundaries = new CrossingWays.Boundaries(); 215 crossingBoundaries.startTest(null); 216 crossingBoundaries.visit(ds.allPrimitives()); 217 crossingBoundaries.endTest(); 218 assertEquals(2, crossingBoundaries.getErrors().size()); 219 } 220 182 221 }
Note:
See TracChangeset
for help on using the changeset viewer.