/* * <copyright> * * Copyright (c) 2005, 2009 Sven Efftinge 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: * Sven Efftinge - Initial API and implementation * Alexander Shatalin (Borland) - initial API and implementation * * </copyright> */ package org.eclipse.gmf.internal.xpand.codeassist; import java.util.List; import java.util.Stack; import junit.framework.TestCase; import org.eclipse.gmf.internal.xpand.BuiltinMetaModel; import org.eclipse.gmf.internal.xpand.ast.Advice; import org.eclipse.gmf.internal.xpand.editor.Activator; import org.eclipse.gmf.internal.xpand.model.ExecutionContext; public class FastAnalyzerTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); if (Activator.getDefault() == null) { new Activator(); } } public final void testComputeStack1() { final String txt = tag("DEFINE test(String txt) FOR Entity") + tag("FOREACH txt.list AS c") + tag("doStuff"); final Stack<StackElement> s = FastAnalyzer.computeStack(txt); assertEquals(2, s.size()); StackElement se = s.pop(); assertEquals(XpandTokens.FOREACH, se.block); LazyVar v = se.variables.get("c"); assertNotNull(v); assertEquals("txt.list", v.expression); assertEquals("c", v.name); se = s.pop(); assertEquals(XpandTokens.DEFINE, se.block); v = se.variables.get("txt"); assertNotNull(v); assertEquals("String", v.typeName); assertEquals("txt", v.name); v = se.variables.get(ExecutionContext.IMPLICIT_VARIABLE); assertNotNull(v); assertEquals("Entity", v.typeName); assertEquals(ExecutionContext.IMPLICIT_VARIABLE, v.name); } public final void testComputeStackWithIterator() { final String txt = tag("DEFINE test(String txt) FOR Entity") + tag("FOREACH txt.list AS c ITERATOR i") + tag("doStuff"); final Stack<StackElement> s = FastAnalyzer.computeStack(txt); assertEquals(2, s.size()); StackElement se = s.pop(); assertEquals(XpandTokens.FOREACH, se.block); LazyVar v = se.variables.get("c"); assertNotNull(v); assertEquals("txt.list", v.expression); assertEquals("c", v.name); v = se.variables.get("i"); assertNotNull(v); assertEquals("xpand2::Iterator", v.typeName); assertEquals("i", v.name); se = s.pop(); assertEquals(XpandTokens.DEFINE, se.block); v = se.variables.get("txt"); assertNotNull(v); assertEquals("String", v.typeName); assertEquals("txt", v.name); v = se.variables.get(ExecutionContext.IMPLICIT_VARIABLE); assertNotNull(v); assertEquals("Entity", v.typeName); assertEquals(ExecutionContext.IMPLICIT_VARIABLE, v.name); } public final void testComputeStack11() { final String txt = tag("AROUND *test* (String txt) FOR Entity") + tag("FOREACH txt.list AS c") + tag("doStuff"); final Stack<StackElement> s = FastAnalyzer.computeStack(txt); assertEquals(2, s.size()); StackElement se = s.pop(); assertEquals(XpandTokens.FOREACH, se.block); LazyVar v = se.variables.get("c"); assertNotNull(v); assertEquals("txt.list", v.expression); assertEquals("c", v.name); se = s.pop(); assertEquals(XpandTokens.AROUND, se.block); v = se.variables.get("txt"); assertNotNull(v); assertEquals("String", v.typeName); assertEquals("txt", v.name); v = se.variables.get(ExecutionContext.IMPLICIT_VARIABLE); assertNotNull(v); assertEquals("Entity", v.typeName); assertEquals(ExecutionContext.IMPLICIT_VARIABLE, v.name); } public final void testComputeStack12() { final String txt = tag("AROUND *features(*) FOR ecore::EStructuralFeature ") + tag("\n" + "logWarn(targetDef.name+\" FOR \"+targetDef.targetType) ") + tag("\n" + "targ") + tag("doStuff"); final Stack<StackElement> s = FastAnalyzer.computeStack(txt); assertEquals(1, s.size()); final StackElement se = s.pop(); assertEquals(XpandTokens.AROUND, se.block); LazyVar v = se.variables.get(ExecutionContext.IMPLICIT_VARIABLE); assertNotNull(v); assertEquals("ecore::EStructuralFeature", v.typeName); v = se.variables.get(Advice.DEF_VAR_NAME); assertNotNull(v); assertEquals(BuiltinMetaModel.DEFINITION_TYPE.getName(), v.typeName); } public String tag(final String txt) { return XpandTokens.LT + txt + XpandTokens.RT; } public final void testComputeStack2() { final String txt = tag("DEFINE test(String txt, List[oaw::Type] typeList) FOR Entity") + tag("FOREACH txt.list AS c") + tag("c.stuff") + tag("ENDFOREACH") + tag("LET stuff(txt+'holla') AS stuff") + tag("stuff.bla"); final Stack<StackElement> s = FastAnalyzer.computeStack(txt); assertEquals(2, s.size()); StackElement se = s.pop(); assertEquals(XpandTokens.LET, se.block); LazyVar v = se.variables.get("stuff"); assertNotNull(v); assertEquals("stuff(txt+'holla')", v.expression); assertEquals("stuff", v.name); se = s.pop(); assertEquals(XpandTokens.DEFINE, se.block); v = se.variables.get("txt"); assertNotNull(v); assertEquals("String", v.typeName); assertEquals("txt", v.name); v = se.variables.get("typeList"); assertNotNull(v); assertEquals("List[oaw::Type]", v.typeName); assertEquals("typeList", v.name); v = se.variables.get(ExecutionContext.IMPLICIT_VARIABLE); assertNotNull(v); assertEquals("Entity", v.typeName); assertEquals(ExecutionContext.IMPLICIT_VARIABLE, v.name); } public final void testIsInTag() { assertFalse(FastAnalyzer.isInTag("test")); assertFalse(FastAnalyzer.isInTag(XpandTokens.RT + "test")); assertFalse(FastAnalyzer.isInTag(XpandTokens.LT + "test" + XpandTokens.RT)); assertTrue(FastAnalyzer.isInTag(XpandTokens.LT + "test")); assertTrue(FastAnalyzer.isInTag(XpandTokens.LT + "test" + XpandTokens.RT + "test" + XpandTokens.LT)); } public final void testIsInImport() { assertFalse(FastAnalyzer.isInImport(XpandTokens.RT + "IMPORT")); assertFalse(FastAnalyzer.isInImport(XpandTokens.LT + "IMPORT " + XpandTokens.RT)); assertFalse(FastAnalyzer.isInImport("IMPORT")); assertTrue(FastAnalyzer.isInImport(XpandTokens.LT + "IMPORT ")); assertTrue(FastAnalyzer.isInImport(XpandTokens.LT + "IMPORT org::oaw::")); } public final void testIsInExtensionImport() { assertFalse(FastAnalyzer.isInExtensionImport(XpandTokens.RT + "EXTENSION")); assertFalse(FastAnalyzer.isInExtensionImport(XpandTokens.LT + "EXTENSION " + XpandTokens.RT)); assertFalse(FastAnalyzer.isInExtensionImport("EXTENSION")); assertTrue(FastAnalyzer.isInExtensionImport(XpandTokens.LT + "EXTENSION ")); assertTrue(FastAnalyzer.isInExtensionImport(XpandTokens.LT + "EXTENSION org::oaw::")); } public final void testFindImports() { final List<String> imports = FastAnalyzer.findImports(tag("IMPORT 'a1'") + tag("IMPORT 'a::b::c::d::x'")); assertEquals("a1", imports.get(0)); assertEquals("a::b::c::d::x", imports.get(1)); assertEquals(2, imports.size()); } public final void testFindExetnsionImports() { final List<String> imports = FastAnalyzer.findExtensions(tag("EXTENSION a1") + tag("EXTENSION a::b::c::d::x")); assertEquals("a1", imports.get(0)); assertEquals("a::b::c::d::x", imports.get(1)); assertEquals(2, imports.size()); } public final void testIsInTypeDecl() { assertTrue(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test("))); assertTrue(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(Str"))); assertTrue(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String s,"))); assertTrue(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String s,oaw:"))); assertTrue(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String s,String txt,"))); assertTrue(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String s) FOR "))); assertTrue(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String s) FOR oaw"))); // typeSelect is not supported by FastAnalyzer anymore. // assertTrue(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("test.typeSelect("))); // assertTrue(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("test.typeSelect( oaw::"))); assertFalse(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test"))); assertFalse(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String "))); assertFalse(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String s"))); assertFalse(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String s)"))); assertFalse(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String s) FOR"))); assertFalse(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("DEFINE test(String s) FOR Test "))); // typeSelect is not supported by FastAnalyzer anymore. // assertFalse(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("test.typeSelect( oaw "))); // assertFalse(FastAnalyzer.isInTypeDecl(XpandTokens.LT + ("test.typeSelect( oaw)"))); } public final void testIsInExpandStatement() { assertTrue(FastAnalyzer.isInExpand(XpandTokens.LT + ("EXPAND test"))); assertFalse(FastAnalyzer.isInExpand(XpandTokens.LT + ("EXPAND test FOR"))); assertTrue(FastAnalyzer.isInExpand(XpandTokens.LT + ("EXPAND test::Holla::test"))); assertFalse(FastAnalyzer.isInExpand(XpandTokens.LT + ("EXPAND test::Test(s"))); } }