weak-map-constructor.js   [plain text]


// WeakMap constructor behaviors.

if (typeof WeakMap !== 'function')
    throw "Error: bad value" + typeof WeakMap;

function testCallTypeError(item) {
    var error = null;
    try {
        var map = WeakMap(item);
    } catch (e) {
        error = e;
    }
    if (!error)
        throw "Error: error not thrown";
    if (String(error) !== "TypeError: WeakMap cannot be called as a function")
        throw "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, 1],
        [obj2, 2],
        [obj3, 3],
    ],

    [
        [obj1, 1],
        [obj1, 2],
        [obj1, 3],
    ],

    [
        { 0: obj2, 1: 'O' },
        { 0: obj3, 1: 'K' },
        { 0: obj4, 1: 'K' },
    ],

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

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

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

for (var value of pass) {
    var map = new WeakMap(value);
    testCallTypeError(value);
}

function testTypeError(item, message) {
    var error = null;
    try {
        var map = new WeakMap(item);
    } catch (e) {
        error = e;
    }
    if (!error)
        throw "Error: error not thrown";
    if (!message)
        message = "TypeError: Type error";
    if (String(error) !== message)
        throw "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 notContainNextItem = [
    "Cocoa",
    [0, 1, 2, 3, 4],
    [0, 0, 0, 1, 0],
    ["A", "B", "A"],
    new String("cocoa"),
    new String("Cocoa"),
    new Set([0,1,2,3,4]),
    new Set([1,1,1,1]),
];

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

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

    [
        [1, 1],
        [1, 2],
        [1, 3],
    ],

    [
        { 0: 'C', 1: 'O' },
        { 0: 'C', 1: 'K' },
        { 0: 'V', 1: 'K' },
    ],
];

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