Files
iD/test/spec/validations/osm_api_limits.js
Martin Raifer f3a985f78b ways with more than 2000 nodes: prevent lockup and provide validator-fix (#8808)
* add validation & fix for way vertices limit imposed by OSM API (try to choose splitting locations at existing intersection vertices if possible)
* fix splitting of closed ways at two or more nodes:
  this bug resulted sometimes in one extra split point in the result, or one of the split  vertices to be left unsplit
2025-02-11 20:08:38 +01:00

97 lines
3.1 KiB
JavaScript

describe('iD.validations.osm_api_limits', function () {
var context;
beforeEach(function() {
iD.services.osm = { maxWayNodes: function() { return 10; } };
context = iD.coreContext().assetPath('../dist/').init();
context.surface = () => d3.select('#nop'); // mock with NOP
});
function createWay(numNodes) {
var nodes = [];
for (var i = 0; i < numNodes; i++) {
nodes.push(iD.osmNode({ id: 'n-' + i, loc: [i, i]}));
}
var w = iD.osmWay({id: 'w-1', tags: {},
nodes: nodes.map(function(n) { return n.id; }) });
context.perform.apply(null, nodes
.map(function(n) { return iD.actionAddEntity(n); })
.concat(iD.actionAddEntity(w))
);
}
function validate() {
var validator = iD.validationOsmApiLimits(context);
var changes = context.history().changes();
var entities = changes.modified.concat(changes.created);
var issues = [];
entities.forEach(function(entity) {
issues = issues.concat(validator(entity, context.graph()));
});
return issues;
}
it('has no errors on init', function() {
var issues = validate();
expect(issues).to.have.lengthOf(0);
});
it('flags way with more than the maximum number of allowed nodes', function() {
createWay(12);
var issues = validate();
expect(issues).to.have.lengthOf(1);
var issue = issues[0];
expect(issue.type).to.eql('osm_api_limits');
expect(issue.subtype).to.eql('exceededMaxWayNodes');
expect(issue.severity).to.eql('error');
expect(issue.entityIds).to.have.lengthOf(1);
expect(issue.entityIds[0]).to.eql('w-1');
var fixes = issue.fixes(context);
expect(fixes).to.have.lengthOf(1);
fixes[0].onClick(context);
issues = validate();
expect(issues).to.have.lengthOf(0);
});
it('can fix an extreme case', function() {
createWay(33);
var issues = validate();
expect(issues).to.have.lengthOf(1);
var issue = issues[0];
var fixes = issue.fixes(context);
expect(fixes).to.have.lengthOf(1);
fixes[0].onClick(context);
issues = validate();
expect(issues).to.have.lengthOf(0);
});
it('fix a simple case at an intersection vertex', function() {
createWay(12);
var n2 = iD.osmNode({id: 'n-0', loc: [0,0]});
var n1 = iD.osmNode({id: 'n-8', loc: [8,8]});
var w = iD.osmWay({id: 'w-2', nodes: ['n-0', 'n-8'], tags: {}});
context.perform(
iD.actionAddEntity(n1),
iD.actionAddEntity(n2),
iD.actionAddEntity(w)
);
var issues = validate();
expect(issues).to.have.lengthOf(1);
var issue = issues[0];
var fixes = issue.fixes(context);
expect(fixes).to.have.lengthOf(1);
fixes[0].onClick(context);
issues = validate();
expect(issues).to.have.lengthOf(0);
context.graph().entity('w-1').nodes.length === 8;
});
});