blob: f38724875d5ace391489e3c5acacf011ff68c142 [file] [log] [blame]
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/ */
// Reflect.isExtensible behaves just like Object.extensible except when the
// target argument is missing or is not an object (and that behavior is tested
// in target.js).
// Test basic functionality.
var someObjects = [
{},
{a: "a"},
[0, 1],
new Uint8Array(64),
Object(Symbol("table")),
new Proxy({}, {})
];
if (typeof SharedArrayBuffer != "undefined")
someObjects.push(new Uint8Array(new SharedArrayBuffer(64)));
for (var obj of someObjects) {
assertEq(Reflect.isExtensible(obj), true);
assertEq(Reflect.preventExtensions(obj), true);
assertEq(Reflect.isExtensible(obj), false);
}
// Array with nonwritable length.
var arr = [0, 1, 2, 3];
Object.defineProperty(arr, "length", {writable: false});
assertEq(Reflect.isExtensible(arr), true);
// Proxy case.
for (var ext of [true, false]) {
var obj = {};
if (!ext)
Object.preventExtensions(obj);
var proxy = new Proxy(obj, {
isExtensible() { return ext; }
});
assertEq(Reflect.isExtensible(proxy), ext);
}
// If a Proxy's isExtensible method throws, the exception is propagated.
proxy = new Proxy({}, {
isExtensible() { throw "oops"; }
});
assertThrowsValue(() => Reflect.isExtensible(proxy), "oops");
// If an invariant is broken, [[IsExtensible]] does not return false. It throws
// a TypeError.
proxy = new Proxy({}, {
isExtensible() { return false; }
});
assertThrowsInstanceOf(() => Reflect.isExtensible(proxy), TypeError);
// For more Reflect.isExtensible tests, see target.js.
reportCompare(0, 0);