summaryrefslogtreecommitdiffstats
path: root/storage/test/unit/test_js_helpers.js
diff options
context:
space:
mode:
Diffstat (limited to 'storage/test/unit/test_js_helpers.js')
-rw-r--r--storage/test/unit/test_js_helpers.js150
1 files changed, 150 insertions, 0 deletions
diff --git a/storage/test/unit/test_js_helpers.js b/storage/test/unit/test_js_helpers.js
new file mode 100644
index 0000000000..da533a78fc
--- /dev/null
+++ b/storage/test/unit/test_js_helpers.js
@@ -0,0 +1,150 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sw=2 ts=2 sts=2 et : */
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+/**
+ * This file tests that the JS language helpers in various ways.
+ */
+
+// Test Functions
+
+function test_params_enumerate() {
+ let stmt = createStatement("SELECT * FROM test WHERE id IN (:a, :b, :c)");
+
+ // Make sure they are right.
+ let expected = [0, 1, 2, "a", "b", "c", "length"];
+ let index = 0;
+ for (let name in stmt.params) {
+ if (name == "QueryInterface") {
+ continue;
+ }
+ Assert.equal(name, expected[index++]);
+ }
+ Assert.equal(index, 7);
+}
+
+function test_params_prototype() {
+ let stmt = createStatement("SELECT * FROM sqlite_master");
+
+ // Set a property on the prototype and make sure it exist (will not be a
+ // bindable parameter, however).
+ Object.getPrototypeOf(stmt.params).test = 2;
+ Assert.equal(stmt.params.test, 2);
+
+ delete Object.getPrototypeOf(stmt.params).test;
+ stmt.finalize();
+}
+
+function test_row_prototype() {
+ let stmt = createStatement("SELECT * FROM sqlite_master");
+
+ Assert.ok(stmt.executeStep());
+
+ // Set a property on the prototype and make sure it exists (will not be in the
+ // results, however).
+ Object.getPrototypeOf(stmt.row).test = 2;
+ Assert.equal(stmt.row.test, 2);
+
+ // Clean up after ourselves.
+ delete Object.getPrototypeOf(stmt.row).test;
+ stmt.finalize();
+}
+
+function test_row_enumerate() {
+ let stmt = createStatement("SELECT * FROM test");
+
+ Assert.ok(stmt.executeStep());
+
+ let expected = ["id", "string"];
+ let expected_values = [123, "foo"];
+ let index = 0;
+ for (let name in stmt.row) {
+ Assert.equal(name, expected[index]);
+ Assert.equal(stmt.row[name], expected_values[index]);
+ index++;
+ }
+ Assert.equal(index, 2);
+
+ // Save off the row helper, then forget the statement and trigger a GC. We
+ // want to ensure that if the row helper is retained but the statement is
+ // destroyed, that no crash occurs and that the late access attempt simply
+ // throws an error.
+ let savedOffRow = stmt.row;
+ stmt = null;
+ Cu.forceGC();
+ Assert.throws(
+ () => {
+ return savedOffRow.string;
+ },
+ /NS_ERROR_NOT_INITIALIZED/,
+ "GC'ed statement should throw"
+ );
+}
+
+function test_params_gets_sync() {
+ // Added for bug 562866.
+ /*
+ let stmt = createStatement(
+ "SELECT * FROM test WHERE id IN (:a, :b, :c)"
+ );
+
+ // Make sure we do not assert in getting the value.
+ let originalCount = Object.getOwnPropertyNames(stmt.params).length;
+ let expected = ["a", "b", "c"];
+ for (let name of expected) {
+ stmt.params[name];
+ }
+
+ // Now make sure we didn't magically get any additional properties.
+ let finalCount = Object.getOwnPropertyNames(stmt.params).length;
+ do_check_eq(originalCount + expected.length, finalCount);
+ */
+}
+
+function test_params_gets_async() {
+ // Added for bug 562866.
+ /*
+ let stmt = createAsyncStatement(
+ "SELECT * FROM test WHERE id IN (:a, :b, :c)"
+ );
+
+ // Make sure we do not assert in getting the value.
+ let originalCount = Object.getOwnPropertyNames(stmt.params).length;
+ let expected = ["a", "b", "c"];
+ for (let name of expected) {
+ stmt.params[name];
+ }
+
+ // Now make sure we didn't magically get any additional properties.
+ let finalCount = Object.getOwnPropertyNames(stmt.params).length;
+ do_check_eq(originalCount + expected.length, finalCount);
+ */
+}
+
+// Test Runner
+
+var tests = [
+ test_params_enumerate,
+ test_params_prototype,
+ test_row_enumerate,
+ test_row_prototype,
+ test_params_gets_sync,
+ test_params_gets_async,
+];
+function run_test() {
+ cleanup();
+
+ // Create our database.
+ getOpenedDatabase().executeSimpleSQL(
+ "CREATE TABLE test (id INTEGER PRIMARY KEY, string TEXT)"
+ );
+ getOpenedDatabase().executeSimpleSQL(
+ "INSERT INTO test (id, string) VALUES (123, 'foo')"
+ );
+
+ // Run the tests.
+ tests.forEach(test => test());
+}