/*
 * <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")));
        
    }
}
