/******************************************************************************* * Copyright (c) 2005, 2007 committers of openArchitectureWare and others. * 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 * * Contributors: * committers of openArchitectureWare - initial API and implementation *******************************************************************************/ package org.eclipse.xtend.parser; import java.util.Collections; import java.util.List; import junit.framework.TestCase; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; import org.eclipse.internal.xtend.expression.ast.BooleanLiteral; import org.eclipse.internal.xtend.expression.ast.DeclaredParameter; import org.eclipse.internal.xtend.xtend.ast.Around; import org.eclipse.internal.xtend.xtend.ast.CreateExtensionStatement; import org.eclipse.internal.xtend.xtend.ast.ExpressionExtensionStatement; import org.eclipse.internal.xtend.xtend.ast.Extension; import org.eclipse.internal.xtend.xtend.ast.ExtensionFile; import org.eclipse.internal.xtend.xtend.ast.ExtensionImportStatement; import org.eclipse.internal.xtend.xtend.ast.JavaExtensionStatement; import org.eclipse.internal.xtend.xtend.ast.NamespaceImportStatement; import org.eclipse.internal.xtend.xtend.parser.XtendLexer; import org.eclipse.internal.xtend.xtend.parser.XtendLocationAddingParser; import org.eclipse.xtend.XtendFacade; public class ExtensionParserTest extends TestCase { private ExtensionFile parse(final String expression) { final XtendLexer scanner = new XtendLexer(new ANTLRStringStream( expression)); final XtendLocationAddingParser parser = new XtendLocationAddingParser( new CommonTokenStream(scanner)); try { return parser.file(); } catch (final Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } public final void testSimple() { final ExtensionFile file = parse("trueFunc() :true;"); assertTrue(file.getNsImports().isEmpty()); assertTrue(file.getExtImports().isEmpty()); assertEquals(1, file.getExtensions().size()); final ExpressionExtensionStatement fd = (ExpressionExtensionStatement) file .getExtensions().get(0); assertEquals("trueFunc", fd.getName()); assertTrue(fd.getFormalParameters().isEmpty()); assertTrue(fd.getExpression() instanceof BooleanLiteral); } public final void testWithImportAndComments() { final ExtensionFile file = parse("// test \n" + "import org::oaw; \n" + "/* \n" + " * Meine Funktion \n" + " */ \n" + "trueFunc() :true; \n"); assertEquals(1, file.getNsImports().size()); final NamespaceImportStatement imp = file.getNsImports().get(0); assertEquals("org::oaw", imp.getImportedId().getValue()); assertTrue(file.getExtImports().isEmpty()); assertEquals(1, file.getExtensions().size()); final ExpressionExtensionStatement fd = (ExpressionExtensionStatement) file .getExtensions().get(0); assertEquals("trueFunc", fd.getName()); assertTrue(fd.getFormalParameters().isEmpty()); assertTrue(fd.getExpression() instanceof BooleanLiteral); } public final void testWithEverything() { final ExtensionFile file = parse("import org::oaw; \n" + "import org::oaw2; \n" + "extension test::TestExtension; \n" + "\n" + "private Void dump(Object obj) :JAVA java.util.String.valueOf(char) ; \n" + "\n" + "/* \n" + " * Meine Funktion \n" + " */ \n" + "trueFunc() :true; \n" + "\n" + "Void dump(String s) : JAVA de.DefaultImpl.doStuff(java.util.Collection,java.util.Set) ; \n"); assertEquals(2, file.getNsImports().size()); final NamespaceImportStatement imp = file.getNsImports().get(1); assertEquals("org::oaw2", imp.getImportedId().getValue()); assertEquals(1, file.getExtImports().size()); final ExtensionImportStatement extImp = file.getExtImports().get(0); assertEquals("test::TestExtension", extImp.getImportedId().getValue()); assertEquals(3, file.getExtensions().size()); final JavaExtensionStatement ext1 = (JavaExtensionStatement) file .getExtensions().get(0); assertNotNull(ext1.getJavaType()); assertEquals("dump", ext1.getName()); assertTrue(ext1.isPrivate()); final DeclaredParameter param = ext1 .getFormalParameters().get(0); assertEquals("obj", param.getName().getValue()); assertEquals("Object", param.getType().getValue()); final ExpressionExtensionStatement fd = (ExpressionExtensionStatement) file .getExtensions().get(1); assertEquals("trueFunc", fd.getName()); assertTrue(fd.getFormalParameters().isEmpty()); assertTrue(fd.getExpression() instanceof BooleanLiteral); } public final void testCreateExtension() { final ExtensionFile file = parse("create List[String] test(String s) : add(s) ;"); final CreateExtensionStatement c = (CreateExtensionStatement) file .getExtensions().get(0); assertNotNull(c); assertEquals("List[String]", c.getReturnTypeIdentifier().getValue()); assertEquals("test", c.getName()); } public final void testCreateExtension2() { XtendFacade f = XtendFacade.create(); f = f .cloneWithExtensions("create List[String] resolveTarget(Object target):" + "List.isInstance(target) ? addAll(target) : add(target);"); assertEquals(Collections.singletonList(null), f.call("resolveTarget", (Object[]) null)); } public void testSortBy() throws Exception { XtendFacade f = XtendFacade.create(); f = f.cloneWithExtensions("stuff():{'C','B','A'}.sortBy(e|e).first();"); assertEquals("A", f.call("stuff", new Object[0])); } public void testAround1() throws Exception { final ExtensionFile file = parse("around test::*(String x, *) : doStuff ;"); Around a = file.getArounds().get(0); assertEquals("test::*", a.getPointCut().getValue()); assertEquals("String", a.getParams().get(0).getType().getValue()); assertEquals("x", a.getParams().get(0).getName().getValue()); assertEquals(true, a.isWildparams()); assertEquals("doStuff", a.getExpression().toString()); } public void testAround2() throws Exception { final ExtensionFile file = parse("around test::Honk() : doStuff ;"); Around a = file.getArounds().get(0); assertEquals("test::Honk", a.getPointCut().getValue()); assertTrue(a.getParams().isEmpty()); assertFalse(a.isWildparams()); assertEquals("doStuff", a.getExpression().toString()); } public void testDoubleSemicolon() throws Exception { try { parse("foo() : 'x';; bar() : 'y';"); fail(); } catch (RuntimeException e) { // expected } } public void testMissingSemicolon() { try { parse("import org::oaw;\nfoo() : true"); fail(); } catch (RuntimeException e) { // Expected } } public void testLocation() throws Exception { final ExtensionFile file = parse("foo() : 1;\n" + "bar() : 2;\n"); List<Extension> extensions = file.getExtensions(); Extension e1 = extensions.get(0); Extension e2 = extensions.get(1); assertNotNull(e1); assertNotNull(e2); assertEquals(0,e1.getStart()); assertEquals(10,e1.getEnd()); assertEquals(11,e2.getStart()); assertEquals(21,e2.getEnd()); } /** * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=345302 */ public void testReal () throws Exception { parse("Real real1(): 0.10;"); // bug#345302 parse("Real real2(): 0.01;"); } }