import unittest import jsparagus.lexer from js_parser.parser import parse_Script, JSParser from js_parser.lexer import JSLexer
class ESTestCase(unittest.TestCase): def parse(self, s): if isinstance(s, list):
f = JSLexer(JSParser()) for chunk in s:
f.write(chunk) return f.close() else: return parse_Script(s)
def assert_parses(self, s):
self.parse(s)
def assert_incomplete(self, s): """Assert that s fails to parse with UnexpectedEndError.
(This should be the case if `s` is a prefix of a valid Script.) """
self.assertRaises(jsparagus.lexer.UnexpectedEndError, lambda: parse_Script(s))
def assert_syntax_error(self, s): """Assert that s fails to parse.""" with self.assertRaises(jsparagus.lexer.SyntaxError):
parse_Script(s)
def assert_can_close_after(self, s):
parser = JSParser()
lexer = JSLexer(parser) if isinstance(s, list): for chunk in s:
lexer.write(chunk) else:
lexer.write(s)
self.assertTrue(lexer.can_close())
def test_asi_at_block_end(self):
self.assert_parses("{ doCrimes() }")
self.assert_parses("function f() { ok }")
def test_asi_after_line_terminator(self):
self.assert_parses('''\
switch (value) {
case 1: break
case 2: console.log('2');
} ''')
self.assert_syntax_error( "switch (value) { case 1: break case 2: console.log('2'); }")
def test_asi_after_no_line_terminator_here(self):
self.assert_parses('''\
function f() { return
x;
} ''')
def test_asi_suppressed(self): # The specification says ASI does not happen in the production # EmptyStatement : `;`.
self.assert_syntax_error("if (true)")
self.assert_syntax_error("{ for (;;) }")
# ASI does not happen in for(;;) loops.
self.assert_syntax_error("for ( \n ; ) {}")
self.assert_syntax_error("for ( ; \n ) {}")
self.assert_syntax_error("for ( \n \n ) {}")
self.assert_syntax_error("for (var i = 0 \n i < 9; i++) {}")
self.assert_syntax_error("for (var i = 0; i < 9 \n i++) {}")
self.assert_syntax_error("for (i = 0 \n i < 9; i++) {}")
self.assert_syntax_error("for (i = 0; i < 9 \n i++) {}")
self.assert_syntax_error("for (let i = 0 \n i < 9; i++) {}")
# ASI is suppressed in the production ClassElement[Yield, Await] : `;` # to prevent an infinite loop of ASI. lol
self.assert_syntax_error("class Fail { \n +1; }")
# method names
self.assert_parses(""" class C { if() {}
function() {}
} """)
self.assert_parses("var let = [new Date];") # let as identifier
self.assert_parses("let v = let;") # let as keyword, then identifier # Next line would fail because the multitoken `let [` lookahead isn't implemented yet. # self.assert_parses("let.length;") # `let .` -> ExpressionStatement
self.assert_syntax_error("let[0].getYear();") # `let [` -> LexicalDeclaration
self.assert_parses("""
var of = [1, 2, 3]; for (of of of) console.log(of); // logs 1, 2, 3 """)
self.assert_parses("var of, let, private, target;")
self.assert_parses("class X { get y() {} }")
self.assert_parses("async: { break async; }")
self.assert_parses("var get = { get get() {}, set get(v) {}, set: 3 };")
self.assert_parses("for (async of => {};;) {}") # self.assert_parses("for (async of []) {}") # would fail
if __name__ == '__main__':
unittest.main()
Messung V0.5
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.