/******************************************************************************* * Copyright (c) 2011 Martin Schnabel <mb0@mb0.org>. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ package org.axdt.as3.parser.antlr; import java.io.StringReader; import java.util.Iterator; import org.axdt.as3.As3StandaloneSetup; import org.axdt.as3.model.As3ExpressionStatement; import org.axdt.as3.model.As3ForInStatement; import org.axdt.as3.model.As3ForStatement; import org.axdt.as3.model.As3IfStatement; import org.axdt.as3.model.As3SwitchStatement; import org.axdt.as3.model.As3TryStatement; import org.axdt.as3.model.As3WhileStatement; import org.axdt.as3.services.As3GrammarAccess; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.junit.AbstractXtextTests; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.nodemodel.SyntaxErrorMessage; import org.eclipse.xtext.parser.IParseResult; import org.eclipse.xtext.parser.IParser; public class As3ParserStatementTest extends AbstractXtextTests { @Override protected void setUp() throws Exception { super.setUp(); with(As3StandaloneSetup.class); } public As3ParserStatementTest() { } protected IParseResult parse(String text) { IParser parser = getParser(); return parser.parse(new StringReader(text)); } protected IParseResult parseStatement(String text) { As3GrammarAccess g = (As3GrammarAccess) getGrammarAccess(); return getParser().parse(g.getIStatementRule(), new StringReader(text)); } protected void assertParseResult(IParseResult result) { assertNotNull(result); Iterator<INode> iter = result.getSyntaxErrors().iterator(); if (iter.hasNext()) { SyntaxErrorMessage first = iter.next().getSyntaxErrorMessage(); fail(first.getMessage() + " "+ first.getIssueCode()); } } protected void assertResultType(IParseResult result, Class<?> class1) { assertNotNull(result); Iterator<INode> iter = result.getSyntaxErrors().iterator(); if (iter.hasNext()) { SyntaxErrorMessage first = iter.next().getSyntaxErrorMessage(); fail(first.getMessage() + " "+ first.getIssueCode()); } EObject root = result.getRootASTElement(); assertTrue("expected instance of "+ class1.getSimpleName() +" but was "+ root.getClass().getSimpleName(), class1.isInstance(root)); } protected void assertResults(Class<?> class1, String... texts) { for (String text:texts) assertResultType(parseStatement(text), class1); } protected void assertParseError(IParseResult result) { assertNotNull(result); Iterable<INode> errors = result.getSyntaxErrors(); assertEquals("expected errors but has none", true, errors.iterator().hasNext()); } public void testVariable() throws Exception { IParseResult result; result = parse("var a:A;"); assertParseResult(result); result = parse("public static var a:A;"); assertParseResult(result); result = parse("var a:int = 5;"); assertParseResult(result); result = parse("var get:int = 5;"); assertParseResult(result); } public void testConditional() throws Exception { IParseResult result; result = parse("a::b { i++; }"); assertParseResult(result); } public void testWhile() throws Exception { assertResults(As3WhileStatement.class, "while(true);", "while(i<10){i+=1;i+=1;}", "while(i<10){if (true) i+=1;}" ); } public void testTry() throws Exception { assertResults(As3TryStatement.class, "try { jump(); } catch (e:E) {}" ); } public void testExpressionStatementList() throws Exception { assertResults(As3ExpressionStatement.class, "true == false, 1 > 0;" ); } public void testSwitchStatement() throws Exception { assertResults(As3SwitchStatement.class, "switch (i) { case 1: i+=1; case 2: i+=1; default: i+=1;}", "switch (i) { case 1: call(); case 2: call(); default: call();}" ); } public void testIfStatement() throws Exception { assertResults(As3IfStatement.class, "if(true)run();else run();", "if(true)run();else if(true)run();", "if(true){run();}else if(true){run();}", "if(true){if(true)run();}else if(true){run();}" ); } public void testForStatement() throws Exception { assertResults(As3ForStatement.class, "for(i=1;i<100;i++)run();", "for(i=1;i<100;i++){}", "for(var i:int = 1;i<100;i++){}" ); } public void testForInStatement() throws Exception { assertResults(As3ForInStatement.class, "for(i in list)run();", "for(var i:* in list){}", "for each(i in list){}" ); } public void testStatements() throws Exception { IParseResult result; result = parse("var i:int\ni++;"); assertParseResult(result); result = parse("1++\n2++\n"); assertParseResult(result); } public void testVector() throws Exception { IParseResult result; result = parse("var v:Vector.<String>;"); assertParseResult(result); result = parse("var v:Vector.<int> = new Vector.<int>();"); assertParseResult(result); result = parse("var friends:Vector.<String> = Vector.<String>(arr);"); assertParseResult(result); result = parse("var friends:Vector.<int> = new <int>[1, 2, 3];"); assertParseResult(result); } }