diff --git a/js/id/actions/add_midpoint.js b/js/id/actions/add_midpoint.js index 95e3b5f3e..36724f70b 100644 --- a/js/id/actions/add_midpoint.js +++ b/js/id/actions/add_midpoint.js @@ -13,6 +13,10 @@ iD.actions.AddMidpoint = function(midpoint, node) { (way.nodes[i] === midpoint.edge[1] && way.nodes[i + 1] === midpoint.edge[0])) { graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1)); + + // Add only one midpoint on doubled-back segments, + // turning them into self-intersections. + return; } } }); diff --git a/test/spec/actions/add_midpoint.js b/test/spec/actions/add_midpoint.js index 75fadbac0..1a543b768 100644 --- a/test/spec/actions/add_midpoint.js +++ b/test/spec/actions/add_midpoint.js @@ -34,4 +34,21 @@ describe("iD.actions.AddMidpoint", function () { expect(graph.entity(w1.id).nodes).to.eql([]); expect(graph.entity(w2.id).nodes).to.eql([b.id, node.id, a.id]); }); + + it("turns an invalid double-back into a self-intersection", function () { + // a====b (aba) + // Expected result (converts to a valid loop): + // a---b (acba) + // \ / + // c + + var a = iD.Node(), + b = iD.Node(), + c = iD.Node(), + w = iD.Way({nodes: [a.id, b.id, a.id]}), + midpoint = {loc: [1, 2], edge: [a.id, b.id]}, + graph = iD.actions.AddMidpoint(midpoint, c)(iD.Graph([a, b, w])); + + expect(graph.entity(w.id).nodes).to.eql([a.id, c.id, b.id, a.id]); + }); });