1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 15:57:35 +00:00

LibJS: Implement WeakSet changes from 'Symbol as WeakMap Keys Proposal'

This commit is contained in:
Idan Horowitz 2022-06-22 23:09:31 +03:00
parent a80d3fdf49
commit dbd0110721
5 changed files with 32 additions and 16 deletions

View file

@ -24,7 +24,7 @@ describe("normal behavior", () => {
});
test("constructor with single array argument", () => {
var a = new WeakSet([{ a: 1 }, { a: 2 }, { a: 3 }]);
var a = new WeakSet([{ a: 1 }, { a: 2 }, { a: 3 }, Symbol("foo")]);
expect(a instanceof WeakSet).toBeTrue();
});
});

View file

@ -1,9 +1,10 @@
test("basic functionality", () => {
expect(WeakSet.prototype.add).toHaveLength(1);
const weakSet = new WeakSet([{ a: 1 }, { a: 2 }, { a: 3 }]);
const weakSet = new WeakSet([{ a: 1 }, { a: 2 }, { a: 3 }, Symbol("foo")]);
expect(weakSet.add({ a: 4 })).toBe(weakSet);
expect(weakSet.add({ a: 1 })).toBe(weakSet);
expect(weakSet.add(Symbol("bar"))).toBe(weakSet);
});
test("invalid values", () => {
@ -11,18 +12,28 @@ test("invalid values", () => {
[-100, Infinity, NaN, "hello", 152n].forEach(value => {
expect(() => {
weakSet.add(value);
}).toThrowWithMessage(TypeError, "is not an object");
}).toThrowWithMessage(TypeError, "cannot be held weakly");
});
});
test("automatic removal of garbage-collected values", () => {
const weakSet = new WeakSet();
const item = { a: 1 };
const objectItem = { a: 1 };
expect(weakSet.add(item)).toBe(weakSet);
expect(weakSet.add(objectItem)).toBe(weakSet);
expect(getWeakSetSize(weakSet)).toBe(1);
markAsGarbage("item");
markAsGarbage("objectItem");
gc();
expect(getWeakSetSize(weakSet)).toBe(0);
const symbolItem = Symbol("foo");
expect(weakSet.add(symbolItem)).toBe(weakSet);
expect(getWeakSetSize(weakSet)).toBe(1);
markAsGarbage("symbolItem");
gc();
expect(getWeakSetSize(weakSet)).toBe(0);

View file

@ -1,9 +1,11 @@
test("basic functionality", () => {
expect(WeakSet.prototype.delete).toHaveLength(1);
var original = [{ a: 1 }, { a: 2 }, { a: 3 }];
var original = [{ a: 1 }, { a: 2 }, { a: 3 }, Symbol("foo")];
const weakSet = new WeakSet(original);
expect(weakSet.delete(original[0])).toBeTrue();
expect(weakSet.delete(original[0])).toBeFalse();
expect(weakSet.delete(original[3])).toBeTrue();
expect(weakSet.delete(original[3])).toBeFalse();
expect(weakSet.delete(null)).toBeFalse();
});

View file

@ -3,10 +3,12 @@ test("length is 1", () => {
});
test("basic functionality", () => {
var original = [{ a: 1 }, { a: 2 }, { a: 3 }];
var original = [{ a: 1 }, { a: 2 }, { a: 3 }, Symbol("foo")];
var weakSet = new WeakSet(original);
expect(new WeakSet().has()).toBeFalse();
expect(weakSet.has(original[0])).toBeTrue();
expect(weakSet.has(original[3])).toBeTrue();
expect(weakSet.has({ a: 1 })).toBeFalse();
expect(weakSet.has(Symbol("foo"))).toBeFalse();
});