blob: bb21065e7e9d42e690307185ee8305e6138b3f2c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2010 BMW Car IT, Technische Universitaet Muenchen, and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* BMW Car IT - Initial API and implementation
* Technische Universitaet Muenchen - Major refactoring and extension
*******************************************************************************/
package org.eclipse.emf.edapt.tests.migration;
import java.io.IOException;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edapt.internal.common.ResourceSetFactoryImpl;
import org.eclipse.emf.edapt.internal.common.ResourceUtils;
import org.eclipse.emf.edapt.internal.common.URIUtils;
import org.eclipse.emf.edapt.internal.migration.internal.BackupUtils.URIMapper;
import org.eclipse.emf.edapt.internal.migration.internal.BackwardConverter;
import org.eclipse.emf.edapt.internal.migration.internal.ForwardConverter;
import org.eclipse.emf.edapt.internal.migration.internal.Persistency;
import org.eclipse.emf.edapt.migration.MigrationException;
import org.eclipse.emf.edapt.spi.migration.Metamodel;
import org.eclipse.emf.edapt.spi.migration.Model;
import org.eclipse.emf.edapt.spi.migration.ModelResource;
import junit.framework.Assert;
import junit.framework.TestCase;
/**
* Tests for {@link ForwardConverter} and {@link BackwardConverter}
*
* @author herrmama
* @author $Author$
* @version $Rev$
* @levd.rating RED Rev:
*/
@SuppressWarnings({ "deprecation", "restriction" })
public class ConverterTest extends TestCase {
/**
* Mapping between two models
*/
private Map<EObject, EObject> mapping;
/**
* Test whether both converters maintain the order of multi-valued
* references
*/
public void testOrder() throws IOException, MigrationException {
final URI contextURI = URIUtils.getURI("data/node"); //$NON-NLS-1$
final URI metamodelURI = contextURI.appendSegment("node.ecore"); //$NON-NLS-1$
final URI model1URI = contextURI.appendSegment("split.xmi"); //$NON-NLS-1$
final URI model2URI = contextURI.appendSegment("split_2.xmi"); //$NON-NLS-1$
final Metamodel metamodel = Persistency.loadMetamodel(metamodelURI);
final Model model = Persistency.loadModel(model1URI, metamodel,
new ResourceSetFactoryImpl(), null);
model.validate();
final URIMapper mapper = new URIMapper() {
@Override
public URI map(URI uri) {
final String name = uri.trimFileExtension().lastSegment() + "_2"; //$NON-NLS-1$
final String extension = uri.fileExtension();
return uri.trimSegments(1).appendSegment(name)
.appendFileExtension(extension);
}
};
for (final ModelResource resource : model.getResources()) {
resource.setUri(mapper.map(resource.getUri()));
}
Persistency.saveModel(model, null);
final Resource model1 = ResourceUtils
.loadResourceSet(model1URI, metamodel.getEPackages())
.getResources().get(0);
final Resource model2 = ResourceUtils
.loadResourceSet(model2URI, metamodel.getEPackages())
.getResources().get(0);
final EObject root1 = model1.getContents().get(0);
final EObject root2 = model2.getContents().get(0);
checkOrder(root1, root2);
}
/**
* Check whether the order is maintained
*/
private void checkOrder(EObject root1, EObject root2) {
mapping = new IdentityHashMap<EObject, EObject>();
checkContainment(root1, root2);
checkCrossReference(root1);
}
/**
* Check the order for containment references
*/
@SuppressWarnings("unchecked")
private void checkContainment(EObject element1, EObject element2) {
Assert.assertNotSame(element1, element2);
final EClass type = element1.eClass();
final EStructuralFeature feature = type.getEStructuralFeature("name"); //$NON-NLS-1$
Assert.assertEquals(element1.eGet(feature), element2.eGet(feature));
Assert.assertNull(mapping.put(element1, element2));
for (final EReference containment : type.getEAllContainments()) {
if (containment.isMany()) {
final List<EObject> list1 = (List<EObject>) element1
.eGet(containment);
final List<EObject> list2 = (List<EObject>) element2
.eGet(containment);
Assert.assertEquals(list1.size(), list2.size());
for (int i = 0, n = list1.size(); i < n; i++) {
final EObject child1 = list1.get(i);
final EObject child2 = list2.get(i);
checkContainment(child1, child2);
}
} else {
final EObject child1 = (EObject) element1.eGet(containment);
final EObject child2 = (EObject) element2.eGet(containment);
Assert.assertTrue(child1 != null && child2 != null
|| child1 == null && child2 == null);
if (child1 != null) {
checkContainment(child1, child2);
}
}
}
}
/**
* Check the order for cross references
*/
@SuppressWarnings("unchecked")
private void checkCrossReference(EObject element1) {
final EObject element2 = mapping.get(element1);
final EClass type = element1.eClass();
final EStructuralFeature feature = type.getEStructuralFeature("name"); //$NON-NLS-1$
Assert.assertEquals(element1.eGet(feature), element2.eGet(feature));
for (final EReference reference : type.getEAllReferences()) {
if (reference.isContainment()) {
continue;
}
if (reference.isMany()) {
final List<EObject> list1 = (List<EObject>) element1.eGet(reference);
final List<EObject> list2 = (List<EObject>) element2.eGet(reference);
Assert.assertEquals(list1.size(), list2.size());
for (int i = 0, n = list1.size(); i < n; i++) {
final EObject target1 = list1.get(i);
final EObject target2 = list2.get(i);
Assert.assertSame(mapping.get(target1), target2);
}
} else {
final EObject target1 = (EObject) element1.eGet(reference);
final EObject target2 = (EObject) element2.eGet(reference);
Assert.assertSame(mapping.get(target1), target2);
}
}
for (final EObject child1 : element1.eContents()) {
checkCrossReference(child1);
}
}
}