96 lines
2.1 KiB
JavaScript
96 lines
2.1 KiB
JavaScript
let holdings1 = [];
|
|
let holdings2 = [];
|
|
let holdings3 = [];
|
|
let holdings4 = [];
|
|
let holdings5 = [];
|
|
|
|
onmessage = (event) => {
|
|
switch (event.data) {
|
|
case 'startTest':
|
|
startTest();
|
|
break;
|
|
case 'checkResults':
|
|
checkResults();
|
|
break;
|
|
default:
|
|
throw "Unknown message";
|
|
}
|
|
};
|
|
|
|
function startTest() {
|
|
// Registry with no registered objects.
|
|
let registry1 = new FinalizationRegistry(v => { holdings1.push(v); });
|
|
|
|
// Registry with three registered objects.
|
|
let registry2 = new FinalizationRegistry(v => { holdings2.push(v); });
|
|
registry2.register({}, 1);
|
|
registry2.register({}, 2);
|
|
registry2.register({}, 3);
|
|
|
|
// Registry with registered object that is then unregistered.
|
|
let registry3 = new FinalizationRegistry(v => { holdings3.push(v); });
|
|
let token3 = {}
|
|
registry3.register({}, 1, token3);
|
|
registry3.unregister(token3);
|
|
|
|
// Registry with registered object that doesn't die.
|
|
let registry4 = new FinalizationRegistry(v => { holdings4.push(v); });
|
|
let object4 = {};
|
|
registry4.register(object4, 1);
|
|
|
|
// Registry observing cyclic JS data structure.
|
|
let registry5 = new FinalizationRegistry(v => { holdings5.push(v); });
|
|
registry5.register(makeJSCycle(4), 5);
|
|
|
|
const { gc } = getJSTestingFunctions();
|
|
gc();
|
|
|
|
Promise.resolve().then(() => {
|
|
checkNoCallbacks();
|
|
});
|
|
|
|
postMessage('started');
|
|
}
|
|
|
|
function checkNoCallbacks() {
|
|
is(holdings1.length, 0);
|
|
is(holdings2.length, 0);
|
|
is(holdings3.length, 0);
|
|
is(holdings4.length, 0);
|
|
is(holdings5.length, 0);
|
|
}
|
|
|
|
function checkResults() {
|
|
is(holdings1.length, 0);
|
|
|
|
let result = holdings2.sort((a, b) => a - b);
|
|
is(result.length, 3);
|
|
is(result[0], 1);
|
|
is(result[1], 2);
|
|
is(result[2], 3);
|
|
|
|
is(holdings3.length, 0);
|
|
is(holdings4.length, 0);
|
|
|
|
is(holdings5.length, 1);
|
|
is(holdings5[0], 5);
|
|
|
|
postMessage('passed');
|
|
}
|
|
|
|
function is(a, b) {
|
|
if (a !== b) {
|
|
throw `Expected ${b} but got ${a}`;
|
|
}
|
|
}
|
|
|
|
function makeJSCycle(size) {
|
|
let first = {};
|
|
let current = first;
|
|
for (let i = 0; i < size; i++) {
|
|
current.next = {};
|
|
current = current.next;
|
|
}
|
|
current.next = first;
|
|
return first;
|
|
}
|