diff --git a/modules/actions/reverse.js b/modules/actions/reverse.js index ef1c63c29..051f3e64b 100644 --- a/modules/actions/reverse.js +++ b/modules/actions/reverse.js @@ -29,8 +29,8 @@ import _transform from 'lodash-es/transform'; in order to ensure associated nodes (eg a Stop Sign) is also reversed Node Keys: - direction=forward ⟺ direction=backward - direction=left ⟺ direction=right + *direction=forward ⟺ *direction=backward + *direction=left ⟺ *direction=right *:forward=* ⟺ *:backward=* *:left=* ⟺ *:right=* @@ -87,7 +87,7 @@ export function actionReverse(wayId, options) { // Update the direction based tags as appropriate then return an updated node return node.update({tags: _transform(node.tags, function(acc, tagValue, tagKey) { // See if this is a direction tag and reverse (or use existing value if not recognised) - if (tagKey === 'direction') { + if (tagKey.match(/direction$/) !== null) { acc[tagKey] = {forward: 'backward', backward: 'forward', left: 'right', right: 'left'}[tagValue] || tagValue; } else { // Use the reverseKey method to cater for situations such as traffic_sign:forward=stop diff --git a/test/spec/actions/reverse.js b/test/spec/actions/reverse.js index 8e6d4a204..7e99b9a44 100644 --- a/test/spec/actions/reverse.js +++ b/test/spec/actions/reverse.js @@ -310,4 +310,66 @@ describe('iD.actionReverse', function () { expect(target.tags['traffic_sign:left']).to.eql('stop'); }); + // For issue #4595 + it('reverses the direction of a forward facing traffic_signals on the way', function () { + var node1 = iD.Node(); + var node2 = iD.Node({tags: { 'traffic_signals:direction': 'forward', 'highway': 'traffic_signals' }}); + var node3 = iD.Node(); + var way = iD.Way({nodes: [node1.id, node2.id, node3.id]}); + var graph = iD.actionReverse(way.id)(iD.Graph([node1, node2, node3, way])); + var target = graph.entity(node2.id); + expect(target.tags['traffic_signals:direction']).to.eql('backward'); + }); + + it('reverses the direction of a backward facing traffic_signals on the way', function () { + var node1 = iD.Node(); + var node2 = iD.Node({tags: { 'traffic_signals:direction': 'backward', 'highway': 'traffic_signals' }}); + var node3 = iD.Node(); + var way = iD.Way({nodes: [node1.id, node2.id, node3.id]}); + var graph = iD.actionReverse(way.id)(iD.Graph([node1, node2, node3, way])); + var target = graph.entity(node2.id); + expect(target.tags['traffic_signals:direction']).to.eql('forward'); + }); + + it('reverses the direction of a left facing traffic_signals on the way', function () { + var node1 = iD.Node(); + var node2 = iD.Node({tags: { 'traffic_signals:direction': 'left', 'highway': 'traffic_signals' }}); + var node3 = iD.Node(); + var way = iD.Way({nodes: [node1.id, node2.id, node3.id]}); + var graph = iD.actionReverse(way.id)(iD.Graph([node1, node2, node3, way])); + var target = graph.entity(node2.id); + expect(target.tags['traffic_signals:direction']).to.eql('right'); + }); + + it('reverses the direction of a right facing traffic_signals on the way', function () { + var node1 = iD.Node(); + var node2 = iD.Node({tags: { 'traffic_signals:direction': 'right', 'highway': 'traffic_signals' }}); + var node3 = iD.Node(); + var way = iD.Way({nodes: [node1.id, node2.id, node3.id]}); + var graph = iD.actionReverse(way.id)(iD.Graph([node1, node2, node3, way])); + var target = graph.entity(node2.id); + expect(target.tags['traffic_signals:direction']).to.eql('left'); + }); + + it('does not assign a direction to a directionless traffic_signals on the way during a reverse', function () { + var node1 = iD.Node(); + var node2 = iD.Node({tags: { 'highway': 'traffic_signals' }}); + var node3 = iD.Node(); + var way = iD.Way({nodes: [node1.id, node2.id, node3.id]}); + var graph = iD.actionReverse(way.id)(iD.Graph([node1, node2, node3, way])); + var target = graph.entity(node2.id); + expect(target.tags['traffic_signals:direction']).to.be.undefined; + }); + + it('ignores directions other than forward or backward on attached traffic_signals during a reverse', function () { + var node1 = iD.Node(); + var node2 = iD.Node({tags: { 'traffic_signals:direction': 'empty', 'highway': 'traffic_signals' }}); + var node3 = iD.Node(); + var way = iD.Way({nodes: [node1.id, node2.id, node3.id]}); + var graph = iD.actionReverse(way.id)(iD.Graph([node1, node2, node3, way])); + var target = graph.entity(node2.id); + expect(target.tags['traffic_signals:direction']).to.eql('empty'); + }); + + });