Ticket #20013: 20013.2.patch
File 20013.2.patch, 4.5 KB (added by , 4 years ago) |
---|
-
src/org/openstreetmap/josm/actions/corrector/ReverseWayTagCorrector.java
13 13 import java.util.function.Function; 14 14 import java.util.regex.Matcher; 15 15 import java.util.regex.Pattern; 16 import java.util.stream.Collectors; 16 17 17 18 import org.openstreetmap.josm.command.Command; 18 19 import org.openstreetmap.josm.data.correction.RoleCorrection; … … 24 25 import org.openstreetmap.josm.data.osm.Relation; 25 26 import org.openstreetmap.josm.data.osm.RelationMember; 26 27 import org.openstreetmap.josm.data.osm.Tag; 27 import org.openstreetmap.josm.data.osm.TagCollection;28 28 import org.openstreetmap.josm.data.osm.Tagged; 29 29 import org.openstreetmap.josm.data.osm.Way; 30 30 import org.openstreetmap.josm.tools.Logging; … … 173 173 /** 174 174 * Tests whether way can be reversed without semantic change, i.e., whether tags have to be changed. 175 175 * Looks for keys like oneway, oneway:bicycle, cycleway:right:oneway, left/right. 176 * Also tests the nodes, e.g. a highway=stop with direction, see #20013. 176 177 * @param way way to test 177 178 * @return false if tags should be changed to keep semantic, true otherwise. 178 179 */ 179 180 public static boolean isReversible(Way way) { 180 for (Tag tag : TagCollection.from(way)) { 181 if (!tag.equals(TagSwitcher.apply(tag))) { 182 return false; 183 } 184 } 185 return true; 181 return getTagCorrectionsMap(way).isEmpty(); 186 182 } 187 183 188 184 /** … … 192 188 * @see #isReversible(Way) 193 189 */ 194 190 public static List<Way> irreversibleWays(List<Way> ways) { 195 List<Way> newWays = new ArrayList<>(ways); 196 for (Way way : ways) { 197 if (isReversible(way)) { 198 newWays.remove(way); 199 } 200 } 201 return newWays; 191 return ways.stream().filter(w -> !isReversible(w)).collect(Collectors.toList()); 202 192 } 203 193 204 194 /** -
test/unit/org/openstreetmap/josm/actions/corrector/ReverseWayTagCorrectorTest.java
7 7 import java.util.stream.Stream; 8 8 9 9 import org.junit.Assert; 10 import org.junit.jupiter.api.Test; 10 11 import org.junit.jupiter.api.extension.RegisterExtension; 11 import org.junit.jupiter.api.Test;12 12 import org.openstreetmap.josm.data.correction.TagCorrection; 13 13 import org.openstreetmap.josm.data.osm.Node; 14 14 import org.openstreetmap.josm.data.osm.OsmPrimitive; … … 107 107 Assert.assertEquals(newTag, ReverseWayTagCorrector.TagSwitcher.apply(oldTag)); 108 108 } 109 109 110 private Map<OsmPrimitive, List<TagCorrection>> getTagCorrectionsForWay(String middleNodeTags) {110 private Way buildWayWithMiddleNode(String middleNodeTags) { 111 111 final OsmPrimitive n1 = OsmUtils.createPrimitive("node"); 112 112 final OsmPrimitive n2 = OsmUtils.createPrimitive("node " + middleNodeTags); 113 113 final OsmPrimitive n3 = OsmUtils.createPrimitive("node"); 114 114 final Way w = new Way(); 115 115 Stream.of(n1, n2, n3).map(Node.class::cast).forEach(w::addNode); 116 return w; 117 } 118 119 private Map<OsmPrimitive, List<TagCorrection>> getTagCorrectionsForWay(String middleNodeTags) { 120 Way w = buildWayWithMiddleNode(middleNodeTags); 116 121 return ReverseWayTagCorrector.getTagCorrectionsMap(w); 117 122 } 118 123 … … 135 140 Assert.assertEquals(0, getTagCorrectionsForWay("direction=SSW").size()); 136 141 Assert.assertEquals(0, getTagCorrectionsForWay("direction=145").size()); 137 142 } 143 144 /** 145 * Tests that IsReversible() also works for nodes. See #20013 146 */ 147 @Test 148 void testIsReversible() { 149 Way w0 = buildWayWithMiddleNode("highway=stop"); 150 Assert.assertTrue(ReverseWayTagCorrector.isReversible(w0)); 151 Way w1 = buildWayWithMiddleNode("direction=forward"); 152 Assert.assertFalse(ReverseWayTagCorrector.isReversible(w1)); 153 Assert.assertEquals(3, w1.getNodesCount()); 154 w1.getNodes().forEach(n -> n.setKeys(null)); 155 Assert.assertTrue(ReverseWayTagCorrector.isReversible(w1)); 156 w1.put("oneway", "yes"); 157 Assert.assertFalse(ReverseWayTagCorrector.isReversible(w1)); 158 } 159 138 160 }