| var primitives = [ |
| ["string", 6], |
| [42, undefined], |
| [Symbol("symbol"), undefined], |
| [true, undefined], |
| [false, undefined] |
| ]; |
| |
| for (var [primitive, expected] of primitives) { |
| var ret = Object.getOwnPropertyDescriptor(primitive, 'length'); |
| if (expected === undefined) { |
| if (ret !== expected) |
| throw new Error("bad value for " + String(primitive) + ": " + String(ret)); |
| } else if (ret.value !== expected) |
| throw new Error("bad value for " + String(primitive) + ": " + String(ret)); |
| } |
| |
| function canary() { |
| return { |
| called: false, |
| toString() { |
| this.called = true; |
| throw new Error("out"); |
| } |
| }; |
| } |
| |
| [ |
| [ null, "TypeError: null is not an object (evaluating 'Object.getOwnPropertyDescriptor(value, property)')" ], |
| [ undefined, "TypeError: undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(value, property)')" ] |
| ].forEach(function ([value, message]) { |
| var property = canary(); |
| var error = null; |
| try { |
| Object.getOwnPropertyDescriptor(value, property); |
| } catch (e) { |
| error = e; |
| } |
| if (!error) |
| throw new Error("error not thrown"); |
| if (String(error) !== message) |
| throw new Error("bad error: " + String(error)); |
| }); |