mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-12 16:52:50 +00:00
* 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
97 lines
3.1 KiB
JavaScript
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;
|
|
});
|
|
});
|