weak-set-constructor.js   [plain text]


// WeakSet constructor behaviors.

if (typeof WeakSet !== 'function')
    throw new Error("bad value" + typeof WeakSet);

function testCallTypeError(item) {
    var error = null;
    try {
        var set = WeakSet(item);
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error("error not thrown");
    if (String(error) !== "TypeError: WeakSet cannot be called as a function")
        throw new Error("bad error " + String(error));
}
var obj1 = {};
var obj2 = [];
var obj3 = new Date();
var obj4 = new Error();

var pass = [
    null,
    undefined,
    [],
    new Set(),
    new Map(),
    "",

    [
        obj1,
        obj2,
        obj3,
    ],

    [
        obj1,
        obj1,
        obj1,
    ],

    [
        obj2,
        obj3,
        obj4,
    ],

    new Map([
        [obj1, 1],
        [obj2, 2],
        [obj3, 3],
    ]),

    new Map([
        [obj1, 1],
        [obj1, 2],
        [obj1, 3],
    ]),

    new Set([
        obj1,
        obj2,
        obj3,
    ]),

    new Set([
        obj1,
        obj1,
        obj1,
    ]),

    new Map([
        { 0: obj2, 1: 'O' },
        { 0: obj3, 1: 'K' },
        { 0: obj4, 1: 'K' },
    ]),

    new Set([
        obj2,
        obj3,
        obj4,
    ])
];

for (var value of pass) {
    var set = new WeakSet(value);
    testCallTypeError(value);
}

function testTypeError(item, message) {
    var error = null;
    try {
        var set = new WeakSet(item);
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error("error not thrown");
    if (!message)
        message = "TypeError: Type error";
    if (String(error) !== message)
        throw new Error("bad error " + String(error));
}

var nonIterable = [
    42,
    Symbol("Cappuccino"),
    true,
    false,
    {},
    new Date(),
    new Error(),
    Object(Symbol("Matcha")),
    (function () { }),
];

for (var item of nonIterable) {
    testTypeError(item);
    testCallTypeError(item);
}

var nonObjectKeys = [
    [
        0,
        1,
        1,
    ],

    [
        1,
        1,
        1,
    ],

    [
        'C',
        'C',
        'V',
    ],
];

for (var item of nonObjectKeys) {
    testTypeError(item, 'TypeError: Attempted to add a non-object key to a WeakSet');
    testCallTypeError(item);
}