blob: 7730f2d3077d66f8755cab001b15688593ad0966 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2014 EclipseSource Muenchen 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:
* Eugen - initial API and implementation
******************************************************************************/
package org.eclipse.emf.ecp.diffmerge.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import org.eclipse.emf.common.command.BasicCommandStack;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecp.diffmerge.spi.context.DefaultMergeUtil;
import org.eclipse.emf.ecp.test.common.DefaultRealm;
import org.eclipse.emf.ecp.view.spi.model.VControl;
import org.eclipse.emf.ecp.view.spi.model.VFeaturePathDomainModelReference;
import org.eclipse.emf.ecp.view.spi.model.VViewFactory;
import org.eclipse.emf.ecp.view.spi.table.model.VTableControl;
import org.eclipse.emf.ecp.view.spi.table.model.VTableDomainModelReference;
import org.eclipse.emf.ecp.view.spi.table.model.VTableFactory;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.emfstore.bowling.BowlingFactory;
import org.eclipse.emf.emfstore.bowling.BowlingPackage;
import org.eclipse.emf.emfstore.bowling.Fan;
import org.eclipse.emf.emfstore.bowling.Merchandise;
import org.eclipse.emf.emfstore.bowling.Player;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Merge Tests.
*
* @author Eugen Neufeld
*
*/
public class Merge_PTest {
private DefaultRealm realm;
@Before
public void setUp() {
realm = new DefaultRealm();
}
@After
public void tearDown() {
realm.dispose();
}
private void addEobjectToResource(EObject eObject) {
final ResourceSet resourceSet = new ResourceSetImpl();
final AdapterFactoryEditingDomain domain = new AdapterFactoryEditingDomain(
new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE),
new BasicCommandStack(), resourceSet);
resourceSet.eAdapters().add(new AdapterFactoryEditingDomain.EditingDomainProvider(domain));
final Resource resource = resourceSet.createResource(URI.createURI("VIRTUAL_URI")); //$NON-NLS-1$
resource.getContents().add(eObject);
}
@Test
public void testMergeSingleAttribute() {
final VControl controlToCopyFrom = VViewFactory.eINSTANCE.createControl();
final VControl controlToCopyTo = VViewFactory.eINSTANCE.createControl();
final Player player1 = BowlingFactory.eINSTANCE.createPlayer();
addEobjectToResource(player1);
player1.setName("a"); //$NON-NLS-1$
final VFeaturePathDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr.setDomainModelEFeature(BowlingPackage.eINSTANCE.getPlayer_Name());
controlToCopyFrom.setDomainModelReference(dmr);
final Player player2 = BowlingFactory.eINSTANCE.createPlayer();
addEobjectToResource(player2);
player2.setName("b"); //$NON-NLS-1$
final VFeaturePathDomainModelReference dmr2 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr2.setDomainModelEFeature(BowlingPackage.eINSTANCE.getPlayer_Name());
controlToCopyTo.setDomainModelReference(dmr2);
DefaultMergeUtil.copyValues(controlToCopyFrom, player1, controlToCopyTo, player2);
assertEquals("a", player2.getName()); //$NON-NLS-1$
}
@Test
public void testMergeMultiAttribute() {
final VControl controlToCopyFrom = VViewFactory.eINSTANCE.createControl();
final VControl controlToCopyTo = VViewFactory.eINSTANCE.createControl();
final Player player1 = BowlingFactory.eINSTANCE.createPlayer();
addEobjectToResource(player1);
player1.getEMails().add("a"); //$NON-NLS-1$
player1.getEMails().add("b"); //$NON-NLS-1$
final VFeaturePathDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr.setDomainModelEFeature(BowlingPackage.eINSTANCE.getPlayer_EMails());
controlToCopyFrom.setDomainModelReference(dmr);
final Player player2 = BowlingFactory.eINSTANCE.createPlayer();
addEobjectToResource(player2);
player2.getEMails().add("1"); //$NON-NLS-1$
player2.getEMails().add("2"); //$NON-NLS-1$
final VFeaturePathDomainModelReference dmr2 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr2.setDomainModelEFeature(BowlingPackage.eINSTANCE.getPlayer_EMails());
controlToCopyTo.setDomainModelReference(dmr2);
DefaultMergeUtil.copyValues(controlToCopyFrom, player1, controlToCopyTo, player2);
assertEquals(2, player2.getEMails().size());
assertEquals("a", player2.getEMails().get(0)); //$NON-NLS-1$
assertEquals("b", player2.getEMails().get(1)); //$NON-NLS-1$
}
@Test
public void testMergeSingleContainmentReference() {
final VControl controlToCopyFrom = VViewFactory.eINSTANCE.createControl();
final VControl controlToCopyTo = VViewFactory.eINSTANCE.createControl();
final Fan fan1 = BowlingFactory.eINSTANCE.createFan();
fan1.setFavouriteMerchandise(BowlingFactory.eINSTANCE.createMerchandise());
fan1.getFavouriteMerchandise().setName("a"); //$NON-NLS-1$
addEobjectToResource(fan1);
final VFeaturePathDomainModelReference dmr = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr.setDomainModelEFeature(BowlingPackage.eINSTANCE.getMerchandise_Name());
dmr.getDomainModelEReferencePath().add(BowlingPackage.eINSTANCE.getFan_FavouriteMerchandise());
controlToCopyFrom.setDomainModelReference(dmr);
final Fan fan2 = BowlingFactory.eINSTANCE.createFan();
fan2.setFavouriteMerchandise(BowlingFactory.eINSTANCE.createMerchandise());
fan2.getFavouriteMerchandise().setName("b"); //$NON-NLS-1$
addEobjectToResource(fan2);
final VFeaturePathDomainModelReference dmr2 = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
dmr2.setDomainModelEFeature(BowlingPackage.eINSTANCE.getMerchandise_Name());
dmr2.getDomainModelEReferencePath().add(BowlingPackage.eINSTANCE.getFan_FavouriteMerchandise());
controlToCopyTo.setDomainModelReference(dmr2);
DefaultMergeUtil.copyValues(controlToCopyFrom, fan1, controlToCopyTo, fan2);
assertNotEquals(fan1.getFavouriteMerchandise(), fan2.getFavouriteMerchandise());
assertEquals("a", fan2.getFavouriteMerchandise().getName()); //$NON-NLS-1$
}
@Test
public void testMergeMultiContainmentReference() {
final VTableControl controlToCopyFrom = VTableFactory.eINSTANCE.createTableControl();
final VTableControl controlToCopyTo = VTableFactory.eINSTANCE.createTableControl();
final VFeaturePathDomainModelReference vcFrom = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
final VFeaturePathDomainModelReference vcTo = VViewFactory.eINSTANCE.createFeaturePathDomainModelReference();
vcFrom.setDomainModelEFeature(BowlingPackage.eINSTANCE.getMerchandise_Name());
vcTo.setDomainModelEFeature(BowlingPackage.eINSTANCE.getMerchandise_Name());
final Fan fan1 = BowlingFactory.eINSTANCE.createFan();
{
final Merchandise merchandise1 = BowlingFactory.eINSTANCE.createMerchandise();
fan1.getFanMerchandise().add(merchandise1);
merchandise1.setName("a"); //$NON-NLS-1$
final Merchandise merchandise2 = BowlingFactory.eINSTANCE.createMerchandise();
fan1.getFanMerchandise().add(merchandise2);
merchandise2.setName("b"); //$NON-NLS-1$
addEobjectToResource(fan1);
final VTableDomainModelReference dmr = VTableFactory.eINSTANCE
.createTableDomainModelReference();
dmr.setDomainModelEFeature(BowlingPackage.eINSTANCE.getFan_FanMerchandise());
controlToCopyFrom.setDomainModelReference(dmr);
}
final Fan fan2 = BowlingFactory.eINSTANCE.createFan();
{
final Merchandise merchandise1 = BowlingFactory.eINSTANCE.createMerchandise();
fan2.getFanMerchandise().add(merchandise1);
merchandise1.setName("1"); //$NON-NLS-1$
final Merchandise merchandise2 = BowlingFactory.eINSTANCE.createMerchandise();
fan2.getFanMerchandise().add(merchandise2);
merchandise2.setName("2"); //$NON-NLS-1$
addEobjectToResource(fan2);
final VTableDomainModelReference dmr2 = VTableFactory.eINSTANCE
.createTableDomainModelReference();
dmr2.setDomainModelEFeature(BowlingPackage.eINSTANCE.getFan_FanMerchandise());
controlToCopyTo.setDomainModelReference(dmr2);
}
DefaultMergeUtil.copyValues(controlToCopyFrom, fan1, controlToCopyTo, fan2);
assertEquals(fan1.getFanMerchandise().size(), fan2.getFanMerchandise().size());
assertNotEquals(fan1.getFanMerchandise().get(0), fan2.getFanMerchandise().get(0));
assertNotEquals(fan1.getFanMerchandise().get(1), fan2.getFanMerchandise().get(1));
assertEquals("a", fan2.getFanMerchandise().get(0).getName()); //$NON-NLS-1$
assertEquals("b", fan2.getFanMerchandise().get(1).getName()); //$NON-NLS-1$
}
@Test
public void testMergeSingleNOTContainmentReference() {
/*
* model:
* a
* |-b1 ref c1
* |-b2 ref c2
* |-c1
* |-c2
* a'
* |-b1' ref c1'
* |-b2' ref c2'
* |-c1'
* |-c2'
* what should a merge do? how do you identify the object to set the reference to?
*/
}
@Test
public void testMergeMultiNOTContainmentReference() {
/*
* model:
* a
* |-b1 ref c1,c2
* |-c1
* |-c2
* a'
* |-b1' ref c1',c2'
* |-c1'
* |-c2'
* what should a merge do? how do you identify the object to set the reference to?
*/
}
}