org.eclipse.gmf.tests.gen.CompilationTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.gmf.tests.gen.CompilationTest.java

Source

/*
 * Copyright (c) 2005, 2008 Borland Software Corporation
 * 
 * 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:
 *    Artem Tikhomirov (Borland) - initial API and implementation
 */
package org.eclipse.gmf.tests.gen;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedHashSet;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.codegen.ecore.Generator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.gmf.codegen.gmfgen.GenDiagram;
import org.eclipse.gmf.codegen.gmfgen.GenEditorGenerator;
import org.eclipse.gmf.internal.bridge.genmodel.ViewmapProducer;
import org.eclipse.gmf.tests.Plugin;
import org.eclipse.gmf.tests.setup.DiaDefSetup;
import org.eclipse.gmf.tests.setup.DiaDefSource;
import org.eclipse.gmf.tests.setup.DiaGenSetup;
import org.eclipse.gmf.tests.setup.DiaGenSource;
import org.eclipse.gmf.tests.setup.DomainModelFileSetup;
import org.eclipse.gmf.tests.setup.DomainModelSetup;
import org.eclipse.gmf.tests.setup.DomainModelSetupInstanceClassName;
import org.eclipse.gmf.tests.setup.DomainModelSource;
import org.eclipse.gmf.tests.setup.GenProjectBaseSetup;
import org.eclipse.gmf.tests.setup.GeneratorConfiguration;
import org.eclipse.gmf.tests.setup.MapDefSource;
import org.eclipse.gmf.tests.setup.MapSetup;
import org.eclipse.gmf.tests.setup.MultiPackageGenSetup;
import org.eclipse.gmf.tests.setup.MultiplePackagesDomainModelSetup;
import org.eclipse.gmf.tests.setup.ToolDefSetup;
import org.eclipse.gmf.tests.setup.ToolDefSource;
import org.eclipse.gmf.tests.setup.annotated.GenASetup;
import org.eclipse.gmf.tests.setup.annotated.GraphDefASetup;
import org.eclipse.gmf.tests.setup.annotated.MapDefASetup;
import org.eclipse.gmf.tests.setup.annotated.ToolDefASetup;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.JavaCore;

/**
 * TODO add compilation check for CustomFigure(FigureAccessor(no fqn), FigureAccessor(fqn));  
 */
public abstract class CompilationTest extends TestCase {

    protected final GeneratorConfiguration myGenConfig;
    protected final ViewmapProducer myViewmapProducer;
    protected MapDefASetup myMapSource;
    protected GenDiagramMutator[] myGeneralMutators;
    protected GenDiagramMutator[] myRichClientMutators;

    protected CompilationTest(String name, GeneratorConfiguration genConfig, ViewmapProducer viewmapProducer) {
        super(name);
        assert genConfig != null;
        assert viewmapProducer != null;
        myGenConfig = genConfig;
        myViewmapProducer = viewmapProducer;
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        URI selected = Plugin.createURI("/models/library/library.ecore"); //$NON-NLS-1$
        DomainModelSource dmSource = new DomainModelFileSetup().init(selected);
        ToolDefSource tdmSource = new ToolDefASetup(dmSource.getModel());
        DiaDefSource gdmSource = new GraphDefASetup(dmSource.getModel());
        myMapSource = new MapDefASetup(dmSource.getModel(), tdmSource.getRegistry(), gdmSource.getCanvasDef());
        myGeneralMutators = new GenDiagramMutator[] { SAME_FILE_MUTATOR, SYNCHRONIZED_MUTATOR,
                SHORTCUT_STUFF_MUTATOR };
        myRichClientMutators = new GenDiagramMutator[] { SAME_FILE_MUTATOR, SHORTCUT_STUFF_MUTATOR };
    }

    // TODO EditPartViewer[Source|Setup]

    protected DiaGenSource createLibraryGen(boolean rcp) throws Exception {
        return new GenASetup(myMapSource.getMapping(), myViewmapProducer, rcp);
    }

