/* | |
* Copyright (c) 2013 Eike Stepper (Berlin, Germany) 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: | |
* Eike Stepper - initial API and implementation | |
*/ | |
package org.eclipse.emf.cdo.tests.bugzilla; | |
import org.eclipse.emf.cdo.eresource.CDOResource; | |
import org.eclipse.emf.cdo.session.CDOSession; | |
import org.eclipse.emf.cdo.tests.AbstractCDOTest; | |
import org.eclipse.emf.cdo.tests.model3.Diagram; | |
import org.eclipse.emf.cdo.tests.model3.Edge; | |
import org.eclipse.emf.cdo.tests.model3.NodeF; | |
import org.eclipse.emf.cdo.transaction.CDOTransaction; | |
import org.eclipse.emf.ecore.util.EcoreUtil; | |
import org.junit.Assert; | |
import java.util.Collections; | |
/** | |
* Bug 407157: Bidirectional reference corrupted on invalidation. | |
* | |
* @author <a href="mailto:esteban.dugueperoux@obeo.fr">Steve Monnier</a> | |
*/ | |
public class Bugzilla_407157_Test extends AbstractCDOTest | |
{ | |
private static final String RESOURCE_NAME = "test1.model3"; | |
public void testUndoRedo() throws Exception | |
{ | |
Diagram dDiagram = getModel3Factory().createDiagram(); | |
NodeF dNode1 = getModel3Factory().createNodeF(); | |
NodeF dNode2 = getModel3Factory().createNodeF(); | |
NodeF dNode3 = getModel3Factory().createNodeF(); | |
Edge dEdge = getModel3Factory().createEdge(); | |
dDiagram.getEdgeTargets().add(dNode1); | |
dDiagram.getEdgeTargets().add(dNode2); | |
dDiagram.getEdgeTargets().add(dNode3); | |
dDiagram.getEdges().add(dEdge); | |
dEdge.setSourceNode(dNode1); | |
dEdge.setTargetNode(dNode3); | |
CDOSession session1 = openSession(); | |
CDOTransaction transaction1 = session1.openTransaction(); | |
CDOResource resource1 = transaction1.createResource(getResourcePath(RESOURCE_NAME)); | |
resource1.getContents().add(dDiagram); | |
resource1.save(Collections.emptyMap()); | |
// Second user | |
CDOSession sessionOfSecondUser = openSession(); | |
CDOTransaction transactionOfSecondUser = sessionOfSecondUser.openTransaction(); | |
CDOResource resourceOfSecondUser = transactionOfSecondUser.getResource(getResourcePath(RESOURCE_NAME)); | |
Diagram dDiagramOfSecondUser = (Diagram)resourceOfSecondUser.getContents().get(0); | |
Edge dEdgeOfSecondUser = dDiagramOfSecondUser.getEdges().get(0); | |
NodeF dNode1OfSecondUser = (NodeF)dDiagramOfSecondUser.getEdgeTargets().get(0); | |
NodeF dNode2OfSecondUser = (NodeF)dDiagramOfSecondUser.getEdgeTargets().get(1); | |
NodeF dNode3OfSecondUser = (NodeF)dDiagramOfSecondUser.getEdgeTargets().get(2); | |
// Do from first user | |
EcoreUtil.delete(dEdge); | |
Edge newDEdge = getModel3Factory().createEdge(); | |
dNode2.getOutgoingEdges().add(newDEdge); | |
dNode3.getIncomingEdges().add(newDEdge); | |
dDiagram.getEdges().add(newDEdge); | |
// Undo from first user | |
dNode1.getOutgoingEdges().add(dEdge); | |
dNode2.getOutgoingEdges().remove(newDEdge); | |
dNode3.getIncomingEdges().remove(newDEdge); | |
dNode3.getIncomingEdges().add(dEdge); | |
dDiagram.getEdges().add(dEdge); | |
dDiagram.getEdges().remove(newDEdge); | |
commitAndSync(transaction1, transactionOfSecondUser); | |
// Do assertion from second user | |
assertEquals(dNode1OfSecondUser, dEdgeOfSecondUser.getSourceNode()); | |
assertEquals(dNode3OfSecondUser, dEdgeOfSecondUser.getTargetNode()); | |
Assert.assertTrue(dNode3OfSecondUser.getIncomingEdges().contains(dEdgeOfSecondUser)); | |
Assert.assertEquals(1, dNode3OfSecondUser.getIncomingEdges().size()); | |
Assert.assertTrue(dNode1OfSecondUser.getOutgoingEdges().contains(dEdgeOfSecondUser)); | |
Assert.assertEquals(1, dNode1OfSecondUser.getOutgoingEdges().size()); | |
Assert.assertEquals(0, dNode2OfSecondUser.getOutgoingEdges().size()); | |
Assert.assertEquals(0, dNode2OfSecondUser.getIncomingEdges().size()); | |
} | |
} |