/******************************************************************************* * Copyright (c) 2010 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.As3ImportList; import org.axdt.as3.model.As3Namespace; import org.axdt.as3.model.As3Package; import org.axdt.as3.model.As3Program; import org.eclipse.emf.common.util.EList; 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 As3ParserTest extends AbstractXtextTests { @Override protected void setUp() throws Exception { super.setUp(); with(As3StandaloneSetup.class); } public As3ParserTest() { } protected IParseResult parse(String text) { IParser parser = getParser(); return parser.parse(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()); } } private void assertResultType(String input, Class<?> class1) { IParseResult result = parse(input); assertParseResult(result); assertType(class1, result.getRootASTElement()); } private void assertType(Class<?> class1, EObject root) { assertTrue("expected instance of "+ class1.getSimpleName() +" but was "+ root.getClass().getSimpleName(), class1.isInstance(root)); } private void assertResultTypes(String input, Class<?>... classes) { IParseResult result = parse(input); assertParseResult(result); assertType(As3Program.class, result.getRootASTElement()); EList<EObject> root = result.getRootASTElement().eContents(); for (int i = 0; i < root.size(); i++) { if (i >= classes.length) fail("too many elements. next unexpected :"+ root.get(i)); assertTrue("expected "+ classes[i].getSimpleName() +" but was "+ root.get(i).getClass().getSimpleName(), classes[i].isInstance(root.get(i))); } if (root.size() < classes.length) fail("too few elements. next expected: "+ classes[root.size()]); } protected void assertParseError(IParseResult result) { assertNotNull(result); Iterable<INode> errors = result.getSyntaxErrors(); assertEquals("expected errors but has none", true, errors.iterator().hasNext()); } public void testProgram() throws Exception { assertResultType("", As3Program.class); } public void testPackage() throws Exception { Class<?> t = As3Package.class; assertResultTypes("package {}", t); assertResultTypes("package a {}", t); assertResultTypes("package a.b.c {}", t); assertResultTypes("package a.b.c { import a.b.B; class C{}}", t); } public void testNamespace() throws Exception { Class<?> t = As3Namespace.class; assertResultTypes("namespace n;", t); assertResultTypes("namespace n \n ", t); assertResultTypes("namespace n = \"http://an.url/path\";", t); assertResultTypes("namespace n \n = \n m \n ", t); assertResultTypes("namespace \n n \n", t); } public void testImport() throws Exception { Class<?> t = As3ImportList.class; assertResultTypes("import a.b.B;", t); assertResultTypes("import \n a \n . \n b \n . \n B;", t); assertResultTypes("import a.b.B;\nimport a.b.c.*;", t); assertResultTypes("import a.b.B \n\n import a.b.c.*;", t); assertResultTypes("import a.b.B\nimport a.b.c.*\nimport a.b.C\nimport a.B\n", t); } public void testInclude() throws Exception { IParseResult result; result = parse("include 'file';"); assertParseResult(result); result = parse("include 'file'\n"); assertParseResult(result); result = parse("include \n 'file';"); assertParseError(result); } public void testInterface() throws Exception { IParseResult result; result = parse("interface A {}"); assertParseResult(result); result = parse("interface A { function b():void; function c():void; }"); assertParseResult(result); result = parse("interface A { function get b():int; function get c():int; }"); assertParseResult(result); } 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 get:int = 5;"); assertParseResult(result); } public void testFunction() throws Exception { IParseResult result; result = parse("function f():void{}"); assertParseResult(result); result = parse("function get p():A{}"); assertParseResult(result); result = parse("function set p(v:A):void{}"); assertParseResult(result); result = parse("function get(k:B):A{}"); assertParseResult(result); result = parse("function set(k:B,v:A):void{}"); assertParseResult(result); result = parse("override public function f():void{}"); assertParseResult(result); result = parse("function f(...):void{}"); assertParseResult(result); result = parse("function f(...b):void{}"); assertParseResult(result); result = parse("function f(...b:B):void{}"); assertParseResult(result); result = parse("function f(b:B=null):void{}"); assertParseResult(result); result = parse("function f(b:* =null):void{}"); assertParseResult(result); result = parse("function f(b:*=null):void{}"); assertParseResult(result); } public void testClass() throws Exception { IParseResult result; result = parse("class B{}"); assertParseResult(result); result = parse("public dynamic class B{}"); assertParseResult(result); } public void testEmbed() throws Exception { IParseResult result; result = parse("[Embed(source='demo.mpf',mimeType=\"application/octet-stream\")]\nclass B{}"); assertParseResult(result); } public void testConditional() throws Exception { IParseResult result; result = parse("a::b public class B{ }"); assertParseResult(result); result = parse("a::b public interface J{ }"); assertParseResult(result); result = parse("a::b private static var w;"); assertParseResult(result); result = parse("a::b override protected function g():void {}"); assertParseResult(result); } }