blob: 2eed1f52b71bcdaf5b6436ab1b71982fbfdeb6bf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 E.D.Willink 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:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.qvt.declarative.test.editor;
import java.io.IOException;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.qvt.declarative.test.emof.mapping.models.MappingModels;
import org.eclipse.qvt.declarative.test.parser.models.ParserModels;
import org.eclipse.qvt.declarative.ecore.utils.EcoreUtils;
import org.eclipse.qvt.declarative.ecore.utils.XMIUtils;
import org.eclipse.qvt.declarative.editor.ui.utils.EcoreUpdater;
import org.eclipse.qvt.declarative.editor.ui.utils.MissingElementException;
import org.eclipse.qvt.declarative.editor.ui.utils.MissingXmiIdException;
import org.eclipse.qvt.declarative.emof.QVTRelation.util.QVTRelationMappingMetaData;
import org.eclipse.qvt.declarative.test.emof.AbstractModels;
import org.eclipse.qvt.declarative.test.emof.AbstractTestCase;
import org.eclipse.qvt.declarative.test.emof.tools.EcoreComparator;
import org.eclipse.qvt.declarative.test.emof.tools.EcoreDifference;
import org.eclipse.qvt.declarative.test.emof.tools.EquivalenceMap;
public class EcoreUpdaterTests extends AbstractTestCase
{
protected static final AbstractModels MAPPING_MODELS = MappingModels.INSTANCE;
protected static final AbstractModels PARSER_MODELS = ParserModels.INSTANCE;
/**
* Asserts that two objects are equal. If they are not
* an AssertionFailedError is thrown with the given message.
*/
static public void assertEquals(String message, XMLResource expected, XMLResource actual) {
// assertEquals("URI", expected.getURI(), actual.getURI());
EcoreComparator ecoreComparator = new EquivalenceMap(expected, actual);
List<EcoreDifference> ecoreDifferences = ecoreComparator.computeDifferences();
int ecoreDifferenceCount = 0;
if (ecoreDifferences != null) {
ecoreDifferenceCount = ecoreDifferences.size();
if (ecoreDifferenceCount > 0) {
System.out.println("URI : " + expected.getURI());
for (EcoreDifference ecoreDifference : ecoreDifferences)
System.out.println(ecoreDifference);
}
}
assertEquals("Model differences", 0, ecoreDifferenceCount);
}
/**
* Asserts that two objects are equal. If they are not
* an AssertionFailedError is thrown with the given message.
*/
static public void assertNotEquals(String message, XMLResource expected, XMLResource actual, int differences) {
assertEquals("URI", expected.getURI(), actual.getURI());
EcoreComparator ecoreComparator = new EquivalenceMap(expected, actual);
List<EcoreDifference> ecoreDifferences = ecoreComparator.computeDifferences();
int ecoreDifferenceCount = 0;
if (ecoreDifferences != null) {
ecoreDifferenceCount = ecoreDifferences.size();
if ((ecoreDifferenceCount != differences) && (differences >= 0)) {
System.out.println("URI : " + expected.getURI());
for (EcoreDifference ecoreDifference : ecoreDifferences)
System.out.println(ecoreDifference);
}
}
if (differences >= 0)
assertEquals("Model differences", differences, ecoreDifferenceCount);
else if (ecoreDifferenceCount <= 0)
fail("Model differences expected");
}
protected void replacementTest(URI oldURI, URI newURI) throws IOException, MissingElementException {
XMLResource oldResource = (XMLResource) resourceSet.createResource(oldURI, EcorePackage.eCONTENT_TYPE);
XMLResource newResource = (XMLResource) resourceSet.getResource(newURI, true);
XMIUtils.assignIds(newResource, "test");
XMLResource savedOldResource = EcoreUpdater.copy(oldResource);
assertEquals("Saved working context", oldResource, savedOldResource);
XMLResource savedNewResource = EcoreUpdater.copy(newResource);
assertEquals("Saved update context", newResource, savedNewResource);
EcoreUpdater.update(oldResource, newResource);
assertEquals("Post update", oldResource, newResource);
assertEquals("Saved Post update", savedNewResource, newResource);
EcoreUpdater.update(oldResource, savedOldResource);
assertEquals("Post restore", oldResource, savedOldResource);
assertEquals("Saved Post restore", savedNewResource, newResource);
}
public void testEmptyNoChange() throws IOException, MissingElementException {
XMLResource workingResource = new XMIResourceImpl();
XMLResource savedResource = EcoreUpdater.copy(workingResource);
assertEquals("Saved context", workingResource, savedResource);
XMLResource copiedResource = EcoreUpdater.copy(savedResource);
assertEquals("Copied context", workingResource, copiedResource);
EcoreUpdater.update(workingResource, copiedResource);
assertEquals("Post update", workingResource, savedResource);
assertEquals("Saved Post update", savedResource, savedResource);
}
public void testMissingXmiId() throws IOException {
URI ecoreURI = MAPPING_MODELS.getURI("Ecore.ecore");
XMLResource workingResource = (XMLResource) resourceSet.getResource(ecoreURI, true);
try {
@SuppressWarnings("unused")
XMLResource savedResource = EcoreUpdater.copy(workingResource);
fail("MissingXmiIdException expected");
} catch (MissingXmiIdException e) {
}
}
public void testEcoreNoChange() throws IOException, MissingElementException {
URI ecoreURI = MAPPING_MODELS.getURI("Ecore.ecore");
XMLResource workingResource = (XMLResource) resourceSet.getResource(ecoreURI, true);
XMIUtils.assignIds(workingResource, "test");
XMLResource savedResource = EcoreUpdater.copy(workingResource);
assertEquals("Saved context", workingResource, savedResource);
XMLResource copiedResource = EcoreUpdater.copy(savedResource);
assertEquals("Copied context", workingResource, copiedResource);
EcoreUpdater.update(workingResource, copiedResource);
assertEquals("Post update", workingResource, savedResource);
assertEquals("Saved Post update", savedResource, savedResource);
}
public void testReplacement_EObject() throws IOException, MissingElementException {
replacementTest(MAPPING_MODELS.getURI("Empty1.ecore"), MAPPING_MODELS.getURI("EObject.ecore"));
}
public void testReplacement_Ecore() throws IOException, MissingElementException {
replacementTest(MAPPING_MODELS.getURI("Empty1.ecore"), MAPPING_MODELS.getURI("Ecore.ecore"));
}
public void testReplacement_SeqToStm() throws IOException, MissingElementException {
QVTRelationMappingMetaData.INSTANCE.configure(resourceSet, getMappingMetaDataRegistry());
replacementTest(MAPPING_MODELS.getURI("Empty1.ecore"), PARSER_MODELS.getURI("SeqToStm.reference.eqvtrelation"));
}
public void testEcoreChangedAttribute() throws IOException, MissingElementException {
URI ecoreURI = MAPPING_MODELS.getURI("Ecore.ecore");
XMLResource workingResource = (XMLResource) resourceSet.getResource(ecoreURI, true);
XMIUtils.assignIds(workingResource, "test");
XMLResource savedResource = EcoreUpdater.copy(workingResource);
assertEquals("Saved context", workingResource, savedResource);
XMLResource copiedResource = EcoreUpdater.copy(savedResource);
assertEquals("Copied context", workingResource, copiedResource);
EPackage ecorePackage = (EPackage) workingResource.getContents().get(0);
EClassifier attributeClass = EcoreUtils.getNamedElement(ecorePackage.getEClassifiers(), "EAttribute");
attributeClass.setName("NotEAttribute");
assertNotEquals("Modified context", workingResource, copiedResource, 1);
EcoreUpdater.update(workingResource, copiedResource);
assertEquals("Post update", workingResource, savedResource);
assertEquals("Saved Post update", savedResource, savedResource);
}
/* FIXME public void testEcoreChangeSuperType() throws IOException, MissingElementException {
URI ecoreURI = MappingModels.INSTANCE.getURI("Ecore.ecore");
XMLResource workingResource = (XMLResource) resourceSet.getResource(ecoreURI, true);
XMIUtils.assignIds(workingResource, "test");
XMLResource savedResource = XMIUtils.copy(workingResource);
assertEquals("Saved context", workingResource, savedResource);
XMLResource copiedResource = XMIUtils.copy(savedResource);
assertEquals("Copied context", workingResource, copiedResource);
EPackage ecorePackage = (EPackage) workingResource.getContents().get(0);
EClass attributeClass = (EClass) CSTUtils.getNamedElement(ecorePackage.getEClassifiers(), "EAttribute");
EClass objectClass = (EClass) CSTUtils.getNamedElement(ecorePackage.getEClassifiers(), "EObject");
attributeClass.getESuperTypes().clear();
attributeClass.getESuperTypes().add(objectClass);
assertNotEquals("Modified context", workingResource, copiedResource, 1);
XMIUtils.update(workingResource, copiedResource);
assertEquals("Post update", workingResource, savedResource);
assertEquals("Saved Post update", savedResource, savedResource);
} */
public void testEcoreChangeReference() throws IOException, MissingElementException {
URI ecoreURI = MAPPING_MODELS.getURI("Ecore.ecore");
XMLResource workingResource = (XMLResource) resourceSet.getResource(ecoreURI, true);
XMIUtils.assignIds(workingResource, "test");
XMLResource savedResource = EcoreUpdater.copy(workingResource);
assertEquals("Saved context", workingResource, savedResource);
XMLResource copiedResource = EcoreUpdater.copy(savedResource);
assertEquals("Copied context", workingResource, copiedResource);
EPackage ecorePackage = (EPackage) workingResource.getContents().get(0);
EPackage nestedPackage = EcoreFactory.eINSTANCE.createEPackage();
nestedPackage.setName("nested");
ecorePackage.getESubpackages().add(nestedPackage);
EClass factoryClass = (EClass) EcoreUtils.getNamedElement(ecorePackage.getEClassifiers(), "EFactory");
nestedPackage.getEClassifiers().add(factoryClass);
XMIUtils.assignIds(workingResource, "extra");
assertNotEquals("Modified context", workingResource, copiedResource, -1);
EcoreUpdater.update(workingResource, copiedResource);
assertEquals("Post update", workingResource, savedResource);
assertEquals("Saved Post update", savedResource, savedResource);
}
public void testEcoreReorderReference() throws IOException, MissingElementException {
URI ecoreURI = MAPPING_MODELS.getURI("Ecore.ecore");
XMLResource workingResource = (XMLResource) resourceSet.getResource(ecoreURI, true);
XMIUtils.assignIds(workingResource, "test");
XMLResource savedResource = EcoreUpdater.copy(workingResource);
assertEquals("Saved context", workingResource, savedResource);
XMLResource copiedResource = EcoreUpdater.copy(savedResource);
assertEquals("Copied context", workingResource, copiedResource);
EPackage ecorePackage = (EPackage) workingResource.getContents().get(0);
EPackage nestedPackage = EcoreFactory.eINSTANCE.createEPackage();
nestedPackage.setName("nested");
ecorePackage.getESubpackages().add(nestedPackage);
EClass factoryClass = (EClass) EcoreUtils.getNamedElement(ecorePackage.getEClassifiers(), "EFactory");
nestedPackage.getEClassifiers().add(factoryClass);
ecorePackage.getEClassifiers().add(factoryClass);
XMIUtils.assignIds(workingResource, "extra");
assertNotEquals("Modified context", workingResource, copiedResource, -1);
EcoreUpdater.update(workingResource, copiedResource);
assertEquals("Post update", workingResource, savedResource);
assertEquals("Saved Post update", savedResource, savedResource);
}
}