Add more tests, include deref

This commit is contained in:
Leo Balter 2019-06-07 15:04:51 -04:00 committed by Rick Waldron
parent c2c81409b2
commit ab38ce4e84
8 changed files with 285 additions and 0 deletions

View File

@ -0,0 +1,27 @@
// 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.prototype.deref
description: Return target if weakRef.[[Target]] is not empty (applying custom this)
info: |
WeakRef.prototype.deref ()
1. Let weakRef be the this value.
...
4. Let target be the value of weakRef.[[Target]].
5. If target is not empty,
a. Perform ! KeepDuringJob(target).
b. Return target.
6. Return undefined.
features: [WeakRef]
---*/
var target = {};
var deref = WeakRef.prototype.deref;
var wref = new WeakRef(target);
assert.sameValue(deref.call(wref), target, 'returns target');
assert.sameValue(deref.call(wref), target, '[[Target]] is not emptied #1');
assert.sameValue(deref.call(wref), target, '[[Target]] is not emptied #2');
assert.sameValue(deref.call(wref), target, '[[Target]] is not emptied #3');

View File

@ -0,0 +1,32 @@
// 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.prototype.deref
description: WeakRef.prototype.deref.length property descriptor
info: |
WeakRef.prototype.deref ()
17 ECMAScript Standard Built-in Objects
Every built-in function object, including constructors, has a length
property whose value is an integer. Unless otherwise specified, this
value is equal to the largest number of named arguments shown in the
subclause headings for the function description. Optional parameters
(which are indicated with brackets: [ ]) or rest parameters (which
are shown using the form «...name») are not included in the default
argument count.
Unless otherwise specified, the length property of a built-in
function object has the attributes { [[Writable]]: false,
[[Enumerable]]: false, [[Configurable]]: true }.
includes: [propertyHelper.js]
features: [WeakRef]
---*/
verifyProperty(WeakRef.prototype.deref, 'length', {
value: 0,
writable: false,
enumerable: false,
configurable: true
});

View File

@ -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.prototype.deref
description: WeakRef.prototype.deref.name property descriptor
info: |
WeakRef.prototype.deref.name value and property descriptor
17 ECMAScript Standard Built-in Objects
Every built-in function object, including constructors, that is not
identified as an anonymous function has a name property whose value
is a String. Unless otherwise specified, this value is the name that
is given to the function in this specification. For functions that
are specified as properties of objects, the name value is the
property name string used to access the function. [...]
Unless otherwise specified, the name property of a built-in function
object, if it exists, has the attributes { [[Writable]]: false,
[[Enumerable]]: false, [[Configurable]]: true }.
includes: [propertyHelper.js]
features: [WeakRef]
---*/
verifyProperty(WeakRef.prototype.deref, 'name', {
value: 'deref',
writable: false,
enumerable: false,
configurable: true
});

View File

@ -0,0 +1,24 @@
// 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.prototype.deref
description: >
Property descriptor of WeakRef.prototype.deref
info: |
17 ECMAScript Standard Built-in Objects:
Every other data property described in clauses 18 through 26 and in Annex B.2
has the attributes { [[Writable]]: true, [[Enumerable]]: false,
[[Configurable]]: true } unless otherwise specified.
includes: [propertyHelper.js]
features: [WeakRef]
---*/
assert.sameValue(typeof WeakRef.prototype.deref, 'function');
verifyProperty(WeakRef.prototype, 'deref', {
enumerable: false,
writable: true,
configurable: true
});

View File

@ -0,0 +1,25 @@
// 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.prototype.deref
description: Return target if weakRef.[[Target]] is not empty
info: |
WeakRef.prototype.deref ()
...
4. Let target be the value of weakRef.[[Target]].
5. If target is not empty,
a. Perform ! KeepDuringJob(target).
b. Return target.
6. Return undefined.
features: [WeakRef]
---*/
var target = {};
var wref = new WeakRef(target);
assert.sameValue(wref.deref(), target, 'returns target');
assert.sameValue(wref.deref(), target, '[[Target]] is not emptied #1');
assert.sameValue(wref.deref(), target, '[[Target]] is not emptied #2');
assert.sameValue(wref.deref(), target, '[[Target]] is not emptied #3');

View File

@ -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.prototype.deref
description: Throws a TypeError if this does not have a [[Target]] internal slot
info: |
WeakRef.prototype.deref ()
1. Let weakRef be the this value.
2. If Type(weakRef) is not Object, throw a TypeError exception.
3. If weakRef does not have a [[Target]] internal slot, throw a TypeError exception.
4. Let target be the value of weakRef.[[Target]].
5. If target is not empty,
a. Perform ! KeepDuringJob(target).
b. Return target.
6. Return undefined.
features: [WeakRef]
---*/
assert.sameValue(typeof WeakRef.prototype.deref, 'function');
var defer = WeakRef.prototype.defer;
assert.throws(TypeError, function() {
defer.call({ ['[[Target]]']: {} });
}, 'Ordinary object without [[Target]]');
assert.throws(TypeError, function() {
defer.call(WeakRef.prototype);
}, 'WeakRef.prototype does not have a [[Target]] internal slot');
assert.throws(TypeError, function() {
defer.call(WeakRef);
}, 'WeakRef does not have a [[Target]] internal slot');
var wm = new WeakMap();
assert.throws(TypeError, function() {
defer.call(wm);
}, 'WeakMap instance');
var ws = new WeakSet();
assert.throws(TypeError, function() {
defer.call(ws);
}, 'WeakSet instance');

View File

@ -0,0 +1,52 @@
// 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.prototype.deref
description: Throws a TypeError if this is not an Object
info: |
WeakRef.prototype.deref ()
1. Let weakRef be the this value.
2. If Type(weakRef) is not Object, throw a TypeError exception.
3. If weakRef does not have a [[Target]] internal slot, throw a TypeError exception.
4. Let target be the value of weakRef.[[Target]].
5. If target is not empty,
a. Perform ! KeepDuringJob(target).
b. Return target.
6. Return undefined.
features: [WeakRef]
---*/
assert.sameValue(typeof WeakRef.prototype.deref, 'function');
var defer = WeakRef.prototype.defer;
assert.throws(TypeError, function() {
defer.call(undefined);
}, 'undefined');
assert.throws(TypeError, function() {
defer.call(null);
}, 'null');
assert.throws(TypeError, function() {
defer.call(true);
}, 'true');
assert.throws(TypeError, function() {
defer.call(false);
}, 'false');
assert.throws(TypeError, function() {
defer.call(1);
}, 'number');
assert.throws(TypeError, function() {
defer.call('object');
}, 'string');
var s = Symbol();
assert.throws(TypeError, function() {
defer.call(s);
}, 'symbol');

View File

@ -0,0 +1,49 @@
// 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: >
Returns a new ordinary object from the WeakRef constructor
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 target = {};
var wr = new WeakRef(target);
assert.notSameValue(wr, target, 'does not return the same object');
assert.sameValue(wr instanceof WeakRef, true, 'instanceof');
for (let key of Object.getOwnPropertyNames(wr)) {
assert(false, `should not set any own named properties: ${key}`);
}
for (let key of Object.getOwnPropertySymbols(wr)) {
assert(false, `should not set any own symbol properties: ${String(key)}`);
}
assert.sameValue(Object.getPrototypeOf(wr), WeakRef.prototype);