// 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: calling WeakMap constructor without new is invalid") 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); }