diff --git a/test/built-ins/AsyncDisposableStack/constructor.js b/test/built-ins/AsyncDisposableStack/constructor.js new file mode 100644 index 0000000000..6e42979676 --- /dev/null +++ b/test/built-ins/AsyncDisposableStack/constructor.js @@ -0,0 +1,15 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-asyncdisposablestack-constructor +description: > + The AsyncDisposableStack constructor is the %AsyncDisposableStack% intrinsic object and the initial + value of the AsyncDisposableStack property of the global object. +features: [explicit-resource-management] +---*/ + +assert.sameValue( + typeof AsyncDisposableStack, 'function', + 'typeof AsyncDisposableStack is function' +); diff --git a/test/built-ins/AsyncDisposableStack/prototype-from-newtarget-abrupt.js b/test/built-ins/AsyncDisposableStack/prototype-from-newtarget-abrupt.js new file mode 100644 index 0000000000..cde6271362 --- /dev/null +++ b/test/built-ins/AsyncDisposableStack/prototype-from-newtarget-abrupt.js @@ -0,0 +1,42 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-asyncdisposablestack +description: > + Return abrupt from getting the NewTarget prototype +info: | + AsyncDisposableStack ( ) + + ... + 2. Let asyncDisposableStack be ? OrdinaryCreateFromConstructor(NewTarget, "%AsyncDisposableStack.prototype%", « [[AsyncDisposableState]], [[DisposeCapability]] »). + 3. Set asyncDisposableStack.[[AsyncDisposableState]] to pending. + 4. Set asyncDisposableStack.[[DisposeCapability]] to NewDisposeCapability(). + 5. Return asyncDisposableStack. + + 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: [explicit-resource-management, 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(AsyncDisposableStack, [], newTarget); +}); + +assert.sameValue(calls, 1); diff --git a/test/built-ins/AsyncDisposableStack/prototype-from-newtarget-custom.js b/test/built-ins/AsyncDisposableStack/prototype-from-newtarget-custom.js new file mode 100644 index 0000000000..95351ba6bc --- /dev/null +++ b/test/built-ins/AsyncDisposableStack/prototype-from-newtarget-custom.js @@ -0,0 +1,45 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-asyncdisposablestack +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + AsyncDisposableStack ( ) + + ... + 2. Let asyncDisposableStack be ? OrdinaryCreateFromConstructor(NewTarget, "%AsyncDisposableStack.prototype%", « [[AsyncDisposableState]], [[DisposeCapability]] »). + 3. Set asyncDisposableStack.[[AsyncDisposableState]] to pending. + 4. Set asyncDisposableStack.[[DisposeCapability]] to NewDisposeCapability(). + 5. Return asyncDisposableStack. + + 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: [explicit-resource-management, Reflect.construct] +---*/ + +var stack; + +stack = Reflect.construct(AsyncDisposableStack, [], Object); +assert.sameValue(Object.getPrototypeOf(stack), Object.prototype, 'NewTarget is built-in Object constructor'); + +var newTarget = function() {}.bind(null); +Object.defineProperty(newTarget, 'prototype', { + get: function() { + return Array.prototype; + } +}); +stack = Reflect.construct(AsyncDisposableStack, [], newTarget); +assert.sameValue(Object.getPrototypeOf(stack), Array.prototype, 'NewTarget is BoundFunction with accessor'); diff --git a/test/built-ins/AsyncDisposableStack/prototype-from-newtarget.js b/test/built-ins/AsyncDisposableStack/prototype-from-newtarget.js new file mode 100644 index 0000000000..47c937f827 --- /dev/null +++ b/test/built-ins/AsyncDisposableStack/prototype-from-newtarget.js @@ -0,0 +1,34 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-asyncdisposablestack +description: > + The [[Prototype]] internal slot is computed from NewTarget. +info: | + AsyncDisposableStack ( ) + + ... + 2. Let asyncDisposableStack be ? OrdinaryCreateFromConstructor(NewTarget, "%AsyncDisposableStack.prototype%", « [[AsyncDisposableState]], [[DisposeCapability]] »). + 3. Set asyncDisposableStack.[[AsyncDisposableState]] to pending. + 4. Set asyncDisposableStack.[[DisposeCapability]] to NewDisposeCapability(). + 5. Return asyncDisposableStack. + + 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: [explicit-resource-management] +---*/ + +var stack = new AsyncDisposableStack(); +assert.sameValue(Object.getPrototypeOf(stack), AsyncDisposableStack.prototype); diff --git a/test/built-ins/AsyncDisposableStack/undefined-newtarget-throws.js b/test/built-ins/AsyncDisposableStack/undefined-newtarget-throws.js new file mode 100644 index 0000000000..e2349c84d9 --- /dev/null +++ b/test/built-ins/AsyncDisposableStack/undefined-newtarget-throws.js @@ -0,0 +1,18 @@ +// Copyright (C) 2023 Ron Buckton. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-asyncdisposablestack +description: > + Throws a TypeError if NewTarget is undefined. +info: | + AsyncDisposableStack ( ) + + 1. If NewTarget is undefined, throw a TypeError exception. + ... +features: [explicit-resource-management] +---*/ + +assert.throws(TypeError, function() { + AsyncDisposableStack(); +});