--- /dev/null
+// 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);
+}