/*******************************************************************************
 * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  

package org.eclipse.persistence.testing.sdo.model.datagraph;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.namespace.QName;

import junit.textui.TestRunner;

import org.eclipse.persistence.sdo.SDODataGraph;
import org.eclipse.persistence.sdo.SDODataObject;
import org.eclipse.persistence.sdo.helper.DefaultSchemaLocationResolver;
import org.eclipse.persistence.sdo.helper.ListWrapper;
import org.eclipse.persistence.sdo.helper.SDOXSDHelper;

import commonj.sdo.DataGraph;
import commonj.sdo.DataObject;
import commonj.sdo.Type;

public class SDODataGraphDataObjectBackPointerTest extends SDODataGraphDataObjectTestCases {
    /**
     * customer/item[] - containment = true 
     * porder/item[] - containment = false
     */

    public SDODataGraphDataObjectBackPointerTest(String name) {
        super(name);
    }

    public void setUp() {
        super.setUp();
        dataGraph = new SDODataGraph(aHelperContext);
    }

    // This function will exercise the updateDataGraph() function on SDODataObject.updateContainment()
    public void testSetDOFromOtherDataGraphWithMixedContainmentNonContainmentWithoutCStoDGwithoutCS() {
    	DefaultSchemaLocationResolver resolver = new DefaultSchemaLocationResolver(new HashMap<QName, String>());
    	registerTypes();
    	List<Type> types = getTypesToGenerateFrom();
        ((SDOXSDHelper)xsdHelper).generate(types, resolver);
        
        // Create target
    	DataObject aDataObjectTarget = createRootObject(types);
    	DataGraph aDataGraphTarget = dataGraph;
    	aDataGraphTarget.createRootObject(aDataObjectTarget.getType());
    	DataObject targetRoot = aDataGraphTarget.getRootObject();
    	// Check it
    	assertNotNull(targetRoot);
    	assertEquals(targetRoot.getType(), aDataGraphTarget.getType(URINAME, COMPANY_TYPENAME));    	
    	ListWrapper pOrdersTarget = (ListWrapper)targetRoot.getList(PO_PATH);
    	int poSize = pOrdersTarget.size();
    	assertEquals(0, poSize);
    	
        // Create source
    	DataObject aDataObjectSource = createRootObject(types);
    	DataGraph aDataGraphSource = new SDODataGraph(aHelperContext);
    	aDataGraphSource.createRootObject(aDataObjectSource.getType());
    	DataObject sourceRoot = aDataGraphSource.getRootObject();
    	// Check it
    	assertNotNull(sourceRoot);
    	assertEquals(sourceRoot.getType(), aDataGraphSource.getType(URINAME, COMPANY_TYPENAME));    	
    	ListWrapper pOrdersSource = (ListWrapper) aDataObjectSource.getList(PO_PATH);
    	int poSizeSource = pOrdersSource.size();
    	assertEquals(1, poSizeSource);

    	// Clear the target CS so that we enter only the DataGraph recursive loop
    	((SDODataObject)targetRoot)._setChangeSummary(null);
    	
    	// Get source DO
    	DataObject sourcePO = (DataObject)pOrdersSource.get(0);
    	
    	// DataGraph should be null before set
    	assertNull(sourcePO.getDataGraph());
    	
    	// Move the root object from one null data graph to the other
    	pOrdersTarget.add(sourcePO);

    	// DataGraph should be not be null before set
    	assertNotNull(sourcePO.getDataGraph());
    	// Target dataGraph should be set on all children
    	assertEquals(aDataGraphTarget, sourcePO.getDataGraph());

    	DataObject copyPOshipTo = (DataObject)sourcePO.get("shipTo");
    	DataObject copyPObillTo = (DataObject)sourcePO.get("billTo");
    	DataObject copyPOitem1 = (DataObject)sourcePO.get("item[1]");
    	DataObject copyPOitem2 = (DataObject)sourcePO.get("item[2]");
    	
    	// Check dataGraph back pointers recursively (containment only)
    	List<DataObject> copyPreOrderList = preOrderTraversalDataObjectList(sourcePO);
    	assertNotNull(copyPreOrderList);
    	assertEquals(5, copyPreOrderList.size());
    	copyPreOrderList.contains(copyPOshipTo);
    	copyPreOrderList.contains(copyPObillTo);
    	copyPreOrderList.contains(copyPOitem1);
    	copyPreOrderList.contains(copyPOitem2);

    	assertNotNull(copyPOshipTo.getDataGraph());
    	assertEquals(aDataGraphTarget, copyPOshipTo.getDataGraph());
    	assertNotNull(copyPObillTo.getDataGraph());
    	assertEquals(aDataGraphTarget, copyPObillTo.getDataGraph());
    	// item property is unidirectional or containment=false - still in the dataGraph in this case
    	assertNotNull(copyPOitem1.getDataGraph());
    	assertEquals(aDataGraphTarget, copyPOitem1.getDataGraph());
    	assertNotNull(copyPOitem2.getDataGraph());
    	assertEquals(aDataGraphTarget, copyPOitem2.getDataGraph());
    }

    // This function will exercise the updateChangeSummaryAndDataGraph() function on SDODataObject.updateContainment()
    public void testSetDOFromOtherDataGraphWithMixedContainmentNonContainmentWithoutCStoDGwithCS() {
    	DefaultSchemaLocationResolver resolver = new DefaultSchemaLocationResolver(new HashMap<QName, String>());
    	registerTypes();
    	List<Type> types = getTypesToGenerateFrom();
        ((SDOXSDHelper)xsdHelper).generate(types, resolver);
        
        // Create target
    	DataObject aDataObjectTarget = createRootObject(types);
    	DataGraph aDataGraphTarget = dataGraph;
    	aDataGraphTarget.createRootObject(aDataObjectTarget.getType());
    	DataObject targetRoot = aDataGraphTarget.getRootObject();
    	// Check it
    	assertNotNull(targetRoot);
    	assertEquals(targetRoot.getType(), aDataGraphTarget.getType(URINAME, COMPANY_TYPENAME));    	
    	ListWrapper pOrdersTarget = (ListWrapper)targetRoot.getList(PO_PATH);
    	int poSize = pOrdersTarget.size();
    	assertEquals(0, poSize);
    	
    	// Add a porder (null DG source)
    	
        // Create source
    	DataObject aDataObjectSource = createRootObject(types);
    	DataGraph aDataGraphSource = new SDODataGraph(aHelperContext);
    	aDataGraphSource.createRootObject(aDataObjectSource.getType());
    	DataObject sourceRoot = aDataGraphSource.getRootObject();
    	// Check it
    	assertNotNull(sourceRoot);
    	assertEquals(sourceRoot.getType(), aDataGraphSource.getType(URINAME, COMPANY_TYPENAME));    	
    	ListWrapper pOrdersSource = (ListWrapper) aDataObjectSource.getList(PO_PATH);
    	int poSizeSource = pOrdersSource.size();
    	assertEquals(1, poSizeSource);

    	// Get source DO
    	DataObject sourcePO = (DataObject)pOrdersSource.get(0);
    	
    	// DataGraph should be null before set
    	assertNull(sourcePO.getDataGraph());
    	
    	// Move the root object from one null data graph to the other
    	pOrdersTarget.add(sourcePO);

    	// DataGraph should be not be null before set
    	assertNotNull(sourcePO.getDataGraph());
    	// Target dataGraph should be set on all children    	
    	assertEquals(aDataGraphTarget, sourcePO.getDataGraph());

    	DataObject copyPOshipTo = (DataObject)sourcePO.get("shipTo");
    	DataObject copyPObillTo = (DataObject)sourcePO.get("billTo");
    	DataObject copyPOitem1 = (DataObject)sourcePO.get("item[1]");
    	DataObject copyPOitem2 = (DataObject)sourcePO.get("item[2]");
    	
    	// Check dataGraph back pointers recursively (containment only)
    	List<DataObject> copyPreOrderList = preOrderTraversalDataObjectList(sourcePO);
    	assertNotNull(copyPreOrderList);
    	assertEquals(5, copyPreOrderList.size());
    	copyPreOrderList.contains(copyPOshipTo);
    	copyPreOrderList.contains(copyPObillTo);
    	copyPreOrderList.contains(copyPOitem1);
    	copyPreOrderList.contains(copyPOitem2);

    	assertNotNull(copyPOshipTo.getDataGraph());
    	assertEquals(aDataGraphTarget, copyPOshipTo.getDataGraph());
    	assertNotNull(copyPObillTo.getDataGraph());
    	assertEquals(aDataGraphTarget, copyPObillTo.getDataGraph());
    	// item property is unidirectional or containment=false - still in the dataGraph in this case
    	assertNotNull(copyPOitem1.getDataGraph());
    	assertEquals(aDataGraphTarget, copyPOitem1.getDataGraph());
    	assertNotNull(copyPOitem2.getDataGraph());
    	assertEquals(aDataGraphTarget, copyPOitem2.getDataGraph());
    }
    
    public void testDetachNonContainmentDOwithMixedContainmentNonContainmentWithoutCStoDGwithCS() {
    	DefaultSchemaLocationResolver resolver = new DefaultSchemaLocationResolver(new HashMap<QName, String>());
    	registerTypes();
    	List<Type> types = getTypesToGenerateFrom();
        ((SDOXSDHelper)xsdHelper).generate(types, resolver);
        //log(generatedSchema);
    	dataGraph.createRootObject(URINAME, COMPANY_TYPENAME);//aDataObject.getType());
    	DataObject aWrappedDO = dataGraph.getRootObject();
    	assertNotNull(aWrappedDO);
    	// TODO
    	assertEquals(aWrappedDO.getType(), dataGraph.getType(URINAME, COMPANY_TYPENAME));

    	DataObject dgDO = populateRootDataGraphDataObject(dataGraph.getRootObject(), types);
    	ListWrapper pOrders = (ListWrapper)dgDO.getList(PO_PATH);
    	int poSize = pOrders.size();
    	assertEquals(1, poSize);

    	// Detach DO    	
    	DataObject porder1DO = (DataObject)pOrders.get(0);
    	int porder1ItemsSize = ((ListWrapper)porder1DO.get("item")).size();
    	DataObject ncItem1DO = (DataObject)(porder1DO).get("item[1]");
    	DataObject detachedDO = ncItem1DO;
    	ncItem1DO.detach();

    	
    	ListWrapper pOrdersDGList = (ListWrapper)dgDO.getList(PO_PATH); 
    	int poSizeDG =  pOrdersDGList.size();
    	assertEquals(porder1ItemsSize - 1, poSizeDG);
    	
    	assertEquals(null, detachedDO.getDataGraph());
    	DataObject copyPOitem2 = (DataObject)porder1DO.get("item[1]"); // Remaining item
    	/**
    	 * item property is unidirectional or containment=false - therefore not in the dataGraph.
    	 * However, if the item also has a containment=true reference to itself then it does reference the dataGraph
    	 */    	
    	assertNull(ncItem1DO.getDataGraph());
    	assertNotNull(copyPOitem2);
    	assertNull(copyPOitem2.getDataGraph());

    	// Check that the CS is not set on all nodes including non-containment ones
    	assertNull(ncItem1DO.getChangeSummary());
    	
    }

    public void testAddDOwithMixedContainmentNonContainmentWithoutCStoDGwithCS() {
    	DefaultSchemaLocationResolver resolver = new DefaultSchemaLocationResolver(new HashMap<QName, String>());
    	registerTypes();
    	List<Type> types = getTypesToGenerateFrom();
        ((SDOXSDHelper)xsdHelper).generate(types, resolver);
        //log(generatedSchema);
    	DataObject aDataObject = createRootObject(types);
    	dataGraph.createRootObject(aDataObject.getType());
    	DataObject aWrappedDO = dataGraph.getRootObject();
    	assertNotNull(aWrappedDO);
    	assertEquals(aWrappedDO.getType(), dataGraph.getType(URINAME, COMPANY_TYPENAME));
    	
    	DataObject dgDO = dataGraph.getRootObject();
    	ListWrapper pOrders = (ListWrapper)aDataObject.getList(PO_PATH);
    	int poSize = pOrders.size();
    	assertEquals(1, poSize);
    	
    	// Create detached DO
    	DataObject copyPO = (DataObject)pOrders.get(0);
    	
    	// Create a new ListWrapper and set it on the DG DO
    	List<DataObject> aList = new ArrayList<DataObject>();
    	aList.add(copyPO);
    	// Add DO to DG-DO - there is no existing elements
    	dgDO.set("porder", aList);
    	ListWrapper pOrdersDGList = (ListWrapper)dgDO.getList(PO_PATH); 
    	int poSizeDG =  pOrdersDGList.size();
    	// or
    	//pOrdersDGList.add(copyPO);
    	assertEquals(poSize, poSizeDG);
    	
    	assertEquals(dataGraph, copyPO.getDataGraph());
    	DataObject copyPOshipTo = (DataObject)copyPO.get("shipTo");
    	DataObject copyPObillTo = (DataObject)copyPO.get("billTo");
    	DataObject copyPOitem1 = (DataObject)copyPO.get("item[1]");
    	DataObject copyPOitem2 = (DataObject)copyPO.get("item[2]");
    	
    	// Check dataGraph back pointers recursively (containment only)
    	List<DataObject> copyPreOrderList = preOrderTraversalDataObjectList(copyPO);
    	assertNotNull(copyPreOrderList);
    	assertEquals(5, copyPreOrderList.size());
    	copyPreOrderList.contains(copyPOshipTo);
    	copyPreOrderList.contains(copyPObillTo);
    	copyPreOrderList.contains(copyPOitem1);
    	copyPreOrderList.contains(copyPOitem2);

//    	for(DataObject aDO : copyPreOrderList) {
//    		assertEquals(dataGraph, aDO.getDataGraph()); // Check containment=true|false nodes
//    	}
    	
    	assertNotNull(copyPOshipTo.getDataGraph());
    	assertNotNull(copyPObillTo.getDataGraph());
    	// item property is unidirectional or containment=false - still in the dataGraph in this case
    	assertNotNull(copyPOitem1.getDataGraph());
    	assertNotNull(copyPOitem2.getDataGraph());
    	
    	// Check that the CS is set on all nodes including non-containment ones
    	assertNotNull(copyPOitem1.getChangeSummary());
    	
    }

    public void testDetachDOwithMixedContainmentNonContainmentWithoutCStoDGwithCS() {
    	DefaultSchemaLocationResolver resolver = new DefaultSchemaLocationResolver(new HashMap<QName, String>());
    	registerTypes();
    	List<Type> types = getTypesToGenerateFrom();
        String generatedSchema = ((SDOXSDHelper)xsdHelper).generate(types, resolver);
        //log(generatedSchema);
    	dataGraph.createRootObject(URINAME, COMPANY_TYPENAME);//aDataObject.getType());
    	DataObject aWrappedDO = dataGraph.getRootObject();
    	assertNotNull(aWrappedDO);
    	// TODO
    	assertEquals(aWrappedDO.getType(), dataGraph.getType(URINAME, COMPANY_TYPENAME));

    	DataObject dgDO = populateRootDataGraphDataObject(dataGraph.getRootObject(), types);
    	ListWrapper pOrders = (ListWrapper)dgDO.getList(PO_PATH);
    	int poSize = pOrders.size();
    	assertEquals(1, poSize);

    	// Detach DO    	
    	DataObject detachedDO = (DataObject)pOrders.get(0);
    	detachedDO.detach();

    	
    	ListWrapper pOrdersDGList = (ListWrapper)dgDO.getList(PO_PATH); 
    	int poSizeDG =  pOrdersDGList.size();
    	assertEquals(poSize - 1, poSizeDG);
    	
    	assertEquals(null, detachedDO.getDataGraph());
    	DataObject copyPOshipTo = (DataObject)detachedDO.get("shipTo");
    	DataObject copyPObillTo = (DataObject)detachedDO.get("billTo");
    	DataObject copyPOitem1 = (DataObject)detachedDO.get("item[1]");
    	DataObject copyPOitem2 = (DataObject)detachedDO.get("item[2]");
/*    	
    	// Check dataGraph back pointers recursively (containment only)
    	List<DataObject> copyPreOrderList = preOrderTraversalDataObjectList(detachedDO);
    	assertNotNull(copyPreOrderList);
    	assertEquals(5, copyPreOrderList.size());
    	copyPreOrderList.contains(copyPOshipTo);
    	copyPreOrderList.contains(copyPObillTo);
    	copyPreOrderList.contains(copyPOitem1);
    	copyPreOrderList.contains(copyPOitem2);
*/
    	assertNull(copyPOshipTo.getDataGraph());
    	assertNull(copyPObillTo.getDataGraph());
    	/**
    	 * item property is unidirectional or containment=false - therefore not in the dataGraph.
    	 * However, if the item also has a containment=true reference to itself then it does reference the dataGraph
    	 */
    	assertNull(copyPOitem1.getDataGraph());
    	assertNull(copyPOitem2.getDataGraph());

    	// Check that the CS is not set on all nodes including non-containment ones
    	assertNull(copyPOitem1.getChangeSummary());
    	
    }

    public void testDeleteDOwithMixedContainmentNonContainmentWithoutCStoDGwithCS() {
    	DefaultSchemaLocationResolver resolver = new DefaultSchemaLocationResolver(new HashMap<QName, String>());
    	registerTypes();
    	List<Type> types = getTypesToGenerateFrom();
        ((SDOXSDHelper)xsdHelper).generate(types, resolver);
        //log(generatedSchema);
    	dataGraph.createRootObject(URINAME, COMPANY_TYPENAME);//aDataObject.getType());
    	DataObject aWrappedDO = dataGraph.getRootObject();
    	assertNotNull(aWrappedDO);
    	// TODO
    	assertEquals(aWrappedDO.getType(), dataGraph.getType(URINAME, COMPANY_TYPENAME));

    	DataObject dgDO = populateRootDataGraphDataObject(dataGraph.getRootObject(), types);
    	ListWrapper pOrders = (ListWrapper)dgDO.getList(PO_PATH);
    	int poSize = pOrders.size();
    	assertEquals(1, poSize);
    	
    	// save objects before they are split apart
    	DataObject detachedDO = (DataObject)pOrders.get(0);
    	DataObject copyPOshipTo = (DataObject)detachedDO.get("shipTo");
    	DataObject copyPObillTo = (DataObject)detachedDO.get("billTo");
    	DataObject copyPOitem1 = (DataObject)detachedDO.get("item[1]");
    	DataObject copyPOitem2 = (DataObject)detachedDO.get("item[2]");

    	// Delete DO    	
    	detachedDO.delete();
    	
    	ListWrapper pOrdersDGList = (ListWrapper)dgDO.getList(PO_PATH); 
    	int poSizeDG =  pOrdersDGList.size();
    	assertEquals(poSize - 1, poSizeDG);
    	
    	assertEquals(null, detachedDO.getDataGraph());
/*    	
    	// Check dataGraph back pointers recursively (containment only)
    	List<DataObject> copyPreOrderList = preOrderTraversalDataObjectList(detachedDO);
    	assertNotNull(copyPreOrderList);
    	assertEquals(5, copyPreOrderList.size());
    	copyPreOrderList.contains(copyPOshipTo);
    	copyPreOrderList.contains(copyPObillTo);
    	copyPreOrderList.contains(copyPOitem1);
    	copyPreOrderList.contains(copyPOitem2);
*/
    	assertNull(copyPOshipTo.getDataGraph());
    	assertNull(copyPObillTo.getDataGraph());
    	/**
    	 * item property is unidirectional or containment=false - therefore not in the dataGraph.
    	 * However, if the item also has a containment=true reference to itself then it does reference the dataGraph
    	 */
    	assertNull(copyPOitem1.getDataGraph());
    	assertNull(copyPOitem2.getDataGraph());

    	// Check that the CS is not set on all nodes including non-containment ones
    	assertNull(copyPOitem1.getChangeSummary());
    	
    }

    public void testUnsetDOwithMixedContainmentNonContainmentWithoutCStoDGwithCS() {
    	DefaultSchemaLocationResolver resolver = new DefaultSchemaLocationResolver(new HashMap<QName, String>());
    	registerTypes();
    	List<Type> types = getTypesToGenerateFrom();
        String generatedSchema = ((SDOXSDHelper)xsdHelper).generate(types, resolver);
        //log(generatedSchema);
    	dataGraph.createRootObject(URINAME, COMPANY_TYPENAME);//aDataObject.getType());
    	DataObject aWrappedDO = dataGraph.getRootObject();
    	assertNotNull(aWrappedDO);
    	// TODO
    	assertEquals(aWrappedDO.getType(), dataGraph.getType(URINAME, COMPANY_TYPENAME));

    	DataObject dgDO = populateRootDataGraphDataObject(dataGraph.getRootObject(), types);
    	ListWrapper pOrders = (ListWrapper)dgDO.getList(PO_PATH);
    	int poSize = pOrders.size();
    	assertEquals(1, poSize);

    	// Delete DO    	
    	DataObject detachedDO = (DataObject)pOrders.get(0);
    	dgDO.unset(PO_PATH + "[1]");
    	
    	ListWrapper pOrdersDGList = (ListWrapper)dgDO.getList(PO_PATH); 
    	int poSizeDG =  pOrdersDGList.size();
    	assertEquals(poSize - 1, poSizeDG);
    	
    	assertEquals(null, detachedDO.getDataGraph());
    	DataObject copyPOshipTo = (DataObject)detachedDO.get("shipTo");
    	DataObject copyPObillTo = (DataObject)detachedDO.get("billTo");
    	DataObject copyPOitem1 = (DataObject)detachedDO.get("item[1]");
    	DataObject copyPOitem2 = (DataObject)detachedDO.get("item[2]");
/*    	
    	// Check dataGraph back pointers recursively (containment only)
    	List<DataObject> copyPreOrderList = preOrderTraversalDataObjectList(detachedDO);
    	assertNotNull(copyPreOrderList);
    	assertEquals(5, copyPreOrderList.size());
    	copyPreOrderList.contains(copyPOshipTo);
    	copyPreOrderList.contains(copyPObillTo);
    	copyPreOrderList.contains(copyPOitem1);
    	copyPreOrderList.contains(copyPOitem2);
*/
    	assertNull(copyPOshipTo.getDataGraph());
    	assertNull(copyPObillTo.getDataGraph());
    	/**
    	 * item property is unidirectional or containment=false - therefore not in the dataGraph.
    	 * However, if the item also has a containment=true reference to itself then it does reference the dataGraph
    	 */
    	assertNull(copyPOitem1.getDataGraph());
    	assertNull(copyPOitem2.getDataGraph());

    	// Check that the CS is not set on all nodes including non-containment ones
    	assertNull(copyPOitem1.getChangeSummary());
    }
     
    //public void testDeleteFromDataGraph() {    }
    //public void testDetachFromDataGraph() {    }
    //public void testUnsetFromDataGraph() {    }
    //public void testMoveBetweenDataGraphsUsingSet() {    }
  
    
    /**
     * Adding a child dataObject to an existing rootDataObject on a dataGraph (with/without changeSummary(s))
     * 
     * Start: (add DO2 as a child of DO1 - adding DO2 to the DG)
     * (target DG and DO1)
     *   DG
     *   	--> DO1
     *   		--> (CS1) - variable below
     *   
     *   (single CS on source)
     *   DO2
     *   	---> (CS2) - variable below
     *   or (multiple CS)
     *   DO2
     *   	---> DO3
     *   		---> (CS3) - variable below
     *   	---> DO4
     *   		---> (CS4) - variable below
     *   
     * End: (any CS2,3,4 are not merged into the single CS1 on the DG - exception occurs)
     *   DG
     *   	--> DO1
     *   		--> DO2    
     *   	--> (CS1) - variable below
     * 
     * Use Cases:
     * Target DG:DO1	Source DO2:		Operation:															Results:
     * --------------------------------------------------------------------------------------------------------------------------------------
     * cs=0						cs=0					: add DO (no cs) child to DG (no cs)					: no cs operations 
     * cs=0						cs=1					: add DO (with 1 cs) child to DG (no cs)			: cs is not moved to DG - exception
     * cs=0						cs=n (multiple)	: add DO (with multi-cs) child to DG (no cs)		: cs(s) not merged, not moved to DG - exception
     * cs=1						cs=0					: add DO (no cs) child to DG (with cs)				: no cs operations
     * cs=1						cs=1					: add DO (with 1 cs) child to DG (with cs)			: cs not merged with DG cs - exception
     * cs=1						cs=n (multiple)	: add DO (with multi-cs) child to DG (with cs)	: cs(s) not merged with DG cs - exception
     * 
     */
    //public void testAddChildDOwithoutCStoDGwithoutCS() {   }   	
    //public void testAddChildDOwith1CStoDGwithoutCS() {    }
    //public void testAddChildDOwithMulitpleCStoDGwithoutCS() {    }
    //public void testAddChildDOwithoutCStoDGwithCS() {    }
    //public void testAddChildDOwith1CStoDGwithCS() {    }
    //public void testAddChildDOwithMulipleCStoDGwithCS() {    }

    /**
     * Perform all operations where isContainment() check is performed in SDODataObject - but with the DO inside a DG 
     * so that non-containment DO's are treated as containment while in the DataGraph scope.
     */
    
    public static void main(String[] args) {
        String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.model.datagraph.SDODataGraphDataObjectBackPointerTest" };
        TestRunner.main(arguments);
    }
    
}
