| // Test the Error.prototype.stack getter/setter with various "fun" edge cases. |
| |
| load(libdir + "asserts.js"); |
| |
| // Stack should be accessible in subclasses. The accessor should walk up the |
| // prototype chain. |
| assertEq(typeof Object.create(Error()).stack, "string"); |
| assertEq(Object.create(Error.prototype).stack, ""); |
| |
| // Stack should be overridable in subclasses. |
| { |
| let myError = Object.create(Error()); |
| myError.stack = 5; |
| assertEq(myError.stack, 5); |
| |
| let myOtherError = Object.create(Error.prototype); |
| myOtherError.stack = 2; |
| assertEq(myOtherError.stack, 2); |
| } |
| |
| // Should throw when there is no Error in the `this` object's prototype chain. |
| var obj = Object.create(null); |
| var desc = Object.getOwnPropertyDescriptor(Error.prototype, "stack"); |
| Object.defineProperty(obj, "stack", desc); |
| assertThrowsInstanceOf(() => obj.stack, TypeError); |
| |
| // Should throw with non-object `this` values. |
| assertThrowsInstanceOf(desc.set, TypeError); |
| assertThrowsInstanceOf(desc.set.bind("string"), TypeError); |
| assertThrowsInstanceOf(desc.get, TypeError); |
| assertThrowsInstanceOf(desc.get.bind("string"), TypeError); |