assertEq('WeakRef' in this, true); function checkPropertyDescriptor(obj, property, writable, enumerable, configurable) { let desc = Object.getOwnPropertyDescriptor(obj, property); assertEq(typeof desc, "object"); assertEq(desc.writable, writable); assertEq(desc.enumerable, enumerable); assertEq(desc.configurable, configurable); } function assertThrowsTypeError(thunk) { let error; try { thunk(); } catch (e) { error = e; } assertEq(error instanceof TypeError, true); } assertEq(typeof this.WeakRef, "function"); // https://tc39.es/proposal-weakrefs/ // 1.1.1.1 // If NewTarget is undefined, throw a TypeError exception. assertThrowsTypeError(() => new WeakRef()); // 1.1.1.2 // If Type(target) is not Object, throw a TypeError exception. assertThrowsTypeError(() => new WeakRef(1)); assertThrowsTypeError(() => new WeakRef(true)); assertThrowsTypeError(() => new WeakRef("string")); assertThrowsTypeError(() => new WeakRef(Symbol())); assertThrowsTypeError(() => new WeakRef(null)); assertThrowsTypeError(() => new WeakRef(undefined)); new WeakRef({}); // 1.2 // The WeakRef constructor has a [[Prototype]] internal slot whose value is the // intrinsic object %FunctionPrototype%. assertEq(Object.getPrototypeOf(WeakRef), Function.prototype); // 1.2.1 // The initial value of WeakRef.prototype is the intrinsic %WeakRefPrototype% // object. // This property has the attributes { [[Writable]]: false, [[Enumerable]]: false // , [[Configurable]]: false }. checkPropertyDescriptor(WeakRef, 'prototype', false, false, false); // 1.3 // The WeakRef prototype object has a [[Prototype]] internal slot whose value is // the intrinsic object %ObjectPrototype%. let proto = WeakRef.prototype; assertEq(Object.getPrototypeOf(proto), Object.prototype); // 1.3.1 // The initial value of WeakRef.prototype.constructor is the intrinsic object // %WeakRef%. assertEq(proto.constructor, WeakRef); // 1.3.2 // WeakRef.prototype.deref () assertEq(proto.hasOwnProperty('deref'), true); assertEq(typeof proto.deref, 'function'); // 1.3.3 // The initial value of the @@toStringTag property is the String value // "WeakRef". // This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, // [[Configurable]]: true }. assertEq(proto[Symbol.toStringTag], "WeakRef"); checkPropertyDescriptor(proto, Symbol.toStringTag, false, false, true); // 1.4 // WeakRef instances are ordinary objects that inherit properties from the // WeakRef prototype let weakRef = new WeakRef({}); assertEq(Object.getPrototypeOf(weakRef), proto);