/**********************************************************************
 * This file is part of "Object Teams Development Tooling"-Software
 *
 * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
 * for its Fraunhofer Institute and Computer Architecture and Software
 * Technology (FIRST), Berlin, Germany and Technical University Berlin,
 * Germany.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * $Id$
 *
 * Please visit http://www.eclipse.org/objectteams for updates and contact.
 *
 * Contributors:
 * 	  Fraunhofer FIRST - Initial API and implementation
 * 	  Technical University Berlin - Initial API and implementation
 **********************************************************************/
package org.eclipse.objectteams.otdt.ui.tests.dom.converter;


import junit.framework.Test;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.BaseCallMessageSend;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.TryStatement;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.objectteams.otdt.ui.tests.dom.FileBasedDOMTest;


/**
 * @author mkr
 * @version $Id: BaseCallMessageSendTest.java 12156 2006-05-20 20:19:55 +0000 (Sa, 20 Mai 2006) stephan $
 */
public class BaseCallMessageSendTest2 extends FileBasedDOMTest
{

    public static final String TEST_PROJECT = "DOM_AST";
    private static final int JAVA_LANGUAGE_SPEC_LEVEL = AST.JLS4;

    // Java class used for all within tests
    private TypeDeclaration _role;
    private BaseCallMessageSend _testObj;
    private TypeDeclaration _typeDecl;

    public BaseCallMessageSendTest2(String name)
	{
		super(name);
	}

	public static Test suite()
	{
		return new Suite(BaseCallMessageSendTest2.class);
	}

	public void setUpSuite() throws Exception
	{
		setTestProjectDir(TEST_PROJECT);
		super.setUpSuite();
		ICompilationUnit teamClass = getCompilationUnit(
	                                      getTestProjectDir(),
	                                      "src",
	                                      "basecall2.teampkg",
	                                      "Team1.java");
		ASTParser parser = ASTParser.newParser(JAVA_LANGUAGE_SPEC_LEVEL);
		parser.setProject(getJavaProject(TEST_PROJECT));
		parser.setSource(teamClass);

		ASTNode root = parser.createAST( new NullProgressMonitor() );
        CompilationUnit compUnit = (CompilationUnit) root;
        _typeDecl = (TypeDeclaration)compUnit.types().get(0);
        _role = _typeDecl.getTypes()[0];
	}

	protected void setUp() throws Exception
	{
		super.setUp();
	}

    public void testGetName1()
    {
        MethodDeclaration method = _role.getMethods()[0];
        TryStatement tryStatement = (TryStatement)method.getBody().statements().get(0);
        Block block = tryStatement.getBody();

        ExpressionStatement exprStatement = (ExpressionStatement)block.statements().get(0);

        _testObj = (BaseCallMessageSend)exprStatement.getExpression();

        String actual = _testObj.getName().getIdentifier();

        assertEquals("Base call has wrong name ",
                     "roleMethod0",
                     actual);
    }

    public void testGetName2()
    {
        MethodDeclaration method = _role.getMethods()[1];
        ExpressionStatement exprStatement =
            (ExpressionStatement)method.getBody().statements().get(0);
        _testObj = (BaseCallMessageSend)exprStatement.getExpression();

        String actual = _testObj.getName().getIdentifier();

        assertEquals("Base call has wrong name ",
                     "roleMethod1",
                     actual);
    }
}