    // avoid requests like #174171
    public void testCompileWithStrictOptions() throws Exception {
        final HashMap<String, String> options = new HashMap<String, String>();
        options.put(JavaCore.COMPILER_PB_EMPTY_STATEMENT, JavaCore.ERROR);
        //
        switchJavaOptions(options);
        try {
            testCompileMultiPackageDomain(); // run any test
        } finally {
            switchJavaOptions(options);
        }
    }

    /**
     * Installs java compiler options specified in the map, the map gets updated with
     * old values.
     */
    private static void switchJavaOptions(HashMap<String, String> options) {
        @SuppressWarnings("unchecked")
        Hashtable<Object, Object> settings = JavaCore.getOptions();
        for (String key : options.keySet()) {
            String originalValue = (String) settings.get(key);
            settings.put(key, options.get(key)); // install new
            options.put(key, originalValue); // keep old
        }
        JavaCore.setOptions(settings);
    }

    public void testRCPCompile() throws Exception {
        DiaGenSource gmfGenSource = createLibraryGen(true);
        gmfGenSource.getGenDiagram().getEditorGen().setSameFileForDiagramAndModel(false);
        generateAndCompile(gmfGenSource, myRichClientMutators);
    }

    public void testCompileDiagram() throws Exception {
        DiaGenSource gmfGenSource = createLibraryGen(false);
        generateAndCompile(gmfGenSource, myGeneralMutators);
    }

    public void testCompilePotentialNameClashes() throws Exception {
        DomainModelSource domainModel = new DomainModelSetup().init();
        domainModel.getNodeA().getEClass().setName("Node"); // #142211
        domainModel.getNodeB().getEClass().setName("ShapeNode");
        domainModel.getLinkAsClass().getEClass().setName("ConnectionNode");
        domainModel.getNodeA().getNameAttr().setName("attribute");
        domainModel.getNodeB().getNameAttr().setName("class");
        domainModel.getDiagramElement().setName("Diagram");
        MapDefSource mapSource = new MapSetup().init(new DiaDefSetup().init(), domainModel, new ToolDefSetup());
        DiaGenSource gmfGenSource = new DiaGenSetup(myViewmapProducer).init(mapSource);
        generateAndCompile(gmfGenSource);
    }

    public void testCompileInstanceClassNames() throws Exception {
        DomainModelSetup domainModelSetup = new DomainModelSetupInstanceClassName().init();
        MapDefSource mapSource = new MapSetup().init(new DiaDefSetup().init(), domainModelSetup,
                new ToolDefSetup());
        DiaGenSource gmfGenSource = new DiaGenSetup(myViewmapProducer).init(mapSource);
        generateAndCompile(gmfGenSource, SYNCHRONIZED_MUTATOR);
    }

    public void testCompileMultiPackageDomain() throws Exception {
        DomainModelSource ds = new MultiplePackagesDomainModelSetup().init();
        MapDefSource ms = new MapSetup().init(new DiaDefSetup().init(), ds, new ToolDefSetup());

        final LinkedHashSet<EPackage> additionalPacks = new LinkedHashSet<EPackage>(8);
        additionalPacks.add(ds.getNodeA().getEClass().getEPackage());
        additionalPacks.add(ds.getNodeB().getEClass().getEPackage());
        additionalPacks.add(ds.getLinkAsClass().getEClass().getEPackage());

        DiaGenSource gmfGenSource = new MultiPackageGenSetup(additionalPacks).init(ms);

        generateAndCompile(gmfGenSource);
    }

    protected void generateAndCompile(DiaGenSource genSource, GenDiagramMutator... mutators) throws Exception {
        final GenEditorGenerator editorGen = genSource.getGenDiagram().getEditorGen();
        new GenProjectBaseSetup(myGenConfig).generateAndCompile(editorGen, mutators);
    }

