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: 'use strict'; michael@0: michael@0: const { Cu } = require('chrome'); michael@0: const { Loader } = require('sdk/test/loader'); michael@0: const { defer } = require('sdk/core/promise'); michael@0: michael@0: function gc() { michael@0: let { promise, resolve } = defer(); michael@0: michael@0: Cu.schedulePreciseGC(resolve); michael@0: michael@0: return promise; michael@0: }; michael@0: michael@0: exports['test adding item'] = function(assert, done) { michael@0: let loader = Loader(module); michael@0: let { add, remove, has, clear, iterator } = loader.require('sdk/lang/weak-set'); michael@0: michael@0: let items = {}; michael@0: let item = {}; michael@0: michael@0: add(items, item); michael@0: michael@0: gc(). michael@0: then(() => { michael@0: assert.ok(has(items, item), michael@0: 'the item is in the weak set'); michael@0: }). michael@0: then(loader.unload). michael@0: then(done, assert.fail); michael@0: }; michael@0: michael@0: exports['test remove item'] = function(assert, done) { michael@0: let loader = Loader(module); michael@0: let { add, remove, has, clear, iterator } = loader.require('sdk/lang/weak-set'); michael@0: michael@0: let items = {}; michael@0: let item = {}; michael@0: michael@0: add(items, item); michael@0: michael@0: remove(items, item); michael@0: michael@0: gc(). michael@0: then(() => { michael@0: assert.ok(!has(items, item), michael@0: 'the item is not in weak set'); michael@0: }). michael@0: then(loader.unload). michael@0: then(done, assert.fail); michael@0: }; michael@0: michael@0: exports['test iterate'] = function(assert, done) { michael@0: let loader = Loader(module); michael@0: let { add, remove, has, clear, iterator } = loader.require('sdk/lang/weak-set'); michael@0: michael@0: let items = {}; michael@0: let addedItems = [{}, {}]; michael@0: michael@0: add(items, addedItems[0]); michael@0: add(items, addedItems[1]); michael@0: add(items, addedItems[0]); // weak set shouldn't add this twice michael@0: michael@0: gc(). michael@0: then(() => { michael@0: let count = 0; michael@0: michael@0: for (let item of iterator(items)) { michael@0: assert.equal(item, addedItems[count], michael@0: 'item in the expected order'); michael@0: michael@0: count++; michael@0: } michael@0: michael@0: assert.equal(count, 2, michael@0: 'items in the expected number'); michael@0: }). michael@0: then(loader.unload). michael@0: then(done, assert.fail); michael@0: }; michael@0: michael@0: exports['test clear'] = function(assert, done) { michael@0: let loader = Loader(module); michael@0: let { add, remove, has, clear, iterator } = loader.require('sdk/lang/weak-set'); michael@0: michael@0: let items = {}; michael@0: let addedItems = [{}, {}]; michael@0: michael@0: add(items, addedItems[0]); michael@0: add(items, addedItems[1]); michael@0: michael@0: clear(items) michael@0: michael@0: gc(). michael@0: then(() => { michael@0: let count = 0; michael@0: michael@0: for (let item of iterator(items)) michael@0: assert.fail('the loop should not be executed'); michael@0: michael@0: assert.equal(count, 0, michael@0: 'no items in the weak set'); michael@0: }). michael@0: then(loader.unload). michael@0: then(done, assert.fail); michael@0: }; michael@0: michael@0: exports['test adding item without reference'] = function(assert, done) { michael@0: let loader = Loader(module); michael@0: let { add, remove, has, clear, iterator } = loader.require('sdk/lang/weak-set'); michael@0: michael@0: let items = {}; michael@0: michael@0: add(items, {}); michael@0: michael@0: gc(). michael@0: then(() => { michael@0: let count = 0; michael@0: michael@0: for (let item of iterator(items)) michael@0: assert.fail('the loop should not be executed'); michael@0: michael@0: assert.equal(count, 0, michael@0: 'no items in the weak set'); michael@0: }). michael@0: then(loader.unload). michael@0: then(done, assert.fail); michael@0: }; michael@0: michael@0: exports['test adding non object or null item'] = function(assert) { michael@0: let loader = Loader(module); michael@0: let { add, remove, has, clear, iterator } = loader.require('sdk/lang/weak-set'); michael@0: michael@0: let items = {}; michael@0: michael@0: assert.throws(() => { michael@0: add(items, 'foo'); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: michael@0: assert.throws(() => { michael@0: add(items, 0); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: michael@0: assert.throws(() => { michael@0: add(items, undefined); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: michael@0: assert.throws(() => { michael@0: add(items, null); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: michael@0: assert.throws(() => { michael@0: add(items, true); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: }; michael@0: michael@0: exports['test adding to non object or null item'] = function(assert) { michael@0: let loader = Loader(module); michael@0: let { add, remove, has, clear, iterator } = loader.require('sdk/lang/weak-set'); michael@0: michael@0: let item = {}; michael@0: michael@0: assert.throws(() => { michael@0: add('foo', item); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: michael@0: assert.throws(() => { michael@0: add(0, item); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: michael@0: assert.throws(() => { michael@0: add(undefined, item); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: michael@0: assert.throws(() => { michael@0: add(null, item); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: michael@0: assert.throws(() => { michael@0: add(true, item); michael@0: }, michael@0: /^value is not a non-null object/, michael@0: 'only non-null object are allowed'); michael@0: }; michael@0: michael@0: require('test').run(exports);