/*
 * 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());
  }

}