    // pulled from LiteCompilationTestWithImportConflicts, as it seems to be non-specific to lite runtime
    public void testPreexistingImportConflicts() throws Exception {
        DiaGenSource gmfGenSource = createLibraryGen(false);
        gmfGenSource.getGenDiagram().getEditorGen().setSameFileForDiagramAndModel(false);
        String pluginId = gmfGenSource.getGenDiagram().getEditorGen().getPlugin().getID();
        IProject diagramProject = ResourcesPlugin.getWorkspace().getRoot().getProject(pluginId);
        if (!diagramProject.isAccessible()) {
            //Initialize the plugin the same way it would be initialized if present.
            Generator.createEMFProject(diagramProject.getFolder("src").getFullPath(), null, //$NON-NLS-1$
                    Collections.<IProject>emptyList(), new NullProgressMonitor(),
                    Generator.EMF_PLUGIN_PROJECT_STYLE);
        }
        IJavaProject javaProject = JavaCore.create(diagramProject);
        assertTrue(javaProject.exists());
        IPackageFragment pf = javaProject.getPackageFragmentRoot(diagramProject.getFolder("src")) //$NON-NLS-1$
                .createPackageFragment(gmfGenSource.getGenDiagram().getNotationViewFactoriesPackageName(), false,
                        new NullProgressMonitor());
        ICompilationUnit cu = pf
                .getCompilationUnit(gmfGenSource.getGenDiagram().getNotationViewFactoryClassName() + ".java"); //$NON-NLS-1$
        String contents = MessageFormat.format(
                "package {0};\nimport {2};\n /**\n * @generated\n */\npublic class {1} '{ }'", //$NON-NLS-1$
                gmfGenSource.getGenDiagram().getNotationViewFactoriesPackageName(),
                gmfGenSource.getGenDiagram().getNotationViewFactoryClassName(), "javax.swing.text.View");
        if (cu.exists()) {
            IBuffer buffer = cu.getBuffer();
            buffer.setContents(contents);
            buffer.save(new NullProgressMonitor(), true);
        } else {
            pf.createCompilationUnit(cu.getElementName(), contents, false, new NullProgressMonitor());
        }
        generateAndCompile(gmfGenSource);
    }

    protected final GenDiagramMutator SAME_FILE_MUTATOR = new GenDiagramMutator("sameFileForDiagramAndModel") {
        private boolean myIsSameFileForDiagramAndModel;

        public void doMutation(GenDiagram d) {
            myIsSameFileForDiagramAndModel = d.getEditorGen().isSameFileForDiagramAndModel();
            d.getEditorGen().setSameFileForDiagramAndModel(!myIsSameFileForDiagramAndModel);
        }

        public void undoMutation(GenDiagram d) {
            d.getEditorGen().setSameFileForDiagramAndModel(myIsSameFileForDiagramAndModel);
        }
    };

    protected final GenDiagramMutator SYNCHRONIZED_MUTATOR = new GenDiagramMutator("synchronized") {
        private boolean myIsSynchronized;

        public void doMutation(GenDiagram d) {
            myIsSynchronized = d.isSynchronized();
            d.setSynchronized(!myIsSynchronized);
        }

        public void undoMutation(GenDiagram d) {
            d.setSynchronized(myIsSynchronized);
        }
    };

    protected final GenDiagramMutator SHORTCUT_STUFF_MUTATOR = new GenDiagramMutator("shortcuts") {
        private List<String> myShortcutsTo;
        private List<String> myShortcutsFor;

        public void doMutation(GenDiagram d) {
            myShortcutsTo = new ArrayList<String>(d.getContainsShortcutsTo());
            d.getContainsShortcutsTo().clear();
            d.getContainsShortcutsTo().add(d.getEditorGen().getModelID());
            myShortcutsFor = new ArrayList<String>(d.getShortcutsProvidedFor());
            d.getShortcutsProvidedFor().clear();
            d.getShortcutsProvidedFor().add(d.getEditorGen().getModelID());
        }

        public void undoMutation(GenDiagram d) {
            d.getContainsShortcutsTo().clear();
            d.getContainsShortcutsTo().addAll(myShortcutsTo);
            d.getShortcutsProvidedFor().clear();
            d.getShortcutsProvidedFor().addAll(myShortcutsFor);
        }
    };
}