summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/test/test-weak-set.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/test/test-weak-set.js')
-rw-r--r--addon-sdk/source/test/test-weak-set.js146
1 files changed, 146 insertions, 0 deletions
diff --git a/addon-sdk/source/test/test-weak-set.js b/addon-sdk/source/test/test-weak-set.js
new file mode 100644
index 000000000..f7cc19e04
--- /dev/null
+++ b/addon-sdk/source/test/test-weak-set.js
@@ -0,0 +1,146 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const { Cu } = require("chrome");
+const memory = require("sdk/test/memory");
+const { add, remove, has, clear, iterator } = require("sdk/lang/weak-set");
+const { setInterval, clearInterval } = require("sdk/timers");
+
+function gc(assert) {
+ let wait = 1;
+ let interval = setInterval(function() {
+ assert.pass("waited " + (wait++ * 0.250) + "secs for gc()..");
+ }, 250);
+
+ return memory.gc().then(() => {
+ assert.pass("gc completed!");
+ clearInterval(interval);
+ });
+}
+
+exports['test add/remove/iterate/clear item'] = function*(assert) {
+ let addItems = {};
+ let removeItems = {};
+ let iterateItems = {};
+ let clearItems = {};
+ let nonReferencedItems = {};
+
+ let item = {};
+ let addedItems = [{}, {}];
+
+ assert.pass("adding things to items");
+ add(addItems, item);
+ add(removeItems, item);
+ add(iterateItems, addedItems[0]);
+ add(iterateItems, addedItems[1]);
+ add(iterateItems, addedItems[0]); // weak set shouldn't add this twice
+ add(clearItems, addedItems[0]);
+ add(clearItems, addedItems[1]);
+ add(nonReferencedItems, {});
+
+ assert.pass("removing things from removeItems");
+ remove(removeItems, item);
+
+ assert.pass("clear things from clearItems");
+ clear(clearItems);
+
+ assert.pass("starting gc..");
+ yield gc(assert);
+ let count = 0;
+
+ assert.equal(has(addItems, item), true, 'the addItems is in the weak set');
+ assert.equal(has(removeItems, item), false, 'the removeItems is not in weak set');
+
+ assert.pass("iterating iterateItems..");
+ for (let item of iterator(iterateItems)) {
+ assert.equal(item, addedItems[count], "item in the expected order");
+ count++;
+ }
+
+ assert.equal(count, 2, 'items in the expected number');
+
+ assert.pass("iterating clearItems..");
+ for (let item of iterator(clearItems)) {
+ assert.fail("the loop should not be executed");
+ count++
+ }
+
+ for (let item of iterator(nonReferencedItems)) {
+ assert.fail("the loop should not be executed");
+ count++
+ }
+
+ assert.equal(count, 2, 'items in the expected number');
+};
+
+exports['test adding non object or null item'] = function(assert) {
+ let items = {};
+
+ assert.throws(() => {
+ add(items, 'foo');
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+
+ assert.throws(() => {
+ add(items, 0);
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+
+ assert.throws(() => {
+ add(items, undefined);
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+
+ assert.throws(() => {
+ add(items, null);
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+
+ assert.throws(() => {
+ add(items, true);
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+};
+
+exports['test adding to non object or null item'] = function(assert) {
+ let item = {};
+
+ assert.throws(() => {
+ add('foo', item);
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+
+ assert.throws(() => {
+ add(0, item);
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+
+ assert.throws(() => {
+ add(undefined, item);
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+
+ assert.throws(() => {
+ add(null, item);
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+
+ assert.throws(() => {
+ add(true, item);
+ },
+ /^\w+ is not a non-null object/,
+ 'only non-null object are allowed');
+};
+
+require("sdk/test").run(exports);