From c43d915625ce022a920cbbda7988a709c8551d22 Mon Sep 17 00:00:00 2001 From: Martijn van Exel Date: Thu, 21 Nov 2013 10:58:29 -0700 Subject: [PATCH] Reverse cardinal directions for relation member roles --- js/id/actions/reverse.js | 19 +++++++++++++++---- test/spec/actions/reverse.js | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/js/id/actions/reverse.js b/js/id/actions/reverse.js index 587829d2b..7a1f74be7 100644 --- a/js/id/actions/reverse.js +++ b/js/id/actions/reverse.js @@ -14,6 +14,8 @@ Relation members: role=forward ⟺ role=backward + role=north ⟺ role=south + role=east ⟺ role=west In addition, numeric-valued `incline` tags are negated. @@ -29,9 +31,18 @@ */ iD.actions.Reverse = function(wayId) { var replacements = [ - [/:right$/, ':left'], [/:left$/, ':right'], - [/:forward$/, ':backward'], [/:backward$/, ':forward'] - ], numeric = /^([+\-]?)(?=[\d.])/; + [/:right$/, ':left'], [/:left$/, ':right'], + [/:forward$/, ':backward'], [/:backward$/, ':forward'] + ], + numeric = /^([+\-]?)(?=[\d.])/, + roleReversals = { + forward: 'backward', + backward: 'forward', + north: 'south', + south: 'north', + east: 'west', + west: 'east' + }; function reverseKey(key) { for (var i = 0; i < replacements.length; ++i) { @@ -64,7 +75,7 @@ iD.actions.Reverse = function(wayId) { graph.parentRelations(way).forEach(function(relation) { relation.members.forEach(function(member, index) { - if (member.id === way.id && (role = {forward: 'backward', backward: 'forward'}[member.role])) { + if (member.id === way.id && (role = roleReversals[member.role])) { relation = relation.updateMember({role: role}, index); graph = graph.replace(relation); } diff --git a/test/spec/actions/reverse.js b/test/spec/actions/reverse.js index 40d0f5500..9ddc29c7a 100644 --- a/test/spec/actions/reverse.js +++ b/test/spec/actions/reverse.js @@ -114,4 +114,28 @@ describe("iD.actions.Reverse", function () { graph = iD.actions.Reverse(way.id)(graph); expect(graph.entity(relation.id).members[0].role).to.eql('forward'); }); + + it("transforms role=north ⟺ role=south in member relations", function () { + var way = iD.Way({tags: {highway: 'residential'}}), + relation = iD.Relation({members: [{type: 'way', id: way.id, role: 'north'}]}), + graph = iD.Graph([way, relation]); + + graph = iD.actions.Reverse(way.id)(graph); + expect(graph.entity(relation.id).members[0].role).to.eql('south'); + + graph = iD.actions.Reverse(way.id)(graph); + expect(graph.entity(relation.id).members[0].role).to.eql('north'); + }); + + it("transforms role=east ⟺ role=west in member relations", function () { + var way = iD.Way({tags: {highway: 'residential'}}), + relation = iD.Relation({members: [{type: 'way', id: way.id, role: 'east'}]}), + graph = iD.Graph([way, relation]); + + graph = iD.actions.Reverse(way.id)(graph); + expect(graph.entity(relation.id).members[0].role).to.eql('west'); + + graph = iD.actions.Reverse(way.id)(graph); + expect(graph.entity(relation.id).members[0].role).to.eql('east'); + }); });