org.eclipse.objectteams.otdt.ui.tests.dom.converter.WithinStatementTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.objectteams.otdt.ui.tests.dom.converter.WithinStatementTest.java

Source

/**********************************************************************
 * 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.
 * 
 * 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
 * $Id: WithinStatementTest.java 23496 2010-02-05 23:20:15Z stephan $
 * 
 * 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 java.util.List;

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.ASTMatcher;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.Statement;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.WithinStatement;
import org.eclipse.objectteams.otdt.ui.tests.dom.FileBasedDOMTest;

/**
 * @author mkr
 * @version $Id: WithinStatementTest.java 23496 2010-02-05 23:20:15Z stephan $
 */
public class WithinStatementTest extends FileBasedDOMTest {
    public static final String TEST_PROJECT = "DOM_AST";
    private static final int JAVA_LANGUAGE_SPEC_LEVEL = AST.JLS4;

    private ASTParser _parser;
    private ICompilationUnit _simpleClass;
    /** Java class used for all within tests */
    private TypeDeclaration _typeDecl;
    private WithinStatement _testObj;

    public WithinStatementTest(String name) {
        super(name);
    }

    public static Test suite() {
        return new Suite(WithinStatementTest.class);
    }

    public void setUpSuite() throws Exception {
        setTestProjectDir(TEST_PROJECT);
        super.setUpSuite();
        _simpleClass = getCompilationUnit(getTestProjectDir(), "src", "withinstatement.basepkg", "MyClass.java");

        _parser = ASTParser.newParser(JAVA_LANGUAGE_SPEC_LEVEL);
        _parser.setProject(getJavaProject(TEST_PROJECT));
        _parser.setSource(_simpleClass);

        ASTNode root = _parser.createAST(new NullProgressMonitor());
        CompilationUnit compUnit = (CompilationUnit) root;
        _typeDecl = (TypeDeclaration) compUnit.types().get(0);
    }

    protected void setUp() throws Exception {
        super.setUp();
    }

    public void testInstanceType() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinSimple");
        List statements = methodDecl.getBody().statements();

        Statement testObj = (Statement) statements.get(0);
        assertTrue("Statement is not an instance of WithinStatement", testObj instanceof WithinStatement);
    }

    public void testGetNodeType() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinSimple");
        List statements = methodDecl.getBody().statements();

        _testObj = (WithinStatement) statements.get(0);

        assertEquals("WithinStatement has wrong NodeType", ASTNode.WITHIN_STATEMENT, _testObj.getNodeType());
    }

    public void testGetBody_Empty() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl,
                "withinSimpleEmptyBody");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;

        assertTrue("withing: body block is not empty", ((Block) _testObj.getBody()).statements().isEmpty());
    }

    public void testGetBody_NotEmpty() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinSimple");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;

        assertEquals("within: body block is empty", 1, ((Block) _testObj.getBody()).statements().size());
    }

    public void testBody_ParentIdentity() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinSimple");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;
        Block body = (Block) _testObj.getBody();
        ASTNode bodyParent = body.getParent();

        assertTrue("within: ", _testObj == bodyParent);

    }

    /** Tests if body belong to the same AST as the within statement */
    public void testBody_ASTIdentity() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinSimple");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;
        Block body = (Block) _testObj.getBody();

        assertTrue("within: body (Block) doesn't belong to AST", _testObj.getAST() == body.getAST());
    }

    /** Tests if statements in body belong to the same AST as the within statement */
    public void testStatements_ASTIdentity() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinSimple");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;
        Block body = (Block) _testObj.getBody();
        Statement bodyStatement = (Statement) body.statements().get(0);

        assertTrue("within: statements don't belong to AST", _testObj.getAST() == bodyStatement.getAST());
    }

    /** Tests if team expression belongs to the same AST as the within statement */
    public void testTeamExpression_ASTIdentity() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinSimple");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;

        assertTrue("within: team expression doesn't belong to AST",
                _testObj.getAST() == _testObj.getTeamExpression().getAST());
    }

    public void testGetTeamExpression1_InstanceType() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinNewTeam");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;

        assertTrue("within: Team expression is not a ClassInstanceCreation",
                _testObj.getTeamExpression() instanceof ClassInstanceCreation);
    }

    public void testGetTeamExpression2_InstanceType() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinSimple");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;

        assertTrue("within: Team expression is not a SimpleName",
                _testObj.getTeamExpression() instanceof SimpleName);
    }

    public void testGetTeamExpression3_InstanceType() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinViaMethod");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;

        assertTrue("within: Team expression is not a SimpleName",
                _testObj.getTeamExpression() instanceof MethodInvocation);
    }

    public void testGetTeamExpression_Parent() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinNewTeam");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;
        ASTNode teamExpressionParent = _testObj.getTeamExpression().getParent();

        assertTrue("within: Team expression is not a SimpleName", _testObj == teamExpressionParent);
    }

    public void testGetTeamExpression_Identifier1() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinNewTeam");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;
        ClassInstanceCreation teamExpression = (ClassInstanceCreation) _testObj.getTeamExpression();

        assertEquals("within: Team expression is not a SimpleName", "new Team1()", teamExpression.toString());
    }

    public void testGetTeamExpression_Identifier2() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinSimple");
        List statements = methodDecl.getBody().statements();
        Statement firstStatement = (Statement) statements.get(0);

        _testObj = (WithinStatement) firstStatement;
        SimpleName teamExpression = (SimpleName) _testObj.getTeamExpression();

        assertEquals("within: Team expression is not a SimpleName", "myTeam", teamExpression.toString());
    }

    public void testToString() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinNewTeam");
        List statements = methodDecl.getBody().statements();
        _testObj = (WithinStatement) statements.get(0);

        String actual = _testObj.toString();
        String expected = "within(new Team1()) {\n" + "  foo();\n" + "}\n";

        assertEquals("within statement: wrong naive flat string representation", expected, actual);
    }

    public void testSubtreeMatch1() {
        MethodDeclaration methodDecl = WithinStatementTest.getMethodDeclarationByName(_typeDecl, "withinNewTeam");
        List statements = methodDecl.getBody().statements();
        Statement first = (Statement) statements.get(0);
        _testObj = (WithinStatement) first;

        boolean actual = _testObj.subtreeMatch(new ASTMatcher(), _testObj);

        assertTrue("Within statements don't match", actual);
    }

    /**
      * Helper method to find the named MethodDeclaration
      * in the given TypeDeclaration.
      * 
      * @return the found MethodDeclaration or null
      */
    private static MethodDeclaration getMethodDeclarationByName(TypeDeclaration type, String name) {
        MethodDeclaration[] methods = type.getMethods();
        int numberOfMethods = methods.length;

        if (numberOfMethods == 0) {
            return null;
        }

        for (int idx = 0; idx < numberOfMethods; idx++) {
            if (name.equals(methods[idx].getName().getIdentifier())) {
                return methods[idx];
            }

        }

        return null; // method not found
    };

}