test("constructor properties", () => {
    expect(WeakMap).toHaveLength(0);
    expect(WeakMap.name).toBe("WeakMap");
});

describe("errors", () => {
    test("invalid array iterators", () => {
        [-100, Infinity, NaN, {}, 152n].forEach(value => {
            expect(() => {
                new WeakMap(value);
            }).toThrowWithMessage(TypeError, "is not iterable");
        });
    });
    test("called without new", () => {
        expect(() => {
            WeakMap();
        }).toThrowWithMessage(TypeError, "WeakMap constructor must be called with 'new'");
    });
});

describe("normal behavior", () => {
    test("typeof", () => {
        expect(typeof new WeakMap()).toBe("object");
    });

    test("constructor with single array of entries argument", () => {
        var a = new WeakMap([
            [{ a: 1 }, 1],
            [{ a: 2 }, 2],
            [{ a: 3 }, 3],
        ]);
        expect(a instanceof WeakMap).toBeTrue();
    });
});

describe("regressions", () => {
    test("missing key/value properties on iterable entry", () => {
        expect(() => {
            new WeakMap([{}]);
        }).toThrowWithMessage(TypeError, "undefined cannot be held weakly");
    });
});