org.eclipse.objectteams.otdt.ui.tests.dom.rewrite.ASTRewritingModifyingTeamTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.objectteams.otdt.ui.tests.dom.rewrite.ASTRewritingModifyingTeamTest.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: ASTRewritingModifyingTeamTest.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.rewrite;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;
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.Block;
import org.eclipse.jdt.core.dom.BodyDeclaration;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.GuardPredicateDeclaration;
import org.eclipse.jdt.core.dom.InfixExpression;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.NumberLiteral;
import org.eclipse.jdt.core.dom.RoleTypeDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclarationStatement;
import org.eclipse.jdt.core.dom.InfixExpression.Operator;
import org.eclipse.jface.text.Document;
import org.eclipse.text.edits.TextEdit;

//TODO(jsv) create own OT package for this test
public class ASTRewritingModifyingTeamTest extends ASTRewritingModifyingTest {
    private static final Class THIS = ASTRewritingModifyingTeamTest.class;

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

    public static Test allTests() {
        return new Suite(THIS);
    }

    public static Test suite() {
        if (true) {
            return allTests();
        }
        TestSuite suite = new Suite("one test");
        suite.addTest(new ASTRewritingModifyingTeamTest("test0009"));
        return suite;
    }

    /**
     * insert a new role
     */
    public void test0001() throws Exception {
        IPackageFragment pack1 = sourceFolder.createPackageFragment("test0001", false, null);
        StringBuffer buf = new StringBuffer();
        buf.append("package test0001;\n");
        buf.append("public team class X {\n");
        buf.append("}\n");
        ICompilationUnit cu = pack1.createCompilationUnit("X.java", buf.toString(), false, null);

        CompilationUnit astRoot = createCU(cu, false);

        astRoot.recordModifications();

        AST ast = astRoot.getAST();

        TypeDeclaration aTeam = (TypeDeclaration) astRoot.types().get(0);
        RoleTypeDeclaration role = ast.newRoleTypeDeclaration();
        role.setName(ast.newSimpleName("Y"));
        role.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));
        aTeam.bodyDeclarations().add(role);

        String preview = evaluateRewrite(cu.getSource(), astRoot);

        buf = new StringBuffer();
        buf.append("package test0001;\n");
        buf.append("public team class X {\n");
        buf.append("\n");
        buf.append("    public class Y {\n");
        buf.append("    }\n");
        buf.append("}\n");
        assertEqualString(preview, buf.toString());
    }

    /**
     * Delete role from team
     */
    public void test0002() throws Exception {
        IPackageFragment pack1 = sourceFolder.createPackageFragment("test0002", false, null);
        StringBuffer buf = new StringBuffer();
        buf.append("package test0002;\n");
        buf.append("public team class X {\n");
        buf.append("public class Y {\n");
        buf.append("}\n");
        buf.append("}\n");
        ICompilationUnit cu = pack1.createCompilationUnit("X.java", buf.toString(), false, null);

        CompilationUnit astRoot = createCU(cu, false);

        astRoot.recordModifications();

        AST ast = astRoot.getAST();

        TypeDeclaration aTeam = (TypeDeclaration) astRoot.types().get(0);
        aTeam.bodyDeclarations().remove(0);

        String preview = evaluateRewrite(cu.getSource(), astRoot);

        buf = new StringBuffer();
        buf.append("package test0002;\n");
        buf.append("public team class X {\n");
        buf.append("}\n");
        assertEqualString(preview, buf.toString());
    }

    /**
     * Replace role
     */
    public void test0003() throws Exception {
        IPackageFragment pack1 = sourceFolder.createPackageFragment("test0003", false, null);
        StringBuffer buf = new StringBuffer();
        buf.append("package test0003;\n");
        buf.append("public team class X {\n");
        buf.append("   public class X {\n");
        buf.append("   }\n");
        buf.append("   public class Y {\n");
        buf.append("   }\n");
        buf.append("   public class Z {\n");
        buf.append("   }\n");
        buf.append("}\n");
        ICompilationUnit cu = pack1.createCompilationUnit("X.java", buf.toString(), false, null);

        CompilationUnit astRoot = createCU(cu, false);

        astRoot.recordModifications();

        AST ast = astRoot.getAST();

        TypeDeclaration aTeam = (TypeDeclaration) astRoot.types().get(0);
        RoleTypeDeclaration role = ast.newRoleTypeDeclaration();
        role.setName(ast.newSimpleName("YY"));
        role.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));
        aTeam.bodyDeclarations().remove(1);
        aTeam.bodyDeclarations().add(1, role);

        String preview = evaluateRewrite(cu.getSource(), astRoot);

        buf = new StringBuffer();
        buf.append("package test0003;\n");
        buf.append("public team class X {\n");
        buf.append("   public class X {\n");
        buf.append("   }\n");
        buf.append("   public class YY {\n");
        buf.append("    }\n");
        buf.append("    public class Z {\n");
        buf.append("   }\n");
        buf.append("}\n");
        assertEqualString(preview, buf.toString());
    }

    // Insert a role with playedBy via modification and cloning.
    public void test0004() throws Exception {

        // generate some AST:
        String generated = "public team class MyTeam {\n" + "   protected class DisposeWatcher playedBy Item {\n"
                + "       void bar() { nop(); }\n" + "   }\n" + "}\n";

        ASTParser parser = ASTParser.newParser(AST.JLS4);
        parser.setKind(ASTParser.K_STATEMENTS);
        parser.setSource(generated.toCharArray());

        Block block = (Block) parser.createAST(null);
        TypeDeclarationStatement st = (TypeDeclarationStatement) block.statements().get(0);
        TypeDeclaration decl = (TypeDeclaration) st.getDeclaration();
        ASTNode[] myNodes = (ASTNode[]) decl.bodyDeclarations().toArray(new ASTNode[1]);

        // create a CU to copy into:
        String existing = "public team class MyTeam {\n" + "   protected class OtherRole {}\n"
                + "   void foo() { System.out.println(this); }\n" + "}\n";
        parser = ASTParser.newParser(AST.JLS4);
        parser.setKind(ASTParser.K_COMPILATION_UNIT);
        parser.setSource(existing.toCharArray());
        CompilationUnit _astCU = (CompilationUnit) parser.createAST(null);
        TypeDeclaration teamDecl = (TypeDeclaration) _astCU.types().get(0);

        // copy generated into CU:
        _astCU.recordModifications();
        teamDecl.bodyDeclarations().add(ASTNode.copySubtree(_astCU.getAST(), myNodes[0]));

        // apply change:
        Document doc = new Document(existing);
        TextEdit edits = _astCU.rewrite(doc, null);
        edits.apply(doc);

        // compare result with expected:
        String newSource = doc.get();
        String expected = "public team class MyTeam {\n" + "   protected class OtherRole {}\n"
                + "   void foo() { System.out.println(this); }\n"
                + "    protected class DisposeWatcher playedBy Item {\n" + "        void bar() {\n"
                + "            nop();\n" + "        }\n" + "    }\n" + "}\n";
        assertEquals(expected, newSource);
    }

    // insert a role with playedBy and base predicate :
    public void test0005() throws Exception {

        // generate some AST:
        String generated = "public team class MyTeam {\n" + "   protected class DisposeWatcher playedBy Item \n"
                + "         base when (hasRole(base)) {\n" + "       void bar() { nop(); }\n" + "   }\n" + "}\n";

        ASTParser parser = ASTParser.newParser(AST.JLS4);
        parser.setKind(ASTParser.K_STATEMENTS);
        parser.setSource(generated.toCharArray());

        Block block = (Block) parser.createAST(null);
        TypeDeclarationStatement st = (TypeDeclarationStatement) block.statements().get(0);
        TypeDeclaration decl = (TypeDeclaration) st.getDeclaration();
        ASTNode[] myNodes = (ASTNode[]) decl.bodyDeclarations().toArray(new ASTNode[1]);

        // create a CU to copy into:
        String existing = "public team class MyTeam {\n" + "   protected class OtherRole {}\n"
                + "   void foo() { System.out.println(this); }\n" + "}\n";
        parser = ASTParser.newParser(AST.JLS4);
        parser.setKind(ASTParser.K_COMPILATION_UNIT);
        parser.setSource(existing.toCharArray());
        CompilationUnit _astCU = (CompilationUnit) parser.createAST(null);
        TypeDeclaration teamDecl = (TypeDeclaration) _astCU.types().get(0);

        // copy generated into CU:
        _astCU.recordModifications();
        teamDecl.bodyDeclarations().add(ASTNode.copySubtree(_astCU.getAST(), myNodes[0]));

        // apply change:
        Document doc = new Document(existing);
        TextEdit edits = _astCU.rewrite(doc, null);
        edits.apply(doc);

        // compare result with expected:
        String newSource = doc.get();
        String expected = "public team class MyTeam {\n" + "   protected class OtherRole {}\n"
                + "   void foo() { System.out.println(this); }\n"
                + "    protected class DisposeWatcher playedBy Item\n" + "            base when (hasRole(base))\n"
                + "    {\n" + "        void bar() {\n" + "            nop();\n" + "        }\n" + "    }\n" + "}\n";
        assertEquals(expected, newSource);
    }

    // insert a team with a predicate :
    public void test0006() throws Exception {

        // generate some AST:
        String generated = "public team class MyTeam \n" + "   when (isSunday(today())) {\n"
                + "       void bar() { nop(); }\n" + "}\n";

        ASTParser parser = ASTParser.newParser(AST.JLS4);
        parser.setKind(ASTParser.K_STATEMENTS);
        parser.setSource(generated.toCharArray());

        Block block = (Block) parser.createAST(null);
        System.out.println(block);
        TypeDeclarationStatement st = (TypeDeclarationStatement) block.statements().get(0);
        TypeDeclaration decl = (TypeDeclaration) st.getDeclaration();

        // create a CU to copy into:
        String existing = "import javax.swing.JFrame;\n";
        parser = ASTParser.newParser(AST.JLS4);
        parser.setKind(ASTParser.K_COMPILATION_UNIT);
        parser.setSource(existing.toCharArray());
        CompilationUnit _astCU = (CompilationUnit) parser.createAST(null);

        // copy generated into CU:
        _astCU.recordModifications();
        _astCU.types().add(ASTNode.copySubtree(_astCU.getAST(), decl));

        // apply change:
        Document doc = new Document(existing);
        TextEdit edits = _astCU.rewrite(doc, null);
        edits.apply(doc);

        // compare result with expected:
        String newSource = doc.get();
        String expected = "import javax.swing.JFrame;\n\n" + "public team class MyTeam\n"
                + "        when (isSunday(today()))\n" + "{\n" + "    void bar() {\n" + "        nop();\n"
                + "    }\n" + "}\n";
        assertEquals(expected, newSource);
    }

    /**
     * add team guard predicate
     */
    public void test0009() throws Exception {
        IPackageFragment pack1 = sourceFolder.createPackageFragment("test0009", false, null);
        StringBuffer buf = new StringBuffer();
        buf.append("package test0009;\n");
        buf.append("public team class Team\n");
        buf.append("{\n");
        buf.append("   public class Role playedBy Base\n");
        buf.append("    {\n");
        buf.append("    }\n");
        buf.append("}\n");
        ICompilationUnit cu = pack1.createCompilationUnit("Team.java", buf.toString(), false, null);

        CompilationUnit astRoot = createCU(cu, false);

        astRoot.recordModifications();

        AST ast = astRoot.getAST();

        TypeDeclaration aTeam = (TypeDeclaration) astRoot.types().get(0);

        GuardPredicateDeclaration guard = ast.newGuardPredicateDeclaration();

        guard.setBase(true);

        InfixExpression expr = ast.newInfixExpression();
        NumberLiteral lhs = ast.newNumberLiteral();
        lhs.setToken("4");
        expr.setLeftOperand(lhs);
        NumberLiteral rhs = ast.newNumberLiteral();
        rhs.setToken("5");
        expr.setRightOperand(rhs);
        expr.setOperator(Operator.EQUALS);
        guard.setExpression(expr);

        aTeam.setGuardPredicate(guard);

        String preview = evaluateRewrite(cu.getSource(), astRoot);

        buf = new StringBuffer();
        buf.append("package test0009;\n");
        buf.append("public team class Team\n");
        buf.append("    base when (4 == 5)\n");
        buf.append("{\n");
        buf.append("   public class Role playedBy Base\n");
        buf.append("    {\n");
        buf.append("    }\n");
        buf.append("}\n");
        assertEqualString(preview, buf.toString());
    }

    /**
     * remove team guard predicate
     */
    public void test0010() throws Exception {
        IPackageFragment pack1 = sourceFolder.createPackageFragment("test0010", false, null);
        StringBuffer buf = new StringBuffer();
        buf.append("package test0010;\n");
        buf.append("public team class Team\n");
        buf.append("    when (true)\n");
        buf.append("{\n");
        buf.append("   public class Role playedBy Base\n");
        buf.append("    {\n");
        buf.append("\n");
        buf.append("    }\n");
        buf.append("}\n");

        ICompilationUnit cu = pack1.createCompilationUnit("Team.java", buf.toString(), false, null);

        CompilationUnit astRoot = createCU(cu, false);

        astRoot.recordModifications();

        AST ast = astRoot.getAST();

        TypeDeclaration aTeam = (TypeDeclaration) astRoot.types().get(0);

        aTeam.setGuardPredicate(null);

        String preview = evaluateRewrite(cu.getSource(), astRoot);

        buf = new StringBuffer();
        buf.append("package test0010;\n");
        buf.append("public team class Team\n");
        buf.append("{\n");
        buf.append("   public class Role playedBy Base\n");
        buf.append("    {\n");
        buf.append("\n");
        buf.append("    }\n");
        buf.append("}\n");

        assertEqualString(preview, buf.toString());
    }

    /**
     * changed team guard predicate
     */
    public void test0011() throws Exception {
        IPackageFragment pack1 = sourceFolder.createPackageFragment("test0011", false, null);
        StringBuffer buf = new StringBuffer();
        buf.append("package test0011;\n");
        buf.append("public team class Team\n");
        buf.append("   when (true)\n");
        buf.append("{\n");
        buf.append("   public class Role playedBy Base\n");
        buf.append("   {\n");
        buf.append("\n");
        buf.append("    }\n");
        buf.append("}\n");

        ICompilationUnit cu = pack1.createCompilationUnit("Team.java", buf.toString(), false, null);

        CompilationUnit astRoot = createCU(cu, false);

        astRoot.recordModifications();

        AST ast = astRoot.getAST();

        TypeDeclaration aTeam = (TypeDeclaration) astRoot.types().get(0);

        GuardPredicateDeclaration guard = aTeam.getGuardPredicate();

        guard.setBase(true);

        InfixExpression expr = ast.newInfixExpression();
        NumberLiteral lhs = ast.newNumberLiteral();
        lhs.setToken("23");
        expr.setLeftOperand(lhs);
        NumberLiteral rhs = ast.newNumberLiteral();
        rhs.setToken("23");
        expr.setRightOperand(rhs);
        expr.setOperator(Operator.NOT_EQUALS);
        guard.setExpression(expr);

        String preview = evaluateRewrite(cu.getSource(), astRoot);

        buf = new StringBuffer();
        buf.append("package test0011;\n");
        buf.append("public team class Team\n");
        buf.append("   base when (23 != 23)\n");
        buf.append("{\n");
        buf.append("   public class Role playedBy Base\n");
        buf.append("   {\n");
        buf.append("\n");
        buf.append("    }\n");
        buf.append("}\n");

        assertEqualString(preview, buf.toString());
    }

}