| function testTypeError(script, message) { |
| var error = null; |
| try { |
| eval(script); |
| } catch (e) { |
| error = e; |
| } |
| if (!error) |
| throw new Error("Expected type error not thrown by `" + script + "`"); |
| |
| if (String(error) !== message) |
| throw new Error("Bad error: " + String(error)); |
| } |
| |
| function testOK(script) { |
| var error = null; |
| try { |
| eval(script); |
| } catch (e) { |
| error = e; |
| } |
| if (error) |
| throw new Error("Bad error: " + String(error)); |
| } |
| |
| testTypeError(`({ } = null)`, "TypeError: Right side of assignment cannot be destructured"); |
| testTypeError(`({ a } = null)`, "TypeError: Right side of assignment cannot be destructured"); |
| testTypeError(`({ a: { b } = null } = { })`, "TypeError: Right side of assignment cannot be destructured"); |
| testTypeError(`({ a: { b } } = { a: null })`, "TypeError: Right side of assignment cannot be destructured"); |
| testTypeError(`({ } = undefined)`, "TypeError: Right side of assignment cannot be destructured"); |
| testTypeError(`({ a } = undefined)`, "TypeError: Right side of assignment cannot be destructured"); |
| testTypeError(`({ a: { b } = undefined } = { })`, "TypeError: Right side of assignment cannot be destructured"); |
| testTypeError(`({ a: { b } } = { a: undefined })`, "TypeError: Right side of assignment cannot be destructured"); |
| |
| testOK(`({ } = 123)`); |
| testOK(`({ a } = 123)`); |
| testOK(`({ a: { b } = 123 } = { })`); |
| testOK(`({ a: { b } } = { a: 123 })`); |
| |
| testOK(`({ } = 0.5)`); |
| testOK(`({ a } = 0.5)`); |
| testOK(`({ a: { b } = 0.5 } = { })`); |
| testOK(`({ a: { b } } = { a: 0.5 })`); |
| |
| testOK(`({ } = NaN)`); |
| testOK(`({ a } = NaN)`); |
| testOK(`({ a: { b } = NaN } = { })`); |
| testOK(`({ a: { b } } = { a: NaN })`); |
| |
| testOK(`({ } = true)`); |
| testOK(`({ a } = true)`); |
| testOK(`({ a: { b } = true } = { })`); |
| testOK(`({ a: { b } } = { a: true })`); |
| |
| testOK(`({ } = {})`); |
| testOK(`({ a } = {})`); |
| testOK(`({ a: { b } = {} } = { })`); |
| testOK(`({ a: { b } } = { a: {} })`); |
| |
| testOK(`({ } = [])`); |
| testOK(`({ a } = [])`); |
| testOK(`({ a: { b } = [] } = { })`); |
| testOK(`({ a: { b } } = { a: [] })`); |
| |
| testOK(`({ } = /1/)`); |
| testOK(`({ a } = /1/)`); |
| testOK(`({ a: { b } = /1/ } = { })`); |
| testOK(`({ a: { b } } = { a: /1/ })`); |
| |
| testOK(`({ } = makeMasquerader())`); |
| testOK(`({ a } = makeMasquerader())`); |
| testOK(`({ a: { b } = makeMasquerader() } = { })`); |
| testOK(`({ a: { b } } = { a: makeMasquerader() })`); |