michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: // This file tests the custom aggregate functions michael@0: michael@0: var testNums = [1, 2, 3, 4]; michael@0: michael@0: function setup() michael@0: { michael@0: getOpenedDatabase().createTable("function_tests", "id INTEGER PRIMARY KEY"); michael@0: michael@0: var stmt = createStatement("INSERT INTO function_tests (id) VALUES(?1)"); michael@0: for(var i = 0; i < testNums.length; ++i) { michael@0: stmt.bindByIndex(0, testNums[i]); michael@0: stmt.execute(); michael@0: } michael@0: stmt.reset(); michael@0: stmt.finalize(); michael@0: } michael@0: michael@0: var testSquareAndSumFunction = { michael@0: calls: 0, michael@0: _sas: 0, michael@0: michael@0: reset: function() { michael@0: this.calls = 0; michael@0: this._sas = 0; michael@0: }, michael@0: michael@0: onStep: function(val) { michael@0: ++this.calls; michael@0: this._sas += val.getInt32(0) * val.getInt32(0); michael@0: }, michael@0: michael@0: onFinal: function() { michael@0: var retval = this._sas; michael@0: this._sas = 0; // Prepare for next group michael@0: return retval; michael@0: } michael@0: }; michael@0: michael@0: function test_aggregate_registration() michael@0: { michael@0: var msc = getOpenedDatabase(); michael@0: msc.createAggregateFunction("test_sas_aggr", 1, testSquareAndSumFunction); michael@0: } michael@0: michael@0: function test_aggregate_no_double_registration() michael@0: { michael@0: var msc = getOpenedDatabase(); michael@0: try { michael@0: msc.createAggregateFunction("test_sas_aggr", 2, testSquareAndSumFunction); michael@0: do_throw("We shouldn't get here!"); michael@0: } catch (e) { michael@0: do_check_eq(Cr.NS_ERROR_FAILURE, e.result); michael@0: } michael@0: } michael@0: michael@0: function test_aggregate_removal() michael@0: { michael@0: var msc = getOpenedDatabase(); michael@0: msc.removeFunction("test_sas_aggr"); michael@0: // Should be Ok now michael@0: msc.createAggregateFunction("test_sas_aggr", 1, testSquareAndSumFunction); michael@0: } michael@0: michael@0: function test_aggregate_no_aliases() michael@0: { michael@0: var msc = getOpenedDatabase(); michael@0: try { michael@0: msc.createAggregateFunction("test_sas_aggr2", 1, testSquareAndSumFunction); michael@0: do_throw("We shouldn't get here!"); michael@0: } catch (e) { michael@0: do_check_eq(Cr.NS_ERROR_FAILURE, e.result); michael@0: } michael@0: } michael@0: michael@0: function test_aggregate_call() michael@0: { michael@0: var stmt = createStatement("SELECT test_sas_aggr(id) FROM function_tests"); michael@0: while(stmt.executeStep()); michael@0: do_check_eq(testNums.length, testSquareAndSumFunction.calls); michael@0: testSquareAndSumFunction.reset(); michael@0: stmt.finalize(); michael@0: } michael@0: michael@0: function test_aggregate_result() michael@0: { michael@0: var sas = 0; michael@0: for(var i = 0; i < testNums.length; ++i) { michael@0: sas += testNums[i] * testNums[i]; michael@0: } michael@0: var stmt = createStatement("SELECT test_sas_aggr(id) FROM function_tests"); michael@0: stmt.executeStep(); michael@0: do_check_eq(sas, stmt.getInt32(0)); michael@0: testSquareAndSumFunction.reset(); michael@0: stmt.finalize(); michael@0: } michael@0: michael@0: var tests = [test_aggregate_registration, test_aggregate_no_double_registration, michael@0: test_aggregate_removal, test_aggregate_no_aliases, test_aggregate_call, michael@0: test_aggregate_result]; michael@0: michael@0: function run_test() michael@0: { michael@0: setup(); michael@0: michael@0: for (var i = 0; i < tests.length; i++) { michael@0: tests[i](); michael@0: } michael@0: michael@0: cleanup(); michael@0: }