def test18parseIfStatement(self): parser = Parser() parser.src = 'if (1) ; else var a=1;' root = parser.buildAST() self.assertEqual(len(root.statements),1) self.assertEqual(type(root.statements[0]), AST.IfStatement) self.assertEqual(root.statements[0].condition.value, '1') self.assertEqual(type(root.statements[0].thenStatement), AST.EmptyStatement) self.assertEqual(type(root.statements[0].elseStatement), AST.VariableStatement) parser.src = 'if (x==1) {}' root = parser.buildAST() self.assertEqual(len(root.statements),1) self.assertEqual(type(root.statements[0]), AST.IfStatement) self.assertEqual(type(root.statements[0].condition), AST.BinaryExpression) self.assertEqual(root.statements[0].condition.op, '==') self.assertEqual(type(root.statements[0].thenStatement), AST.Block) self.assertEqual(type(root.statements[0].elseStatement), AST.EmptyStatement) parser.src = 'if (x==1) if (y==2) {;} else {;;} else {;;;}' node = parser.buildAST().statements[0] self.assertEqual(type(node.thenStatement), AST.IfStatement) self.assertEqual(len(node.elseStatement.statements), 3) self.assertEqual(len(node.thenStatement.thenStatement.statements), 1) self.assertEqual(len(node.thenStatement.elseStatement.statements), 2)
def test06ParseBlockStatementInFunctionBody(self): parser = Parser() parser.src = 'function a(){ {} }' parser.buildAST() node = parser.ASTRoot.statements[0] self.assertEqual(type(node.statements[0]), AST.Block)
def test01EmptyProgram(self): parser = Parser() parser.src = '' parser.buildAST() self.assertIsNotNone(parser.ASTRoot, 'creation of tree root') self.assertEqual(type(parser.ASTRoot), AST.ProgramNode)
def test02EmptyFunctionDeclaration(self): parser = Parser() parser.src = 'function name1() {}' parser.buildAST() self.assertEqual(len(parser.ASTRoot.statements),1) self.assertEqual(type(parser.ASTRoot.statements[0]), AST.FunctionDeclaration) self.assertEqual(parser.ASTRoot.statements[0].name, 'name1') self.assertEqual(parser.ASTRoot.statements[0].parent, parser.ASTRoot)
def test03ArgumentsFunctionDeclaration(self): parser = Parser() parser.src = 'function asd(aa,a23) {}' parser.buildAST() node = parser.ASTRoot.statements[0] self.assertEqual(len(node.arguments),2) self.assertEqual(node.arguments[0],'aa') self.assertEqual(node.arguments[1],'a23')
def test17parseEmptyExpression(self): parser = Parser() parser.src = ';;' parser.buildAST() self.assertEqual(len(parser.ASTRoot.statements),2) self.assertEqual(type(parser.ASTRoot.statements[0]),AST.EmptyStatement) self.assertEqual(type(parser.ASTRoot.statements[1]),AST.EmptyStatement)
def test04FunctionDeclarationAsBodyOfFunctionDeclaration(self): parser = Parser() parser.src = 'function outer(asd) {\ function tt() {}\ }' parser.buildAST() node = parser.ASTRoot.statements[0] self.assertEqual(len(node.statements),1)
def test07ParseVariableStatement(self): parser = Parser() parser.src = 'var x;' parser.buildAST() node = parser.ASTRoot.statements[0] self.assertEqual(type(node), AST.VariableStatement) self.assertEqual(node.declarations[0].name,'x') parser.src = 'var x=1,b;' parser.buildAST() node = parser.ASTRoot.statements[0] self.assertEqual(type(node), AST.VariableStatement) self.assertEqual(node.declarations[0].initializer.value,'1') self.assertEqual(node.declarations[0].name,'x') self.assertEqual(node.declarations[1].name,'b') self.assertEqual(node.declarations[1].initializer,None)
def test26TryStatement(self): parser = Parser() parser.src = 'try { ; } catch (ff) {}' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.TryStatement) self.assertEqual(len(node.block.statements), 1) self.assertEqual(node.catchClause.id.name, 'ff') self.assertEqual(len(node.catchClause.block.statements), 0) parser.src = 'try { ; } finally {try {} catch (d) {} finally {}}' node = parser.buildAST().statements[0] self.assertEqual(node.catchClause, None) self.assertEqual(type(node.finClause.block.statements[0]), AST.TryStatement)
def test19IterationStatement(self): parser = Parser() parser.src = 'do do ; while (1===1); while (a!=1+2);' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.DoWhileStatement) self.assertEqual(type(node.statement), AST.DoWhileStatement) self.assertEqual(type(node.condition), AST.BinaryExpression) self.assertEqual(node.condition.op, '!=') self.assertEqual(node.statement.condition.op, '===') self.assertEqual(type(node.statement.statement), AST.EmptyStatement) parser.src = 'while (0) {}' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.WhileStatement) self.assertEqual(type(node.statement), AST.Block) self.assertEqual(node.condition.value, '0') parser.src = 'for (a=1;a<12;a()) {}' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.ForStatement) self.assertEqual(type(node.statement), AST.Block) self.assertEqual(type(node.init), AST.AssignmentExpression) self.assertEqual(node.init.left.name, 'a') self.assertEqual(type(node.condition), AST.BinaryExpression) self.assertEqual(node.condition.op, '<') self.assertEqual(type(node.next), AST.Call) self.assertEqual(node.next.expr.name, 'a') parser.src = 'for (var b=1,c=2;a<12;a()) {}' node = parser.buildAST().statements[0] self.assertEqual(type(node.init), AST.Block) self.assertEqual(len(node.init.statements), 2) self.assertEqual(type(node.init.statements[0]), AST.VariableDeclaration) parser.src = 'for (var b=1;a<12;a()) {}' node = parser.buildAST().statements[0] self.assertEqual(type(node.init), AST.VariableDeclaration) self.assertEqual(node.init.name, 'b') parser.src = 'for (var f in asdd) {}' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.ForInStatement) self.assertEqual(node.each.name, 'f') self.assertEqual(node.enumerable.name, 'asdd') parser.src = 'for (x in dsdd) {}' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.ForInStatement) self.assertEqual(node.each.name, 'x') self.assertEqual(node.enumerable.name, 'dsdd')
def test27LabelledStatement(self): parser = Parser() parser.src = 'dd: {}' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.LabelledStatement) self.assertEqual(node.label.name, 'dd') self.assertEqual(type(node.statement), AST.Block)
def test23WithStatement(self): parser = Parser() parser.src = 'with (dd) {}' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.WithStatement) self.assertEqual(node.expr.name,'dd') self.assertEqual(type(node.statement),AST.Block)
def test05ParseProgramAsBlockStatements(self): parser = Parser() parser.src = '{}' parser.buildAST() self.assertEqual(len(parser.ASTRoot.statements),1) node = parser.ASTRoot.statements[0] self.assertEqual(type(node), AST.Block) parser.src = '{}{}' parser.buildAST() self.assertEqual(len(parser.ASTRoot.statements),2) node = parser.ASTRoot.statements[0] self.assertEqual(type(node), AST.Block) node = parser.ASTRoot.statements[1] self.assertEqual(type(node), AST.Block)
def test28ExpressionStatement(self): parser = Parser() parser.src = '123;a+1;x/=4\nrrr' statements = parser.buildAST().statements self.assertEqual(type(statements[0]), AST.ExpressionStatement) self.assertEqual(statements[0].expr.value, '123') self.assertEqual(statements[1].expr.op, '+') self.assertEqual(statements[2].expr.op, '/=') self.assertEqual(statements[3].expr.name, 'rrr')
def test21BreakStatement(self): parser = Parser() parser.src = 'break;' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.BreakStatement) #ASI testing parser.src = 'break\nbreak' statements = parser.buildAST().statements self.assertEqual(len(statements), 2) self.assertEqual(type(statements[0]), AST.BreakStatement) self.assertEqual(type(statements[1]), AST.BreakStatement) parser.src = 'break asd\nbreak ddd;' statements = parser.buildAST().statements self.assertEqual(len(statements),2) self.assertEqual(statements[0].label.name,'asd') self.assertEqual(statements[1].label.name,'ddd')
def test22ReturnStatement(self): parser = Parser() parser.src = 'return;' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.ReturnStatement) #ASI testing parser.src = 'return\nreturn' statements = parser.buildAST().statements self.assertEqual(len(statements), 2) self.assertEqual(type(statements[0]), AST.ReturnStatement) self.assertEqual(type(statements[1]), AST.ReturnStatement) parser.src = 'return 22+1\nreturn asd=3;' statements = parser.buildAST().statements self.assertEqual(len(statements),2) self.assertEqual(statements[0].result.op,'+') self.assertEqual(statements[1].result.left.name,'asd')
def test20ContinueStatement(self): parser = Parser() parser.src = 'continue;' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.ContinueStatement) #ASI testing parser.src = 'continue\ncontinue' statements = parser.buildAST().statements self.assertEqual(len(statements), 2) self.assertEqual(type(statements[0]), AST.ContinueStatement) self.assertEqual(type(statements[1]), AST.ContinueStatement) #ASI testing parser.src = 'continue asd\ncontinue ddd;' statements = parser.buildAST().statements self.assertEqual(len(statements),2) self.assertEqual(statements[0].label.name,'asd') self.assertEqual(statements[1].label.name,'ddd')
def test25ThrowStatement(self): parser = Parser() parser.src = 'throw 123;' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.ThrowStatement) #ASI testing parser.src = 'throw 33\n throw 23' statements = parser.buildAST().statements self.assertEqual(len(statements), 2) self.assertEqual(type(statements[0]), AST.ThrowStatement) self.assertEqual(statements[0].exception.value, '33') self.assertEqual(type(statements[1]), AST.ThrowStatement) self.assertEqual(statements[1].exception.value, '23') parser.src = '{throw 22+1} throw asd=3;' statements = parser.buildAST().statements self.assertEqual(len(statements),2) self.assertEqual(statements[0].statements[0].exception.op,'+') self.assertEqual(statements[1].exception.left.name,'asd')
def test24SwitchStatement(self): parser = Parser() parser.src = 'switch (a) {\ case "aa": {};\n\ ;\n\ default: ;\ }' node = parser.buildAST().statements[0] self.assertEqual(type(node), AST.SwitchStatement) self.assertEqual(node.expr.name, 'a') self.assertEqual(len(node.cases), 2) self.assertEqual(node.cases[0].label.value, 'aa') self.assertEqual(len(node.cases[0].statements), 3) self.assertEqual(type(node.cases[0].statements[0]), AST.Block) self.assertEqual(type(node.cases[0].statements[1]), AST.EmptyStatement) self.assertEqual(node.cases[1].label, None) self.assertEqual(len(node.cases[1].statements), 1) self.assertEqual(type(node.cases[1].statements[0]), AST.EmptyStatement)
from JSParser import Parser import codecs import sys reload(sys) sys.setdefaultencoding('utf-8') __author__ = 'Robur' # file = open('jssrc/script.js') file = codecs.open('jssrc/script.js', 'r') js = file.read() file.close() parser = Parser() parser.src = js tree = parser.buildAST()