carto/test/rendering_js-strict.test.js
Raul Ochoa 50fa97564e Strict parser mode.
When options.strict is set to true, it throws parse errors associated to invalid rules,
or in general rules not compliant with the given reference.
2017-01-31 15:19:47 +01:00

143 lines
4.4 KiB
JavaScript

var assert = require('assert');
var carto = require('../lib/carto');
var tree = require('../lib/carto/tree');
describe('RendererJS Strict Mode', function() {
var style = [
'#world {',
'polygon-fill: red;',
'line-width: 2;',
'line-color: #f00;',
'[frame-offset = 1] {',
'line-width: 3;',
'}',
'[frame-offset = 2] {',
'line-width: 3;',
'}',
'}',
'',
'#worls[frame-offset = 10] {',
'line-width: 4;',
'}'
].join('\n');
var reference = {
version: '1.0.0',
style: {},
layer: {},
colors: {},
filter: {},
symbolizers: {
line: {
"stroke": {
"css": "line-color",
"default-value": "rgba(0,0,0,1)",
"type": "color",
"default-meaning": "black and fully opaque (alpha = 1), same as rgb(0,0,0)",
"doc": "The color of a drawn line"
},
"stroke-width": {
"css": "line-width",
"default-value": 1,
"type": "float",
"doc": "The width of a line in pixels"
},
"stroke-opacity": {
"css": "line-opacity",
"default-value": 1,
"type": "float",
"default-meaning": "opaque",
"doc": "The opacity of a line"
},
"stroke-linejoin": {
"css": "line-join",
"default-value": "miter",
"type": [
"miter",
"miter-revert",
"round",
"bevel"
],
"expression": true,
"doc": "The behavior of lines when joining.",
"default-meaning": "The line joins will be rendered using a miter look."
},
"stroke-linecap": {
"css": "line-cap",
"default-value": "butt",
"type": [
"butt",
"round",
"square"
],
"expression": true,
"doc": "The display of line endings.",
"default-meaning": "The line endings will be rendered using a butt look."
},
"comp-op": {
"css": "line-comp-op",
"default-value": "overlay",
"default-meaning": "Add the current symbolizer on top of other symbolizer.",
"doc": "Composite operation. This defines how this symbolizer should behave relative to symbolizers atop or below it.",
"type": [
"multiply",
"add",
"overlay"
],
"expression": true
},
"stroke-dasharray": {
"css": "line-dasharray",
"type": "numbers",
"expression": true,
"doc": "A pair of length values [a,b], where (a) is the dash length and (b) is the gap length respectively. More than two values are supported for more complex patterns.",
"default-value": "none",
"default-meaning": "The line will be drawn without dashes."
}
}
}
};
var expectedErrorMessageRegex = /Unrecognized rule: polygon-fill/;
before(function() {
this.referenceData = tree.Reference.data;
});
after(function() {
tree.Reference.setData(this.referenceData);
});
it('should fail if a feature is not supported and strict is turned on', function () {
assert.throws(
function () {
var RendererJS = new carto.RendererJS({reference: reference, mapnik_version: '1.0.0', strict: true });
var shader = RendererJS.render(style);
},
expectedErrorMessageRegex
);
});
function rendererStrictModeOffTest(RendererJS) {
return function () {
var shader = RendererJS.render(style);
assert.ok(shader.parse_env);
assert.ok(shader.parse_env.errors);
assert.ok(shader.parse_env.errors.message.match(expectedErrorMessageRegex));
assert.ok(shader.layers);
assert.equal(shader.layers.length, 2);
};
}
it('should pass if a feature is not supported but strict mode is not specified', rendererStrictModeOffTest(
new carto.RendererJS({reference: reference, mapnik_version: '1.0.0' })
));
it('should pass if a feature is not supported but strict is turned off', rendererStrictModeOffTest(
new carto.RendererJS({reference: reference, mapnik_version: '1.0.0', strict: false })
));
});