/*
 * Copyright (c) 2008-2012 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:
 *    Simon McDuff - initial API and implementation
 *    Eike Stepper - maintenance
 */
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.model1.Order;
import org.eclipse.emf.cdo.tests.model1.OrderDetail;
import org.eclipse.emf.cdo.tests.model1.Product1;
import org.eclipse.emf.cdo.transaction.CDOTransaction;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;

/**
 * Resources fetched using CDOViewImpl.getResource(getResourcePath(CDOID)) not added to ResourceSet
 * <p>
 * See bug 251544
 *
 * @author Simon McDuff
 */
public class Bugzilla_251544_Test extends AbstractCDOTest
{
  public void testFromPersistedToTransient() throws Exception
  {
    CDOSession session = openSession();
    CDOTransaction transaction = session.openTransaction();
    CDOResource resource = transaction.createResource(getResourcePath("/my/resource"));

    Order order1 = getModel1Factory().createPurchaseOrder();
    OrderDetail orderDetail = getModel1Factory().createOrderDetail();
    Product1 product = getModel1Factory().createProduct1();
    product.setName("product");

    EList<EObject> contentList = resource.getContents();
    resource.getContents().add(order1);
    order1.getOrderDetails().add(orderDetail);
    orderDetail.setProduct(product);

    EList<OrderDetail> list = order1.getOrderDetails();

    resource.getContents().remove(0); // remove object by index
    list.remove(orderDetail);
    transaction.commit();

    resource.delete(null);

    assertSame(contentList, resource.getContents());
  }

  public void testFromTransientToPersisted() throws Exception
  {
    CDOSession session = openSession();
    CDOTransaction transaction = session.openTransaction();
    CDOResource resource = transaction.createResource(getResourcePath("/my/resource"));

    Order order1 = getModel1Factory().createPurchaseOrder();
    OrderDetail orderDetail = getModel1Factory().createOrderDetail();
    EList<OrderDetail> orderDetails = order1.getOrderDetails();
    order1.getOrderDetails().add(orderDetail);

    msg("Persist the graph");
    resource.getContents().add(order1);
    assertSame(orderDetails, order1.getOrderDetails());
    resource.getContents().remove(0); // remove object by index
    assertSame(orderDetails, order1.getOrderDetails());
    assertEquals(true, orderDetails.remove(orderDetail));
    transaction.commit();
  }
}
