| // Any copyright is dedicated to the Public Domain. |
| // http://creativecommons.org/licenses/publicdomain/ |
| |
| load(libdir + "asserts.js") |
| |
| const constructors = [ |
| Int8Array, |
| Uint8Array, |
| Uint8ClampedArray, |
| Int16Array, |
| Uint16Array, |
| Int32Array, |
| Uint32Array, |
| Float32Array, |
| Float64Array |
| ]; |
| |
| for (constructor of constructors) { |
| print("testing non-empty " + constructor.name); |
| let a = new constructor(10); |
| assertEq(Object.isExtensible(a), true); |
| assertEq(Object.isSealed(a), false); |
| assertEq(Object.isFrozen(a), false); |
| |
| // Should not throw. |
| Object.seal(a); |
| |
| // Should complain that it can't change attributes of indexed typed array properties. |
| assertThrowsInstanceOf(() => Object.freeze(a), TypeError); |
| } |
| |
| print(); |
| |
| for (constructor of constructors) { |
| print("testing zero-length " + constructor.name); |
| let a = new constructor(0); |
| assertEq(Object.isExtensible(a), true); |
| assertEq(Object.isSealed(a), false); |
| assertEq(Object.isFrozen(a), false); |
| |
| // Should not throw. |
| Object.seal(a); |
| Object.freeze(a); |
| } |
| |
| // isSealed and isFrozen should not try to build an array of all the |
| // property names of a typed array, since they're often especially large. |
| // This should not throw an allocation error. |
| let a = new Uint8Array(1 << 24); |
| Object.isSealed(a); |
| Object.isFrozen(a); |
| |
| for (constructor of constructors) { |
| print("testing extensibility " + constructor.name); |
| let a = new constructor(10); |
| |
| // New named properties should show up on typed arrays. |
| a.foo = "twelve"; |
| assertEq(a.foo, "twelve"); |
| |
| // New indexed properties should not show up on typed arrays. |
| a[20] = "twelve"; |
| assertEq(a[20], undefined); |
| |
| // Watch for especially large indexed properties. |
| a[-10 >>> 0] = "twelve"; |
| assertEq(a[-10 >>> 0], undefined); |
| |
| // Watch for really large indexed properties too. |
| a[Math.pow(2, 53)] = "twelve"; |
| assertEq(a[Math.pow(2, 53)], undefined); |
| |
| // Don't define old properties. |
| Object.defineProperty(a, 5, {value: 3}); |
| assertEq(a[5], 3); |
| |
| // Don't define new properties. |
| Object.defineProperty(a, 20, {value: 3}); |
| assertEq(a[20], undefined); |
| |
| // Don't delete indexed properties. |
| a[3] = 3; |
| delete a[3]; |
| assertEq(a[3], 3); |
| } |