diff --git a/test/built-ins/WeakRef/constructor.js b/test/built-ins/WeakRef/constructor.js index 3dded764053..ff011555af3 100644 --- a/test/built-ins/WeakRef/constructor.js +++ b/test/built-ins/WeakRef/constructor.js @@ -10,5 +10,5 @@ description: > assert.sameValue( typeof WeakRef, 'function', - 'typeof WeakRef is "function"' + 'typeof WeakRef is 'function'' ); diff --git a/test/built-ins/WeakRef/instance-extensible.js b/test/built-ins/WeakRef/instance-extensible.js new file mode 100644 index 00000000000..d6249e22ee9 --- /dev/null +++ b/test/built-ins/WeakRef/instance-extensible.js @@ -0,0 +1,31 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: Instances of WeakRef are extensible +info: | + WeakRef( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + ObjectCreate ( proto [ , internalSlotsList ] ) + + 4. Set obj.[[Prototype]] to proto. + 5. Set obj.[[Extensible]] to true. + 6. Return obj. +features: [WeakRef, Reflect] +---*/ + +var wr = new WeakRef({}); +assert.sameValue(Object.isExtensible(wr), true); diff --git a/test/built-ins/WeakRef/length.js b/test/built-ins/WeakRef/length.js index 472055c72eb..9ced86beb43 100644 --- a/test/built-ins/WeakRef/length.js +++ b/test/built-ins/WeakRef/length.js @@ -24,7 +24,7 @@ includes: [propertyHelper.js] features: [WeakRef] ---*/ -verifyProperty(WeakRef, "length", { +verifyProperty(WeakRef, 'length', { value: 1, writable: false, enumerable: false, diff --git a/test/built-ins/WeakRef/name.js b/test/built-ins/WeakRef/name.js index f110f3e30a3..d47b73b5df0 100644 --- a/test/built-ins/WeakRef/name.js +++ b/test/built-ins/WeakRef/name.js @@ -23,8 +23,8 @@ includes: [propertyHelper.js] features: [WeakRef] ---*/ -verifyProperty(WeakRef, "name", { - value: "WeakRef", +verifyProperty(WeakRef, 'name', { + value: 'WeakRef', writable: false, enumerable: false, configurable: true diff --git a/test/built-ins/WeakRef/newtarget-prototype-is-not-object.js b/test/built-ins/WeakRef/newtarget-prototype-is-not-object.js new file mode 100644 index 00000000000..d0ce62e86a3 --- /dev/null +++ b/test/built-ins/WeakRef/newtarget-prototype-is-not-object.js @@ -0,0 +1,58 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + [[Prototype]] defaults to %WeakRefPrototype% if NewTarget.prototype is not an object. +info: | + WeakRef( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [WeakRef, Reflect.construct, Symbol] +---*/ + +var WeakRef; +function newTarget() {} + +newTarget.prototype = undefined; +WeakRef = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(WeakRef), WeakRef.prototype, 'newTarget.prototype is undefined'); + +newTarget.prototype = null; +WeakRef = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(WeakRef), WeakRef.prototype, 'newTarget.prototype is null'); + +newTarget.prototype = true; +WeakRef = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(WeakRef), WeakRef.prototype, 'newTarget.prototype is a Boolean'); + +newTarget.prototype = ''; +WeakRef = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(WeakRef), WeakRef.prototype, 'newTarget.prototype is a String'); + +newTarget.prototype = Symbol(); +WeakRef = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(WeakRef), WeakRef.prototype, 'newTarget.prototype is a Symbol'); + +newTarget.prototype = 1; +WeakRef = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(WeakRef), WeakRef.prototype, 'newTarget.prototype is a Number'); diff --git a/test/built-ins/WeakRef/prop-desc.js b/test/built-ins/WeakRef/prop-desc.js index 914d21c71e4..26a9b2933ef 100644 --- a/test/built-ins/WeakRef/prop-desc.js +++ b/test/built-ins/WeakRef/prop-desc.js @@ -15,7 +15,7 @@ includes: [propertyHelper.js] features: [WeakRef] ---*/ -verifyProperty(this, "WeakRef", { +verifyProperty(this, 'WeakRef', { enumerable: false, writable: true, configurable: true diff --git a/test/built-ins/WeakRef/proto-from-ctor-realm.js b/test/built-ins/WeakRef/proto-from-ctor-realm.js new file mode 100644 index 00000000000..4345e095d14 --- /dev/null +++ b/test/built-ins/WeakRef/proto-from-ctor-realm.js @@ -0,0 +1,59 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: Default [[Prototype]] value derived from realm of the newTarget +info: | + WeakRef( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, '%WeakRefPrototype%', « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [WeakRef, cross-realm, Reflect] +---*/ + +var other = $262.createRealm().global; +var newTarget = new other.Function(); +var wr; + +newTarget.prototype = undefined; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is undefined'); + +newTarget.prototype = null; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is null'); + +newTarget.prototype = true; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is a Boolean'); + +newTarget.prototype = ''; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is a String'); + +newTarget.prototype = Symbol(); +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is a Symbol'); + +newTarget.prototype = 1; +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), other.WeakRef.prototype, 'newTarget.prototype is a Number'); + diff --git a/test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js b/test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js new file mode 100644 index 00000000000..952b2afb8cb --- /dev/null +++ b/test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js @@ -0,0 +1,42 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + Return abrupt from getting the NewTarget prototype +info: | + WeakRef ( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). +features: [WeakRef, Reflect.construct] +---*/ + +var calls = 0; +var newTarget = function() {}.bind(null); +Object.defineProperty(newTarget, 'prototype', { + get: function() { + calls += 1; + throw new Test262Error(); + } +}); + +assert.throws(Test262Error, function() { + Reflect.construct(WeakRef, [{}], newTarget); +}); + +assert.sameValue(calls, 1); \ No newline at end of file diff --git a/test/built-ins/WeakRef/prototype-from-newtarget-custom.js b/test/built-ins/WeakRef/prototype-from-newtarget-custom.js new file mode 100644 index 00000000000..104781f5074 --- /dev/null +++ b/test/built-ins/WeakRef/prototype-from-newtarget-custom.js @@ -0,0 +1,45 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + WeakRef ( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [WeakRef, Reflect.construct] +---*/ + +var wr; + +wr = Reflect.construct(WeakRef, [{}], Object); +assert.sameValue(Object.getPrototypeOf(wr), Object.prototype, 'NewTarget is built-in Object constructor'); + +var newTarget = function() {}.bind(null); +Object.defineProperty(newTarget, 'prototype', { + get: function() { + return Array.prototype; + } +}); +wr = Reflect.construct(WeakRef, [{}], newTarget); +assert.sameValue(Object.getPrototypeOf(wr), Array.prototype, 'NewTarget is BoundFunction with accessor'); diff --git a/test/built-ins/WeakRef/prototype-from-newtarget.js b/test/built-ins/WeakRef/prototype-from-newtarget.js new file mode 100644 index 00000000000..e7aa89dba19 --- /dev/null +++ b/test/built-ins/WeakRef/prototype-from-newtarget.js @@ -0,0 +1,34 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + WeakRef ( target ) + + ... + 3. Let weakRef be ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRefPrototype%", « [[Target]] »). + 4. Perfom ! KeepDuringJob(target). + 5. Set weakRef.[[Target]] to target. + 6. Return weakRef. + + OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] ) + + ... + 2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto). + 3. Return ObjectCreate(proto, internalSlotsList). + + GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto ) + + 3. Let proto be ? Get(constructor, 'prototype'). + 4. If Type(proto) is not Object, then + a. Let realm be ? GetFunctionRealm(constructor). + b. Set proto to realm's intrinsic object named intrinsicDefaultProto. + 5. Return proto. +features: [WeakRef] +---*/ + +var wr = new WeakRef({}); +assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype); diff --git a/test/built-ins/WeakRef/prototype/Symbol.toStringTag.js b/test/built-ins/WeakRef/prototype/Symbol.toStringTag.js index a24705f739a..a6d4e11d865 100644 --- a/test/built-ins/WeakRef/prototype/Symbol.toStringTag.js +++ b/test/built-ins/WeakRef/prototype/Symbol.toStringTag.js @@ -7,7 +7,7 @@ description: > `Symbol.toStringTag` property descriptor info: | The initial value of the @@toStringTag property is the String value - "WeakRef". + 'WeakRef'. This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. @@ -16,7 +16,7 @@ features: [WeakRef, Symbol, Symbol.toStringTag] ---*/ verifyProperty(WeakRef.prototype, Symbol.toStringTag, { - value: "WeakRef", + value: 'WeakRef', writable: false, enumerable: false, configurable: true diff --git a/test/built-ins/WeakRef/prototype/prop-desc.js b/test/built-ins/WeakRef/prototype/prop-desc.js index 0a1f185aa73..8f4bacc735a 100644 --- a/test/built-ins/WeakRef/prototype/prop-desc.js +++ b/test/built-ins/WeakRef/prototype/prop-desc.js @@ -11,7 +11,7 @@ features: [WeakRef] includes: [propertyHelper.js] ---*/ -verifyProperty(WeakRef, "prototype", { +verifyProperty(WeakRef, 'prototype', { writable: false, enumerable: false, configurable: false diff --git a/test/built-ins/WeakRef/target-not-object-throws.js b/test/built-ins/WeakRef/target-not-object-throws.js new file mode 100644 index 00000000000..9066effe57e --- /dev/null +++ b/test/built-ins/WeakRef/target-not-object-throws.js @@ -0,0 +1,53 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + Throws a TypeError if target is not Object +info: | + WeakRef ( target ) + + 1. If NewTarget is undefined, throw a TypeError exception. + 2. If Type(target) is not Object, throw a TypeError exception. + ... +features: [WeakRef] +---*/ + +assert.sameValue( + typeof WeakRef, 'function', + 'typeof WeakRef is 'function'' +); + +assert.throws(TypeError, function() { + new WeakRef(); +}, 'implicit undefined'); + +assert.throws(TypeError, function() { + new WeakRef(undefined); +}, 'explicit undefined'); + +assert.throws(TypeError, function() { + new WeakRef(null); +}, 'null'); + +assert.throws(TypeError, function() { + new WeakRef(1); +}, 'number'); + +assert.throws(TypeError, function() { + new WeakRef('Object'); +}, 'string'); + +var s = Symbol(); +assert.throws(TypeError, function() { + new WeakRef(s); +}, 'symbol'); + +assert.throws(TypeError, function() { + new WeakRef(true); +}, 'Boolean, true'); + +assert.throws(TypeError, function() { + new WeakRef(false); +}, 'Boolean, false'); diff --git a/test/built-ins/WeakRef/undefined-newtarget-throws.js b/test/built-ins/WeakRef/undefined-newtarget-throws.js new file mode 100644 index 00000000000..6606e7afb37 --- /dev/null +++ b/test/built-ins/WeakRef/undefined-newtarget-throws.js @@ -0,0 +1,28 @@ +// Copyright (C) 2019 Leo Balter. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-weak-ref-target +description: > + Throws a TypeError if NewTarget is undefined. +info: | + WeakRef ( target ) + + 1. If NewTarget is undefined, throw a TypeError exception. + 2. If Type(target) is not Object, throw a TypeError exception. + ... +features: [WeakRef] +---*/ + +assert.sameValue( + typeof WeakRef, 'function', + 'typeof WeakRef is 'function'' +); + +assert.throws(TypeError, function() { + WeakRef(); +}); + +assert.throws(TypeError, function() { + WeakRef({}); +});