/*******************************************************************************
* Copyright (c) 2005, 2009 eXXcellent solution gmbh and others.
* 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:
* Achim Demelt - initial API and implementation
*******************************************************************************/
package org.eclipse.xpand.incremental;
import junit.framework.TestCase;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.mwe.core.WorkflowContext;
import org.eclipse.emf.mwe.core.WorkflowContextDefaultImpl;
import org.eclipse.emf.mwe.core.issues.Issues;
import org.eclipse.emf.mwe.core.issues.IssuesImpl;
import org.eclipse.emf.mwe.core.monitor.NullProgressMonitor;
import org.eclipse.emf.mwe.core.resources.ResourceLoader;
import org.eclipse.emf.mwe.core.resources.ResourceLoaderFactory;
import org.eclipse.emf.mwe.core.resources.ResourceLoaderImpl;
import org.eclipse.emf.mwe.utils.Reader;
import org.eclipse.xpand2.incremental.compare.EmfCompare;
public class CompareTest extends TestCase {
private WorkflowContext ctx;
private ResourceLoader oldResourceLoader;
/**
* Creates new worfkflow context and loads old and new models into slots.
*/
@Override
public void setUp() {
oldResourceLoader = ResourceLoaderFactory.getCurrentThreadResourceLoader();
ResourceLoaderFactory.setCurrentThreadResourceLoader(new ResourceLoaderImpl(getClass().getClassLoader()));
ctx = new WorkflowContextDefaultImpl();
loadModel("old");
loadModel("new");
}
@Override
protected void tearDown() throws Exception {
ResourceLoaderFactory.setCurrentThreadResourceLoader(oldResourceLoader);
super.tearDown();
}
private void loadModel(String name) {
Reader r = new Reader();
r.setFirstElementOnly(true);
r.setModelSlot(name);
r.setUri("platform:/plugin/org.eclipse.xpand.incremental.tests/resources/model/" + name + ".ecore");
r.invoke(ctx, new NullProgressMonitor(), new IssuesImpl());
}
public void testCompareTwoModels() {
// set up EMF compare component
EmfCompare compare = new EmfCompare();
compare.setOldModelSlot("old");
compare.setNewModelSlot("new");
compare.setDiffModelSlot("diff");
compare.setSnapshotModelSlot("snapshot");
// do comparison
Issues issues = new IssuesImpl();
compare.checkConfiguration(issues);
compare.invoke(ctx, new NullProgressMonitor(), issues);
// check existence of output models
EObject diffModel = (EObject) ctx.get("diff");
assertNotNull(diffModel);
EObject snapshotModel = (EObject) ctx.get("snapshot");
assertNotNull(snapshotModel);
// no errros, please
assertFalse(issues.hasErrors());
assertFalse(issues.hasWarnings());
}
public void testCompareTwoModelsWithoutSnapshot() {
// set up EMF compare component
EmfCompare compare = new EmfCompare();
compare.setOldModelSlot("old");
compare.setNewModelSlot("new");
compare.setDiffModelSlot("diff");
// do comparison
Issues issues = new IssuesImpl();
compare.checkConfiguration(issues);
compare.invoke(ctx, new NullProgressMonitor(), issues);
// check existence of diff model, but not snapshot model
EObject diffModel = (EObject) ctx.get("diff");
assertNotNull(diffModel);
EObject snapshotModel = (EObject) ctx.get("snapshot");
assertNull(snapshotModel);
// missing snapshot model slot must not cause an error or a warning
assertFalse(issues.hasErrors());
assertFalse(issues.hasWarnings());
}
public void testCompareOneModelWithNoOldModel() {
// set up EMF compare component
EmfCompare compare = new EmfCompare();
compare.setOldModelSlot("doesnotexist");
compare.setNewModelSlot("new");
compare.setDiffModelSlot("diff");
compare.setSnapshotModelSlot("snapshot");
checkCompareOneModel(compare);
}
public void testCompareOneModelWithNoNewModel() {
// set up EMF compare component
EmfCompare compare = new EmfCompare();
compare.setOldModelSlot("old");
compare.setNewModelSlot("doesnotexist");
compare.setDiffModelSlot("diff");
compare.setSnapshotModelSlot("snapshot");
checkCompareOneModel(compare);
}
private void checkCompareOneModel(EmfCompare compare) {
// do comparison
Issues issues = new IssuesImpl();
compare.checkConfiguration(issues);
compare.invoke(ctx, new NullProgressMonitor(), issues);
// we have no diff or snapshot model
EObject diffModel = (EObject) ctx.get("diff");
assertNull(diffModel);
EObject snapshotModel = (EObject) ctx.get("snapshot");
assertNull(snapshotModel);
// we should have a warning about the missing model slot
assertFalse(issues.hasErrors());
assertTrue(issues.hasWarnings());
}
public void testConfigurationError1() {
// set up EMF compare component, but don't set old model
EmfCompare compare = new EmfCompare();
compare.setNewModelSlot("new");
compare.setDiffModelSlot("diff");
compare.setSnapshotModelSlot("snapshot");
checkConfigurationError(compare);
}
public void testConfigurationError2() {
// set up EMF compare component, but don't set new model
EmfCompare compare = new EmfCompare();
compare.setOldModelSlot("old");
compare.setDiffModelSlot("diff");
compare.setSnapshotModelSlot("snapshot");
checkConfigurationError(compare);
}
public void testConfigurationError3() {
// set up EMF compare component, but don't set diff model
EmfCompare compare = new EmfCompare();
compare.setOldModelSlot("old");
compare.setOldModelSlot("new");
compare.setSnapshotModelSlot("snapshot");
checkConfigurationError(compare);
}
private void checkConfigurationError(EmfCompare compare) {
// do comparison
Issues issues = new IssuesImpl();
compare.checkConfiguration(issues);
compare.invoke(ctx, new NullProgressMonitor(), issues);
// we have no diff or snapshot model
EObject diffModel = (EObject) ctx.get("diff");
assertNull(diffModel);
EObject snapshotModel = (EObject) ctx.get("snapshot");
assertNull(snapshotModel);
// we should have a warning about the missing model slot
assertTrue(issues.hasErrors());
}
}