Skip to content

Commit

Permalink
More tests
Browse files Browse the repository at this point in the history
  • Loading branch information
leobalter committed Jun 3, 2019
1 parent 9b2be0c commit 9d1462e
Show file tree
Hide file tree
Showing 14 changed files with 358 additions and 8 deletions.
2 changes: 1 addition & 1 deletion test/built-ins/WeakRef/constructor.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ description: >

assert.sameValue(
typeof WeakRef, 'function',
'typeof WeakRef is "function"'
'typeof WeakRef is 'function''
);
31 changes: 31 additions & 0 deletions test/built-ins/WeakRef/instance-extensible.js
Original file line number Diff line number Diff line change
@@ -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);
2 changes: 1 addition & 1 deletion test/built-ins/WeakRef/length.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ includes: [propertyHelper.js]
features: [WeakRef]
---*/

verifyProperty(WeakRef, "length", {
verifyProperty(WeakRef, 'length', {
value: 1,
writable: false,
enumerable: false,
Expand Down
4 changes: 2 additions & 2 deletions test/built-ins/WeakRef/name.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
58 changes: 58 additions & 0 deletions test/built-ins/WeakRef/newtarget-prototype-is-not-object.js
Original file line number Diff line number Diff line change
@@ -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');
2 changes: 1 addition & 1 deletion test/built-ins/WeakRef/prop-desc.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ includes: [propertyHelper.js]
features: [WeakRef]
---*/

verifyProperty(this, "WeakRef", {
verifyProperty(this, 'WeakRef', {
enumerable: false,
writable: true,
configurable: true
Expand Down
59 changes: 59 additions & 0 deletions test/built-ins/WeakRef/proto-from-ctor-realm.js
Original file line number Diff line number Diff line change
@@ -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');

42 changes: 42 additions & 0 deletions test/built-ins/WeakRef/prototype-from-newtarget-abrupt.js
Original file line number Diff line number Diff line change
@@ -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);
45 changes: 45 additions & 0 deletions test/built-ins/WeakRef/prototype-from-newtarget-custom.js
Original file line number Diff line number Diff line change
@@ -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');
34 changes: 34 additions & 0 deletions test/built-ins/WeakRef/prototype-from-newtarget.js
Original file line number Diff line number Diff line change
@@ -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);
4 changes: 2 additions & 2 deletions test/built-ins/WeakRef/prototype/Symbol.toStringTag.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 }.
Expand All @@ -16,7 +16,7 @@ features: [WeakRef, Symbol, Symbol.toStringTag]
---*/

verifyProperty(WeakRef.prototype, Symbol.toStringTag, {
value: "WeakRef",
value: 'WeakRef',
writable: false,
enumerable: false,
configurable: true
Expand Down
2 changes: 1 addition & 1 deletion test/built-ins/WeakRef/prototype/prop-desc.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ features: [WeakRef]
includes: [propertyHelper.js]
---*/

verifyProperty(WeakRef, "prototype", {
verifyProperty(WeakRef, 'prototype', {
writable: false,
enumerable: false,
configurable: false
Expand Down
53 changes: 53 additions & 0 deletions test/built-ins/WeakRef/target-not-object-throws.js
Original file line number Diff line number Diff line change
@@ -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');
Loading

0 comments on commit 9d1462e

Please sign in to comment.