diff --git a/js/id/core/way.js b/js/id/core/way.js index e17c514686..e311237edf 100644 --- a/js/id/core/way.js +++ b/js/id/core/way.js @@ -98,10 +98,17 @@ _.extend(iD.Way.prototype, { }, removeNode: function(id) { - var nodes = _.without(this.nodes, id); + var nodes = []; + + for (var i = 0; i < this.nodes.length; i++) { + var node = this.nodes[i]; + if (node != id && nodes[nodes.length - 1] != node) { + nodes.push(node); + } + } // Preserve circularity - if (this.nodes.length > 1 && this.first() === id && this.last() === id) { + if (this.nodes.length > 1 && this.first() === id && this.last() === id && nodes[nodes.length - 1] != nodes[0]) { nodes.push(nodes[0]); } diff --git a/test/spec/core/way.js b/test/spec/core/way.js index 2b0c244cd7..9a4a90d8ba 100644 --- a/test/spec/core/way.js +++ b/test/spec/core/way.js @@ -221,6 +221,15 @@ describe('iD.Way', function() { expect(w.removeNode('a').nodes).to.eql([]); }); + it("prevents duplicate consecutive nodes", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + c = iD.Node({id: 'c'}), + w = iD.Way({nodes: ['a', 'b', 'c', 'b']}); + + expect(w.removeNode('c').nodes).to.eql(['a', 'b']); + }); + it("preserves circularity", function () { var a = iD.Node({id: 'a'}), b = iD.Node({id: 'b'}), @@ -230,6 +239,16 @@ describe('iD.Way', function() { expect(w.removeNode('a').nodes).to.eql(['b', 'c', 'd', 'b']); }); + + it("prevents duplicate consecutive nodes when preserving circularity", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + c = iD.Node({id: 'c'}), + d = iD.Node({id: 'd'}), + w = iD.Way({nodes: ['a', 'b', 'c', 'd', 'b', 'a']}); + + expect(w.removeNode('a').nodes).to.eql(['b', 'c', 'd', 'b']); + }); }); describe("#asJXON", function () {