// Set constructor behaviors. if (typeof Set !== 'function') throw "Error: bad value" + typeof Set; function testCallTypeError(item) { var error = null; try { var set = Set(item); } catch (e) { error = e; } if (!error) throw "Error: error not thrown"; if (String(error) !== "TypeError: calling Set constructor without new is invalid") throw "Error: bad error " + String(error); } var pass = [ [ null, 0 ], [ undefined, 0 ], [ "Cocoa", 4 ], [ [0, 1, 2, 3, 4], 5 ], [ [0, 0, 0, 1, 0], 2 ], [ ["A", "B", "A"], 2 ], [ new String("cocoa"), 3 ], [ new String("Cocoa"), 4 ], [ new Set([0,1,2,3,4]), 5], [ new Set([1,1,1,1]), 1], [ new Map([[1, 2],[1, 2]]), 1], [ new Map([[1, 2],[2, 2]]), 2], ]; for (var pair of pass) { var set = new Set(pair[0]); if (set.size !== pair[1]) throw "Error: bad set size " + set.size; testCallTypeError(pair[0]); } function testTypeError(item) { var error = null; try { var set = new Set(item); } catch (e) { error = e; } if (!error) throw "Error: error not thrown"; if (String(error) !== "TypeError: Type error") 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); }