/*
* 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, Collections.<IProject>emptyList(), new NullProgressMonitor(), Generator.EMF_PLUGIN_PROJECT_STYLE); //$NON-NLS-1$
}
IJavaProject javaProject = JavaCore.create(diagramProject);
assertTrue(javaProject.exists());
IPackageFragment pf = javaProject.getPackageFragmentRoot(diagramProject.getFolder("src")).createPackageFragment(gmfGenSource.getGenDiagram().getNotationViewFactoriesPackageName(), false, new NullProgressMonitor()); //$NON-NLS-1$
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} '{ }'", gmfGenSource.getGenDiagram().getNotationViewFactoriesPackageName(), gmfGenSource.getGenDiagram().getNotationViewFactoryClassName(), "javax.swing.text.View"); //$NON-NLS-1$
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);
}
};
}