When reversing a way, reverse traffic_signals:direction on child nodes

(closes #4595)
This commit is contained in:
Bryan Housel
2017-12-06 20:48:21 -05:00
parent 18ab596f58
commit 6cfe7a2e71
2 changed files with 65 additions and 3 deletions
+3 -3
View File
@@ -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
+62
View File
@@ -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');
});
});