diff --git a/js/id/actions/reverse.js b/js/id/actions/reverse.js index 7a1f74be7..461b5d9ac 100644 --- a/js/id/actions/reverse.js +++ b/js/id/actions/reverse.js @@ -29,7 +29,7 @@ http://wiki.openstreetmap.org/wiki/Route#Members http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java */ -iD.actions.Reverse = function(wayId) { +iD.actions.Reverse = function(wayId, options) { var replacements = [ [/:right$/, ':left'], [/:left$/, ':right'], [/:forward$/, ':backward'], [/:backward$/, ':forward'] @@ -59,6 +59,8 @@ iD.actions.Reverse = function(wayId) { return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; }); } else if (key === 'incline' || key === 'direction') { return {up: 'down', down: 'up'}[value] || value; + } else if (options && options.reverseOneway && key === 'oneway') { + return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value; } else { return {left: 'right', right: 'left'}[value] || value; } diff --git a/js/id/geo/multipolygon.js b/js/id/geo/multipolygon.js index a214d52ea..1248c2a96 100644 --- a/js/id/geo/multipolygon.js +++ b/js/id/geo/multipolygon.js @@ -81,7 +81,7 @@ iD.geo.joinWays = function(array, graph) { } function reverse(member) { - return member.tags ? iD.actions.Reverse(member.id)(graph).entity(member.id) : member; + return member.tags ? iD.actions.Reverse(member.id, {reverseOneway: true})(graph).entity(member.id) : member; } while (array.length) { diff --git a/test/spec/actions/reverse.js b/test/spec/actions/reverse.js index 9ddc29c7a..bd393e789 100644 --- a/test/spec/actions/reverse.js +++ b/test/spec/actions/reverse.js @@ -23,6 +23,24 @@ describe("iD.actions.Reverse", function () { expect(graph.entity(way.id).tags).to.eql({'oneway': 'yes'}); }); + it("reverses oneway tags if reverseOneway: true is provided", function () { + var graph = iD.Graph([ + iD.Way({id: 'yes', tags: {oneway: 'yes'}}), + iD.Way({id: 'no', tags: {oneway: 'no'}}), + iD.Way({id: '1', tags: {oneway: '1'}}), + iD.Way({id: '-1', tags: {oneway: '-1'}}) + ]); + + expect(iD.actions.Reverse('yes', {reverseOneway: true})(graph) + .entity('yes').tags).to.eql({oneway: '-1'}); + expect(iD.actions.Reverse('no', {reverseOneway: true})(graph) + .entity('no').tags).to.eql({oneway: 'no'}); + expect(iD.actions.Reverse('1', {reverseOneway: true})(graph) + .entity('1').tags).to.eql({oneway: '-1'}); + expect(iD.actions.Reverse('-1', {reverseOneway: true})(graph) + .entity('-1').tags).to.eql({oneway: 'yes'}); + }); + it("transforms *:right=* ⟺ *:left=*", function () { var way = iD.Way({tags: {'cycleway:right': 'lane'}}), graph = iD.Graph([way]); diff --git a/test/spec/geo/multipolygon.js b/test/spec/geo/multipolygon.js index c4a512fc5..49680268d 100644 --- a/test/spec/geo/multipolygon.js +++ b/test/spec/geo/multipolygon.js @@ -86,11 +86,11 @@ describe("iD.geo.joinWays", function() { iD.Node({id: 'b'}), iD.Node({id: 'c'}), iD.Way({id: '-', nodes: ['a', 'b']}), - iD.Way({id: '=', nodes: ['c', 'b'], tags: {'lanes:forward': 2}}) + iD.Way({id: '=', nodes: ['c', 'b'], tags: {'oneway': 'yes', 'lanes:forward': 2}}) ]); var result = iD.geo.joinWays([graph.entity('-'), graph.entity('=')], graph); - expect(result[0][1].tags).to.eql({'lanes:backward': 2}); + expect(result[0][1].tags).to.eql({'oneway': '-1', 'lanes:backward': 2}); }); it("ignores non-way members", function() {