| |
| function testSyntax(script) { |
| try { |
| eval(script); |
| } catch (error) { |
| if (error instanceof SyntaxError) |
| throw new Error("Bad error: " + String(error)); |
| } |
| } |
| |
| function testSyntaxError(script, message) { |
| var error = null; |
| try { |
| eval(script); |
| } catch (e) { |
| error = e; |
| } |
| if (!error) |
| throw new Error("Expected syntax error not thrown"); |
| |
| if (String(error) !== message) |
| throw new Error("Bad error: " + String(error)); |
| } |
| |
| testSyntax("({ a: this.a } = {})"); |
| testSyntax("({ a: this['a'] } = {})"); |
| testSyntax("({ a: this[\"a\"] } = {})"); |
| testSyntax("[this.a ] = []"); |
| testSyntax("[this['a']] = []"); |
| testSyntax("[this[0]] = []"); |
| testSyntax("[...this[0]] = []"); |
| testSyntax("[...[function f() {}.prop]] = []"); |
| testSyntax("[...[{prop: 1}.prop]] = []"); |
| testSyntax("[...[this[0], ...this[1]]] = []"); |
| testSyntax("({ a: obj.a } = {})"); |
| testSyntax("({ a: obj['a'] } = {})"); |
| testSyntax("({ a: obj[\"a\"] } = {})"); |
| testSyntax("({ a: function() {}['prop'] } = {})"); |
| testSyntax("({ a: {prop: 1}.prop } = {})"); |
| testSyntax("[obj.a ] = []"); |
| testSyntax("[obj['a']] = []"); |
| testSyntax("[obj[0]] = []"); |
| testSyntax("[function(){}.prop] = []"); |
| testSyntax("[{prop: 1}.prop] = []"); |
| |
| |
| testSyntaxError("[...c = 1] = []", "SyntaxError: Unexpected token '='. Expected a closing ']' following a rest element destructuring pattern."); |
| testSyntaxError("[...c, d] = []", "SyntaxError: Unexpected token ','. Expected a closing ']' following a rest element destructuring pattern."); |
| testSyntaxError("[this] = []", "SyntaxError: Invalid destructuring assignment target."); |
| testSyntaxError("[th\\u{69}s] = []", "SyntaxError: Unexpected escaped characters in keyword token: 'th\\u{69}s'"); |
| testSyntaxError("[function() {}] = []", "SyntaxError: Invalid destructuring assignment target."); |
| testSyntaxError("['string'] = []", "SyntaxError: Invalid destructuring assignment target."); |
| testSyntaxError("[123] = []", "SyntaxError: Invalid destructuring assignment target."); |
| testSyntaxError("[true] = []", "SyntaxError: Invalid destructuring assignment target."); |
| testSyntaxError("[tru\\u0065] = []", "SyntaxError: Unexpected escaped characters in keyword token: 'tru\\u0065'"); |
| testSyntaxError("[false] = []", "SyntaxError: Invalid destructuring assignment target."); |
| testSyntaxError("[f\\u0061lse] = []", "SyntaxError: Unexpected escaped characters in keyword token: 'f\\u0061lse'"); |
| testSyntaxError("[null] = []", "SyntaxError: Invalid destructuring assignment target."); |
| testSyntaxError("[n\\u{75}ll] = []", "SyntaxError: Unexpected escaped characters in keyword token: 'n\\u{75}ll'"); |
| |
| testSyntaxError("'use strict'; ({ eval } = {})", "SyntaxError: Cannot modify 'eval' in strict mode."); |
| testSyntaxError("'use strict'; ({ eval = 0 } = {})", "SyntaxError: Cannot modify 'eval' in strict mode."); |
| testSyntaxError("'use strict'; ({ a: eval } = {})", "SyntaxError: Cannot modify 'eval' in strict mode."); |
| testSyntaxError("'use strict'; ({ a: eval = 0 } = {})", "SyntaxError: Cannot modify 'eval' in strict mode."); |
| testSyntaxError("'use strict'; ({ arguments } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode."); |
| testSyntaxError("'use strict'; ({ arguments = 0 } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode."); |
| testSyntaxError("'use strict'; ({ a: arguments } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode."); |
| testSyntaxError("'use strict'; ({ a: arguments = 0 } = {})", "SyntaxError: Cannot modify 'arguments' in strict mode."); |
| testSyntaxError("'use strict'; ([ eval ] = [])", "SyntaxError: Cannot modify 'eval' in strict mode."); |
| testSyntaxError("'use strict'; ([ eval = 0 ] = [])", "SyntaxError: Cannot modify 'eval' in strict mode."); |
| testSyntaxError("'use strict'; ([ arguments ] = [])", "SyntaxError: Cannot modify 'arguments' in strict mode."); |
| testSyntaxError("'use strict'; ([ arguments = 0 ] = [])", "SyntaxError: Cannot modify 'arguments' in strict mode."); |