diff --git a/test/acceptance/dataviews/formula.js b/test/acceptance/dataviews/formula.js index 941dc07e..53ff2da2 100644 --- a/test/acceptance/dataviews/formula.js +++ b/test/acceptance/dataviews/formula.js @@ -11,70 +11,125 @@ function createMapConfig(layers, dataviews, analysis) { }; } -describe('formula-dataview: special float values', function() { - - afterEach(function(done) { - if (this.testClient) { - this.testClient.drain(done); - } else { - done(); +function getMapConfig(operation, lastNumber) { + return createMapConfig([ + { + "type": "cartodb", + "options": { + "source": { + "id": "a0" + }, + "cartocss": "#points { marker-width: 10; marker-fill: red; }", + "cartocss_version": "2.3.0" + } } + ], + { + val_formula: { + source: { + id: 'a0' + }, + type: 'formula', + options: { + column: 'val', + operation: operation + } + } + }, + [ + { + id: "a0", + type: "source", + params: { + query: ` + SELECT + null::geometry the_geom_webmercator, + CASE + WHEN x % 5 = 1 THEN 'infinity'::float + WHEN x % 5 = 2 THEN '-infinity'::float + WHEN x % 5 = 3 THEN 'NaN'::float + WHEN x % 5 = 4 THEN NULL + ELSE x + END AS val + FROM generate_series(1, ${lastNumber}) x + ` + } + } + ]); +} + +describe('formula-dataview: should filter infinities out and count them in the summary', function() { + describe('easy numbers', function() { // not needed, but I keep it here to help human calc + afterEach(function(done) { + if (this.testClient) { + this.testClient.drain(done); + } else { + done(); + } + }); + + const lastNumber = 10; + + [ + {operation: 'count', result: 2}, + {operation: 'avg', result: 7.5}, + {operation: 'sum', result: 15}, + {operation: 'min', result: 5}, + {operation: 'max', result: 10} + ] + .forEach(operationData => { + it(operationData.operation, function(done) { + this.testClient = new TestClient(getMapConfig(operationData.operation, lastNumber), 1234); + this.testClient.getDataview('val_formula', {}, function(err, dataview) { + assert.ok(!err, err); + assert.deepStrictEqual(dataview, { + type: 'formula', + operation: operationData.operation, + result: operationData.result, + nulls: lastNumber / 5, + nans: lastNumber / 5, + infinities: 2 * lastNumber / 5 + }); + done(); + }); + }); + }); }); - var mapConfig = createMapConfig( - [ - { - "type": "cartodb", - "options": { - "source": { - "id": "a0" - }, - "cartocss": "#points { marker-width: 10; marker-fill: red; }", - "cartocss_version": "2.3.0" - } + describe('bigger numbers', function() { + afterEach(function(done) { + if (this.testClient) { + this.testClient.drain(done); + } else { + done(); } - ], - { - val_formula: { - source: { - id: 'a0' - }, - type: 'formula', - options: { - column: 'val', - operation: 'avg' - } - } - }, - [ - { - "id": "a0", - "type": "source", - "params": { - "query": [ - 'SELECT', - ' null::geometry the_geom_webmercator,', - ' CASE', - ' WHEN x % 4 = 0 THEN \'infinity\'::float', - ' WHEN x % 4 = 1 THEN \'-infinity\'::float', - ' WHEN x % 4 = 2 THEN \'NaN\'::float', - ' ELSE x', - ' END AS val', - 'FROM generate_series(1, 1000) x' - ].join('\n') - } - } - ] - ); + }); - it('should filter infinities out and count them in the summary', function(done) { - this.testClient = new TestClient(mapConfig, 1234); - this.testClient.getDataview('val_formula', {}, function(err, dataview) { - assert.ok(!err, err); - assert.equal(dataview.result, 501); - assert.ok(dataview.infinities === (250 + 250)); - assert.ok(dataview.nans === 250); - done(); + const lastNumber = 1000; + + [ + {operation: 'count', result: 200}, + {operation: 'avg', result: 502.5}, + {operation: 'sum', result: 100500}, + {operation: 'min', result: 5}, + {operation: 'max', result: 1000} + ] + .forEach(operationData => { + it(operationData.operation, function(done) { + this.testClient = new TestClient(getMapConfig(operationData.operation, lastNumber), 1234); + this.testClient.getDataview('val_formula', {}, function(err, dataview) { + assert.ok(!err, err); + assert.deepStrictEqual(dataview, { + type: 'formula', + operation: operationData.operation, + result: operationData.result, + nulls: lastNumber / 5, + nans: lastNumber / 5, + infinities: 2 * lastNumber / 5 + }); + done(); + }); + }); }); }); });