let nextId = 0;

let weakMap;
let savedCallback;

function createWeakMap(callback) {
    weakMap = new WeakMap();
    savedCallback = callback;
}

const tests = [
    // Success
    function() {
        let object = { id: ++nextId };
        console.log(`created object ${object.id}`);
        createWeakMap(() => {});
        weakMap.set(object, object.id);
    },
    // Success
    async function() {
        let object = { id: ++nextId };
        console.log(`created object ${object.id}`);
        createWeakMap(() => {});
        weakMap.set(object, object.id);
        object = undefined;
    },
    // Fails
    async function() {
        let object = { id: ++nextId };
        console.log(`created object ${object.id}`);
        createWeakMap(() => {});
        weakMap.set(object, object.id);
    }
];

(async () => {
    for (const test of tests) {
        await test();
        assertEq(nondeterministicGetWeakMapKeys(weakMap).length, 1);
        gc();
        if (nondeterministicGetWeakMapKeys(weakMap).length !== 0) {
            console.log(`Error: object ${nextId} could not get collected`);
        }
    }
})();