mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-20 16:55:40 +00:00
a184de4560
d8ba32821e...96ae8d914f
--HG--
extra : commitid : a69qoBWTUP
extra : rebase_source : 7d0464d7fa1af660b5971bda97786112b0c76053
147 lines
3.6 KiB
JavaScript
147 lines
3.6 KiB
JavaScript
/* 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);
|