blob: 158605018ca367ac7248e32e887ef6f162fb17b6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2018 Borland Software Corporation and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Boyko Sergey - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.tests.qvt.oml.callapi;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.m2m.internal.qvt.oml.evaluator.QVTEvaluationOptions;
import org.eclipse.m2m.qvt.oml.util.Trace;
import org.eclipse.m2m.tests.qvt.oml.transform.ModelTestData;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import junit.framework.TestCase;
@RunWith(Parameterized.class)
public class IncrementalUpdateExecutorTest extends TransformationExecutorTest {
public IncrementalUpdateExecutorTest(String name, List<String> inModels, List<String> outModels) {
super(name, inModels, outModels); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
@Parameters(name="{0}")
public static Iterable<Object[]> data() {
return Collections.singletonList(
new Object[] {
"bug463572", Arrays.asList("in.ecore"), Arrays.asList("expected.ecore") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
);
}
@Override
@Before
public void setUp() {
super.setUp();
executionContext.getSessionData().setValue(QVTEvaluationOptions.INCREMENTAL_UPDATE_TRACE, Trace.createEmptyTrace());
}
@Override
@Test
public void runTest() throws Throwable {
// 1. pass - create output model and appropriate trace
super.runTest();
Resource outResource = resSet.createResource(URI.createURI("output:/expected.ecore")); //$NON-NLS-1$
outResource.getContents().addAll(extents.get(1).getContents());
List<EObject> outObjects = new ArrayList<EObject>(outResource.getContents());
// 2. pass - update output model in context of existing trace
super.runTest();
TestCase.assertEquals("IncUpdate should not change objects", outObjects.size(), extents.get(1).getContents().size());
for (int i = 0; i < extents.get(1).getContents().size(); ++i) {
EObject o = extents.get(1).getContents().get(i);
EObject oOut = outObjects.get(i);
ModelTestData.assertEquals("IncUpdate should not change objects or their order", o, oOut);
TestCase.assertEquals("IncUpdate should not change objects resource", o.eResource(), outResource);
}
// 3. pass - repeat previous
super.runTest();
TestCase.assertEquals("IncUpdate should not change objects", outObjects.size(), extents.get(1).getContents().size());
for (int i = 0; i < extents.get(1).getContents().size(); ++i) {
EObject o = extents.get(1).getContents().get(i);
EObject oOut = outObjects.get(i);
ModelTestData.assertEquals("IncUpdate should not change objects or their order", o, oOut);
TestCase.assertEquals("IncUpdate should not change objects resource", o.eResource(), outResource);
}
// 4. pass - add new package to the input (at tail)
extents.get(0).add(EcoreFactory.eINSTANCE.createEPackage());
super.runTest();
TestCase.assertEquals("IncUpdate should update output", outObjects.size()+1, extents.get(1).getContents().size());
for (int i = 0; i < extents.get(1).getContents().size()-1; ++i) {
EObject o = extents.get(1).getContents().get(i);
EObject oOut = outObjects.get(i);
ModelTestData.assertEquals("IncUpdate should not change objects or their order", o, oOut);
TestCase.assertEquals("IncUpdate should not change objects resource", o.eResource(), outResource);
}
List<EObject> content = extents.get(1).getContents();
TestCase.assertEquals("IncUpdate should not change objects resource", content.get(content.size()-1).eResource(), null);
ECollections.setEList(outResource.getContents(), extents.get(1).getContents());
outObjects = new ArrayList<EObject>(outResource.getContents());
// 5. pass - repeat previous
super.runTest();
TestCase.assertEquals("IncUpdate should update output", outObjects.size(), extents.get(1).getContents().size());
for (int i = 0; i < extents.get(1).getContents().size(); ++i) {
EObject o = extents.get(1).getContents().get(i);
EObject oOut = outObjects.get(i);
ModelTestData.assertEquals("IncUpdate should not change objects or their order", o, oOut);
TestCase.assertEquals("IncUpdate should not change objects resource", o.eResource(), outResource);
}
// 6. pass - add new package to the input (at head)
content = new ArrayList<EObject>();
content.add(EcoreFactory.eINSTANCE.createEPackage());
content.addAll(extents.get(0).getContents());
extents.get(0).setContents(content);
super.runTest();
TestCase.assertEquals("IncUpdate should update output", outObjects.size()+1, extents.get(1).getContents().size());
for (int i = 0; i < extents.get(1).getContents().size()-1; ++i) {
EObject o = extents.get(1).getContents().get(i+1);
EObject oOut = outObjects.get(i);
ModelTestData.assertEquals("IncUpdate should not change objects or their order", o, oOut);
TestCase.assertEquals("IncUpdate should not change objects resource", o.eResource(), outResource);
}
// 7. pass - remove newly added packages
content = new ArrayList<EObject>(extents.get(0).getContents());
content.remove(content.size()-1);
content.remove(0);
extents.get(0).setContents(content);
super.runTest();
outObjects.remove(outObjects.size()-1);
TestCase.assertEquals("IncUpdate should update output", outObjects.size(), extents.get(1).getContents().size());
for (int i = 0; i < extents.get(1).getContents().size(); ++i) {
EObject o = extents.get(1).getContents().get(i);
EObject oOut = outObjects.get(i);
ModelTestData.assertEquals("IncUpdate should not change objects or their order", o, oOut);
TestCase.assertEquals("IncUpdate should not change objects resource", o.eResource(), outResource);
}
ECollections.setEList(outResource.getContents(), extents.get(1).getContents());
outObjects = new ArrayList<EObject>(outResource.getContents());
// 8. pass - remove nested classifier (at tail)
outResource.eAdapters().add(fAdapter);
outResource.eSetDeliver(true);
EList<EClassifier> eClassifiers = ((EPackage) extents.get(0).getContents().get(0)).getEClassifiers();
EClassifier removedCls = eClassifiers.remove(eClassifiers.size()-1);
super.runTest();
outObjects.remove(outObjects.size()-1);
TestCase.assertEquals("IncUpdate should update output", outObjects.size(), extents.get(1).getContents().size());
for (int i = 0; i < extents.get(1).getContents().size(); ++i) {
EObject o = extents.get(1).getContents().get(i);
EObject oOut = outObjects.get(i);
ModelTestData.assertEquals("IncUpdate should not change objects or their order", o, oOut);
TestCase.assertEquals("IncUpdate should not change objects resource", o.eResource(), outResource);
}
TestCase.assertEquals(fNotifications.size(), 2);
TestCase.assertEquals(fNotifications.get(0).getEventType(), Notification.SET);
TestCase.assertEquals(fNotifications.get(0).getFeature(), EcorePackage.eINSTANCE.getEClassifier_EPackage());
TestCase.assertEquals(fNotifications.get(0).getNewValue(), null);
TestCase.assertEquals(fNotifications.get(1).getEventType(), Notification.REMOVE);
TestCase.assertEquals(fNotifications.get(1).getFeature(), EcorePackage.eINSTANCE.getEPackage_EClassifiers());
TestCase.assertEquals(fNotifications.get(1).getNewValue(), null);
fNotifications.clear();
// 9. pass - add nested classifier (at head)
eClassifiers.add(0, removedCls);
super.runTest();
TestCase.assertEquals("IncUpdate should update output", outObjects.size()+1, extents.get(1).getContents().size());
{
EObject o = extents.get(1).getContents().get(0);
EObject oOut = outObjects.get(0);
ModelTestData.assertEquals("IncUpdate should not change objects or their order", o, oOut);
TestCase.assertEquals("IncUpdate should not change objects resource", o.eResource(), outResource);
}
{
EObject o = extents.get(1).getContents().get(extents.get(1).getContents().size()-1);
EObject oOut = outObjects.get(outObjects.size()-1);
ModelTestData.assertEquals("IncUpdate should not change objects or their order", o, oOut);
TestCase.assertEquals("IncUpdate should not change objects resource", o.eResource(), outResource);
}
TestCase.assertEquals(fNotifications.size(), 1);
TestCase.assertEquals(fNotifications.get(0).getEventType(), Notification.ADD);
TestCase.assertEquals(fNotifications.get(0).getFeature(), EcorePackage.eINSTANCE.getEPackage_EClassifiers());
fNotifications.clear();
}
private EContentAdapter fAdapter = new EContentAdapter() {
@Override
public void notifyChanged(Notification notification) {
fNotifications.add(notification);
}
};
private List<Notification> fNotifications = new ArrayList<Notification>();
}