function shouldNotThrow(script) { eval(script); } function shouldThrowSyntaxError(script) { let error; try { eval(script); } catch (e) { error = e; } if (!(error instanceof SyntaxError)) throw new Error('Expected SyntaxError!'); } shouldThrowSyntaxError('{ var x; let x; }'); shouldThrowSyntaxError('{ { var x; } let x; }'); shouldThrowSyntaxError('{ { { var x; } } let x; }'); shouldThrowSyntaxError('{ let x; var x; }'); shouldThrowSyntaxError('{ let x; { var x; } }'); shouldThrowSyntaxError('{ let x; { { var x; } } }'); shouldNotThrow('{ var x; { let x; } }'); shouldNotThrow('{ var x; { { let x; } } }'); shouldNotThrow('{ { let x; } var x; }'); shouldNotThrow('{ { { let x; } } var x; }'); shouldThrowSyntaxError('{ var x; const x = 0; }'); shouldThrowSyntaxError('{ { var x; } const x = 0; }'); shouldThrowSyntaxError('{ { { var x; } } const x = 0; }'); shouldThrowSyntaxError('{ const x = 0; var x; }'); shouldThrowSyntaxError('{ const x = 0; { var x; } }'); shouldThrowSyntaxError('{ const x = 0; { { var x; } } }'); shouldNotThrow('{ var x; { const x = 0; } }'); shouldNotThrow('{ var x; { { const x = 0; } } }'); shouldNotThrow('{ { const x = 0; } var x; }'); shouldNotThrow('{ { { const x = 0; } } var x; }');