From 0063ddba7f8c55535b617669062b0eec8349e441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 3 Mar 2017 14:36:14 +0100 Subject: [PATCH 1/8] Support '=~' operator --- lib/carto/tree/filterset.js | 3 +++ test/rendering_js.test.js | 41 ++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/lib/carto/tree/filterset.js b/lib/carto/tree/filterset.js index 563bf3d..b02f706 100644 --- a/lib/carto/tree/filterset.js +++ b/lib/carto/tree/filterset.js @@ -92,6 +92,9 @@ tree.Filterset.prototype.toJS = function(env) { val = filter._val.toString(true); } var attrs = "data"; + if (op === '=~') { + return attrs + "['" + filter.key.value + "'].match(" + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'") + "'" : val) + ")"; + } return attrs + "['" + filter.key.value + "'] " + op + " " + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'") + "'" : val); }).join(' && '); }; diff --git a/test/rendering_js.test.js b/test/rendering_js.test.js index 5e5694b..e6e5939 100644 --- a/test/rendering_js.test.js +++ b/test/rendering_js.test.js @@ -4,24 +4,24 @@ var carto = require('../lib/carto'); describe('RenderingJS', function() { var shader; var style = [ - '#world {', - '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;', + '#world {', + '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'); beforeEach(function() { - shader = (new carto.RendererJS({ debug: true })).render(style); + shader = (new carto.RendererJS({ debug: false })).render(style); }); it ("shold render layers", function() { @@ -183,4 +183,17 @@ describe('RenderingJS', function() { assert.equal(st.args[2].args[0].value, 10); }); + it("should not throw `ReferenceError`", function(){ + var css = [ + '#layer[name=~".*Cairo*"] {', + ' marker-width: 14;', + '}' + ].join('\n'); + + assert.doesNotThrow(function () { + var shader = (new carto.RendererJS({})).render(css); + var layer = shader.getLayers()[0]; + var value = layer.shader['marker-width'].style({ name: 'wadus' }, { zoom: 1 }); + }); + }); }); From c780998dc82b56cd71c33a1de3cb86a861400f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 3 Mar 2017 15:27:42 +0100 Subject: [PATCH 2/8] Prevent TypeError when parsing '=~' operator --- lib/carto/tree/filterset.js | 2 +- test/rendering_js.test.js | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/carto/tree/filterset.js b/lib/carto/tree/filterset.js index b02f706..168816f 100644 --- a/lib/carto/tree/filterset.js +++ b/lib/carto/tree/filterset.js @@ -93,7 +93,7 @@ tree.Filterset.prototype.toJS = function(env) { } var attrs = "data"; if (op === '=~') { - return attrs + "['" + filter.key.value + "'].match(" + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'") + "'" : val) + ")"; + return "(typeof " + attrs + "['" + filter.key.value + "'] === 'string') && " + attrs + "['" + filter.key.value + "'].match(" + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'") + "'" : val) + ")"; } return attrs + "['" + filter.key.value + "'] " + op + " " + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'") + "'" : val); }).join(' && '); diff --git a/test/rendering_js.test.js b/test/rendering_js.test.js index e6e5939..597998b 100644 --- a/test/rendering_js.test.js +++ b/test/rendering_js.test.js @@ -183,7 +183,7 @@ describe('RenderingJS', function() { assert.equal(st.args[2].args[0].value, 10); }); - it("should not throw `ReferenceError`", function(){ + it("should not throw `ReferenceError` with `=~` operator", function(){ var css = [ '#layer[name=~".*Cairo*"] {', ' marker-width: 14;', @@ -196,4 +196,21 @@ describe('RenderingJS', function() { var value = layer.shader['marker-width'].style({ name: 'wadus' }, { zoom: 1 }); }); }); + + it("should not throw `TypeError` if left operand is not a `string` with operator `=~`", function(){ + var css = [ + '#layer[name=~1] {', + ' marker-width: 14;', + '}' + ].join('\n'); + + assert.doesNotThrow(function () { + var shader = (new carto.RendererJS({})).render(css); + var layer = shader.getLayers()[0]; + var value = layer.shader['marker-width'].style({ name: 1 }, { zoom: 1 }); + value = layer.shader['marker-width'].style({ name: null }, { zoom: 1 }); + value = layer.shader['marker-width'].style({ name: undefined }, { zoom: 1 }); + value = layer.shader['marker-width'].style({ name: true }, { zoom: 1 }); + }); + }); }); From cc2104eb4995da3a9f03c7af55abef137ac397eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Fri, 3 Mar 2017 15:35:57 +0100 Subject: [PATCH 3/8] Fix typo --- test/rendering_js.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/rendering_js.test.js b/test/rendering_js.test.js index 597998b..cd0895b 100644 --- a/test/rendering_js.test.js +++ b/test/rendering_js.test.js @@ -32,7 +32,7 @@ describe('RenderingJS', function() { var layer = shader.getLayers()[0]; assert( layer.frames()[0] === 0); assert( layer.frames()[1] === 1); - + layer = shader.getLayers()[1]; assert( layer.frames()[0] === 10); }); @@ -185,7 +185,7 @@ describe('RenderingJS', function() { it("should not throw `ReferenceError` with `=~` operator", function(){ var css = [ - '#layer[name=~".*Cairo*"] {', + '#layer[name=~".*wadus*"] {', ' marker-width: 14;', '}' ].join('\n'); @@ -199,7 +199,7 @@ describe('RenderingJS', function() { it("should not throw `TypeError` if left operand is not a `string` with operator `=~`", function(){ var css = [ - '#layer[name=~1] {', + '#layer[name=~".*wadus*"] {', ' marker-width: 14;', '}' ].join('\n'); From 5c4bed9593c69be52e14dd4737d05395761949ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 6 Mar 2017 11:38:59 +0100 Subject: [PATCH 4/8] Keep spaces --- test/rendering_js.test.js | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/test/rendering_js.test.js b/test/rendering_js.test.js index cd0895b..e546a3b 100644 --- a/test/rendering_js.test.js +++ b/test/rendering_js.test.js @@ -4,24 +4,24 @@ var carto = require('../lib/carto'); describe('RenderingJS', function() { var shader; var style = [ - '#world {', - '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;', + '#world {', + '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'); beforeEach(function() { - shader = (new carto.RendererJS({ debug: false })).render(style); + shader = (new carto.RendererJS({ debug: true })).render(style); }); it ("shold render layers", function() { From fd94fbd2e69ce2e338929f07aa0d94cf263eb19d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 6 Mar 2017 11:57:07 +0100 Subject: [PATCH 5/8] Support numbers for '=~' operator --- lib/carto/tree/filterset.js | 2 +- test/rendering_js.test.js | 13 +++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/lib/carto/tree/filterset.js b/lib/carto/tree/filterset.js index 168816f..2866959 100644 --- a/lib/carto/tree/filterset.js +++ b/lib/carto/tree/filterset.js @@ -93,7 +93,7 @@ tree.Filterset.prototype.toJS = function(env) { } var attrs = "data"; if (op === '=~') { - return "(typeof " + attrs + "['" + filter.key.value + "'] === 'string') && " + attrs + "['" + filter.key.value + "'].match(" + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'") + "'" : val) + ")"; + return "(" + attrs + "['" + filter.key.value + "'] + '').match(" + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'") + "'" : val) + ")"; } return attrs + "['" + filter.key.value + "'] " + op + " " + (val.is === 'string' ? "'" + val.toString().replace(/'/g, "\\'") + "'" : val); }).join(' && '); diff --git a/test/rendering_js.test.js b/test/rendering_js.test.js index e546a3b..f68cfe8 100644 --- a/test/rendering_js.test.js +++ b/test/rendering_js.test.js @@ -196,10 +196,10 @@ describe('RenderingJS', function() { var value = layer.shader['marker-width'].style({ name: 'wadus' }, { zoom: 1 }); }); }); - - it("should not throw `TypeError` if left operand is not a `string` with operator `=~`", function(){ + + it("`=~` operator should support numbers", function(){ var css = [ - '#layer[name=~".*wadus*"] {', + '#layer[value=~"^10"] {', ' marker-width: 14;', '}' ].join('\n'); @@ -207,10 +207,7 @@ describe('RenderingJS', function() { assert.doesNotThrow(function () { var shader = (new carto.RendererJS({})).render(css); var layer = shader.getLayers()[0]; - var value = layer.shader['marker-width'].style({ name: 1 }, { zoom: 1 }); - value = layer.shader['marker-width'].style({ name: null }, { zoom: 1 }); - value = layer.shader['marker-width'].style({ name: undefined }, { zoom: 1 }); - value = layer.shader['marker-width'].style({ name: true }, { zoom: 1 }); - }); + var value = layer.shader['marker-width'].style({ value: 10 }, { zoom: 1 }); + }, Error); }); }); From 8c75b4b0c67fb44ff479e3fbe7f62bd5185bbc9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 6 Mar 2017 11:59:41 +0100 Subject: [PATCH 6/8] Remove spaces --- test/rendering_js.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/rendering_js.test.js b/test/rendering_js.test.js index f68cfe8..f351f46 100644 --- a/test/rendering_js.test.js +++ b/test/rendering_js.test.js @@ -32,7 +32,7 @@ describe('RenderingJS', function() { var layer = shader.getLayers()[0]; assert( layer.frames()[0] === 0); assert( layer.frames()[1] === 1); - + layer = shader.getLayers()[1]; assert( layer.frames()[0] === 10); }); From 410ecfd3c7f59ac2620db722476dff7bdb5872da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 6 Mar 2017 12:04:29 +0100 Subject: [PATCH 7/8] Use constructor for test validation --- test/rendering_js.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/rendering_js.test.js b/test/rendering_js.test.js index f351f46..22c4b15 100644 --- a/test/rendering_js.test.js +++ b/test/rendering_js.test.js @@ -194,7 +194,7 @@ describe('RenderingJS', function() { var shader = (new carto.RendererJS({})).render(css); var layer = shader.getLayers()[0]; var value = layer.shader['marker-width'].style({ name: 'wadus' }, { zoom: 1 }); - }); + }, ReferenceError); }); it("`=~` operator should support numbers", function(){ From a42afef5a83217abcdabcec354bfacd6b5188436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Aubert?= Date: Mon, 6 Mar 2017 19:20:01 +0100 Subject: [PATCH 8/8] Add assertions --- test/rendering_js.test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/rendering_js.test.js b/test/rendering_js.test.js index 22c4b15..e09ea9d 100644 --- a/test/rendering_js.test.js +++ b/test/rendering_js.test.js @@ -194,6 +194,7 @@ describe('RenderingJS', function() { var shader = (new carto.RendererJS({})).render(css); var layer = shader.getLayers()[0]; var value = layer.shader['marker-width'].style({ name: 'wadus' }, { zoom: 1 }); + assert.equal(value, 14); }, ReferenceError); }); @@ -208,6 +209,7 @@ describe('RenderingJS', function() { var shader = (new carto.RendererJS({})).render(css); var layer = shader.getLayers()[0]; var value = layer.shader['marker-width'].style({ value: 10 }, { zoom: 1 }); + assert.equal(value, 14); }, Error); }); });