/*
 * Copyright (c) 1998, 2020 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.sdo.model.changesummary;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import junit.textui.TestRunner;
import org.eclipse.persistence.sdo.SDOChangeSummary;
import org.eclipse.persistence.sdo.SDODataObject;
import org.eclipse.persistence.sdo.ValueStore;
import org.eclipse.persistence.sdo.helper.ListWrapper;
import org.eclipse.persistence.testing.sdo.SDOTestCase;
import commonj.sdo.ChangeSummary;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
import commonj.sdo.helper.XMLDocument;

/**
 * This test suite will exercise mulit-operations on changeSummaries that are below the root as well as inter-changeSummary ops.
 *
 * metamodel (DataObjects only shown)
 * corp1 (s(16 + 15) d(15) + stock(12) = 58 children)
 *    -> sales
 *       -> po[1]
 *          -> CS (15 children)
 *          -> buyer(employee)
 *          -> billTo (address)
 *          -> shipTo (address)
 *             -> yard
 *             -> phone[1]
 *             -> phone[2]
 *          -> items
 *             -> item[1]
 *                -> product
 *                   -> price[1]
 *                   -> price[2]
 *             -> item[2]
 *                -> product
 *                   -> price[1]
 *                   -> price[2]
 *       -> po[2]
 *          -> CS (14 children)
 *          -> billTo (address)
 *          -> shipTo (address)
 *             -> yard
 *             -> phone[1]
 *             -> phone[2]
 *          -> items
 *             -> item[1]
 *                -> product
 *                   -> price[1]
 *                   -> price[2]
 *             -> item[2]
 *                -> product
 *                   -> price[1]
 *                   -> price[2]
 *    -> development
 *       -> employee[1]
 *       -> po[1]
 *          -> CS (14 children)
 *          -> billTo (address)
 *          -> shipTo (address)
 *             -> yard
 *             -> phone[1]
 *             -> phone[2]
 *          -> items
 *             -> item[1]
 *                -> product
 *                   -> price[1]
 *                   -> price[2]
 *             -> item[2]
 *                -> product
 *                   -> price[1]
 *                   -> price[2]
 *    -> stock[1]
 *       -> CS (3 children)
 *       -> results
 *          -> dividend
 *             -> cash
 *    -> stock[2]
 *       -> CS (3 children)
 *       -> results
 *          -> dividend
 *             -> cash
 *    -> stock[3]
 *       -> CS (3 children)
 *       -> results
 *          -> dividend
 *             -> cash
 */
public class ChangeSummaryXSDWithCSonChildUndoTestCases extends ChangeSummaryXSDWithCSonChildProject {

    /**
     * Single Operations:
     *    move (set or detach/set)
     *    swap (detach from index 1 of a filled 2 index list - set to index 2 (previous index 2 has moved to index 1 after the detach)
     *    reset (detach/unset an object, then set it back, or set(again))
     *    add (set)
     *
     * Multi-Operations (4 types):
     *     moving between...
     *        2 cs in same tree
     *           corp1.cs1 and corp1.cs2 (same tree)
     *           corp1.cs1 and outside cs1 (same tree)
     *
     *        2 cs in different trees
     *           corp1.cs1 and corp2.cs1 (different tree)
     *           corp1.cs1 and corp2 outside cs1 (different tree)
     *
     *
     * UC 10.1             move corp1.sales.po1.buyer outside/above cs1 to corp1.sales.emp[1] (same tree/ out of cs)
     * UC 10.2             move corp1.sales.emp[1] inside/down to cs1 as sales.po1.buyer (same tree/ into cs)
     * UC 10.3            move obj inside corp1.sales.po1 to itself
     * UC 10.3.1            move obj inside corp1.cs1 (same tree/same cs)
     * UC 10.3.2             swap obj inside corp1.cs1 (same tree/same cs)
     * UC 10.3.3             reset obj inside corp1.cs1 (same tree/same cs)
     * UC 10.4             move corp1.sales.po2.emp(buyer) outside/above cs1 to corp2 as sales.emp (diff tree/ out of cs)
     * UC 10.5             move corp2.sales.emp inside/down into corp1.sales.po2.buyer (diff tree/ into cs)
     * UC 10.6            move corp2.sales.po1.obj to corp2.sales.obj (different tree/different cs)
     * UC 10.7            move corp1.sales.po1.obj to corp1.sales.po2.obj (same tree/different cs)
     * UC 10.8            move corp1.sales.obj above cs to corp2.sales.obj (different tree/no cs)
     * UC 10.9            move obj corp1.sales.obj above cs to itself
     * UC 10.9.1            move obj above cs (same tree/ no cs)
     * UC 10.9.2            swap obj above cs (same tree/ no cs)
     * UC 10.9.3            reset obj above cs (same tree/ no cs)
     */
    public ChangeSummaryXSDWithCSonChildUndoTestCases(String name) {
        super(name);
    }

    public static void main(String[] args) {
        String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.model.changesummary.ChangeSummaryXSDWithCSonChildUndoTestCases" };
        TestRunner.main(arguments);
    }

    public void setUp() {
        super.setUp();// watch setup redundancy
    }

    // see bug #5878605: SDO: COPYHELPER.COPY() LOGS CS CHANGES - SHOULD SUSPEND LOGGING DURING COPY
    // we dont want changes to occur during the embedded set() calls in copy()
    // this test should be in the following location but this suite has a deeper model in order to fully test the bug see SDOCopyHelperDeepCopyTest.testDeepCopyObjectWithCSLoggingOnDoesNotLogChangesInTheDeepCopy()
    public void testDeepCopyObjectWithCSLoggingOnDoesNotLogChangesInTheDeepCopy() {
        List preOrderList = null;
        int numberOfDataObjectsInSubTree = 0;
        DataObject salesDO = rootObject.getDataObject("sales");
        DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");

        // verify logging is on
        //ChangeSummary salesPO1DO_cs = salesPO1DO.getChangeSummary();
        //assertNotNull(salesPO1DO_cs);
        // turn on logging
        salesPO1CS.beginLogging();
        assertTrue(salesPO1CS.isLogging());
        salesPO2CS.beginLogging();
        assertTrue(salesPO2CS.isLogging());
        developmentPO1CS.beginLogging();
        assertTrue(developmentPO1CS.isLogging());
        stock1CS.beginLogging();
        assertTrue(stock1CS.isLogging());
        stock2CS.beginLogging();
        assertTrue(stock1CS.isLogging());
        stock3CS.beginLogging();
        assertTrue(stock1CS.isLogging());

        // take an object with CS on and deep copy it
        SDODataObject copy = (SDODataObject)copyHelper.copy(rootObject);

        DataObject salesDO2 = copy.getDataObject("sales");
        DataObject salesPO1DO2 = salesDO2.getDataObject("purchaseOrder[1]");
        ChangeSummary salesPO1DO2_cs2 = salesPO1DO2.getChangeSummary();

        // verify that logging is still on
        assertNotNull(salesPO1DO2_cs2);
        assertTrue(salesPO1DO2_cs2.isLogging());
        // verify that we have not logged changes during the copy (we dont have to worry about nested changesummaries)
        assertEquals(0, salesPO1DO2_cs2.getChangedDataObjects().size());// we should not have 4 old settings after a copy
        preOrderList = preOrderTraversalDataObjectList((SDODataObject)salesPO1DO2, false);
        numberOfDataObjectsInSubTree = preOrderList.size();
        // assume that for logging=true copies we should have oldContainer, oldContProperties
        assertEquals(16, numberOfDataObjectsInSubTree);
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)salesPO1DO2_cs2).getOldContainer().size());
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)salesPO1DO2_cs2).getOldContainmentProperty().size());

        DataObject salesPO2DO2 = salesDO2.getDataObject("purchaseOrder[2]");
        ChangeSummary salesPO2DO2_cs2 = salesPO2DO2.getChangeSummary();

        // verify that logging is still on
        assertNotNull(salesPO2DO2_cs2);
        assertTrue(salesPO2DO2_cs2.isLogging());
        assertEquals(0, salesPO2DO2_cs2.getChangedDataObjects().size());// we should not have 5 old settings after a copy
        preOrderList = preOrderTraversalDataObjectList((SDODataObject)salesPO2DO2, false);
        numberOfDataObjectsInSubTree = preOrderList.size();
        assertEquals(15, numberOfDataObjectsInSubTree);
        // assume that for logging=true copies we should have oldContainer, oldContProperties
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)salesPO2DO2_cs2).getOldContainer().size());
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)salesPO2DO2_cs2).getOldContainmentProperty().size());

        DataObject devDO2 = copy.getDataObject("development");
        DataObject devPO1DO2 = devDO2.getDataObject("purchaseOrder[1]");
        ChangeSummary devPO1DO2_cs2 = devPO1DO2.getChangeSummary();

        // verify that logging is still on
        assertNotNull(devPO1DO2_cs2);
        assertTrue(devPO1DO2_cs2.isLogging());
        assertEquals(0, devPO1DO2_cs2.getChangedDataObjects().size());// we should not have 15 old settings after a copy
        // verify that the number of DataObjects is equal to the number of oldContainers for them
        preOrderList = preOrderTraversalDataObjectList((SDODataObject)devPO1DO2, false);
        numberOfDataObjectsInSubTree = preOrderList.size();
        assertEquals(15, numberOfDataObjectsInSubTree);
        // assume that for logging=true copies we should have oldContainer, oldContProperties
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)devPO1DO2_cs2).getOldContainer().size());
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)devPO1DO2_cs2).getOldContainmentProperty().size());
        assertEquals(((SDOChangeSummary)developmentPO1CS).getOldContainer().size(), ((SDOChangeSummary)devPO1DO2_cs2).getOldContainer().size());

        DataObject stock1DO2 = copy.getDataObject("stock[1]");
        ChangeSummary stock1DO2_cs2 = stock1DO2.getChangeSummary();

        // verify that logging is still on
        assertNotNull(stock1DO2_cs2);
        assertTrue(stock1DO2_cs2.isLogging());
        assertEquals(0, stock1DO2_cs2.getChangedDataObjects().size());// we should not have 4 old settings after a copy
        // verify that the number of DataObjects is equal to the number of oldContainers for them
        preOrderList = preOrderTraversalDataObjectList((SDODataObject)stock1DO2, false);
        numberOfDataObjectsInSubTree = preOrderList.size();
        assertEquals(4, numberOfDataObjectsInSubTree);
        // assume that for logging=true copies we should have oldContainer, oldContProperties
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)stock1DO2_cs2).getOldContainer().size());
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)stock1DO2_cs2).getOldContainmentProperty().size());

        DataObject stock2DO2 = copy.getDataObject("stock[2]");
        ChangeSummary stock2DO2_cs2 = stock2DO2.getChangeSummary();

        // verify that logging is still on
        assertNotNull(stock2DO2_cs2);
        assertTrue(stock2DO2_cs2.isLogging());
        assertEquals(0, stock2DO2_cs2.getChangedDataObjects().size());// we should not have 4 old settings after a copy
        // verify that the number of DataObjects is equal to the number of oldContainers for them
        preOrderList = preOrderTraversalDataObjectList((SDODataObject)stock2DO2, false);
        numberOfDataObjectsInSubTree = preOrderList.size();
        assertEquals(4, numberOfDataObjectsInSubTree);
        // assume that for logging=true copies we should have oldContainer, oldContProperties
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)stock2DO2_cs2).getOldContainer().size());
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)stock2DO2_cs2).getOldContainmentProperty().size());

        DataObject stock3DO2 = copy.getDataObject("stock[3]");
        ChangeSummary stock3DO2_cs2 = stock3DO2.getChangeSummary();

        // verify that logging is still on
        assertNotNull(stock3DO2_cs2);
        assertTrue(stock3DO2_cs2.isLogging());
        assertEquals(0, stock3DO2_cs2.getChangedDataObjects().size());// we should not have 4 old settings after a copy
        // verify that the number of DataObjects is equal to the number of oldContainers for them
        preOrderList = preOrderTraversalDataObjectList((SDODataObject)stock3DO2, false);
        numberOfDataObjectsInSubTree = preOrderList.size();
        assertEquals(4, numberOfDataObjectsInSubTree);
        // assume that for logging=true copies we should have oldContainer, oldContProperties
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)stock3DO2_cs2).getOldContainer().size());
        assertEquals(numberOfDataObjectsInSubTree, ((SDOChangeSummary)stock3DO2_cs2).getOldContainmentProperty().size());

    }

    //*  UC 10.3            move obj inside corp1.sales.po1 to itself
    //* UC 10.3.1            move obj inside corp1.cs1 (same tree/same cs)
    //* UC 10.3.2             swap obj inside corp1.cs1 (same tree/same cs)
    //* UC 10.3.3             reset obj inside corp1.cs1 (same tree/same cs)
    //* UC 10.6    .1        move corp2.sales.po1.obj to corp2.sales.obj (different tree/different cs) using single op set
    //* UC 10.6.2        move corp2.sales.po1.obj to corp2.sales.obj (different tree/different cs) using dual op detach/set
    public void testMoveUsingSetBetweenDifferentTreesInDifferentChangeSummarysAndUndo_MoveItemsInTree1CS1toTree2CS2() {
        // save original root for later comparison after undo
        DataObject originalRootDO = copyHelper.copy(rootObject);

        assertTrue(equalityHelper.equal(rootObject, originalRootDO));

        DataObject salesDO = rootObject.getDataObject("sales");
        DataObject salesDO2 = rootObject2.getDataObject("sales");
        DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");
        DataObject originalSalesPO1DO = copyHelper.copy(salesPO1DO);
        assertTrue(equalityHelper.equal(salesPO1DO, originalSalesPO1DO));

        DataObject salesPO2DO = salesDO.getDataObject("purchaseOrder[2]");
        DataObject salesPO1DO2 = salesDO2.getDataObject("purchaseOrder[1]");

        DataObject salesPO2DO2 = salesDO2.getDataObject("purchaseOrder[2]");

        DataObject salesPO1BuyerDO = salesPO1DO.getDataObject("buyer");
        DataObject salesPO2BuyerDO = salesPO2DO.getDataObject("buyer");
        DataObject salesPO1BuyerDO2 = salesPO1DO2.getDataObject("buyer");
        DataObject salesPO2BuyerDO2 = salesPO2DO2.getDataObject("buyer");

        DataObject salesPO1ItemsDO = salesPO1DO.getDataObject("items");
        DataObject salesPO2ItemsDO = salesPO2DO.getDataObject("items");
        DataObject salesPO1ItemsDO2 = salesPO1DO2.getDataObject("items");
        DataObject salesPO2ItemsDO2 = salesPO2DO2.getDataObject("items");

        DataObject salesPO1Item1DO = salesPO1ItemsDO.getDataObject("item[1]");
        DataObject salesPO1Item2DO = salesPO1ItemsDO.getDataObject("item[2]");
        DataObject salesPO2Item1DO = salesPO2ItemsDO.getDataObject("item[1]");
        DataObject salesPO2Item2DO = salesPO2ItemsDO.getDataObject("item[2]");

        DataObject salesPO1Item1ProductDO = salesPO1Item1DO.getDataObject("product");
        DataObject salesPO1Item2ProductDO = salesPO1Item2DO.getDataObject("product");
        DataObject salesPO2Item1ProductDO = salesPO2Item1DO.getDataObject("product");
        DataObject salesPO2Item2ProductDO = salesPO2Item2DO.getDataObject("product");

        DataObject salesPO1Item1ProductPrice1DO = salesPO1Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item1ProductPrice2DO = salesPO1Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO1Item2ProductPrice1DO = salesPO1Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item2ProductPrice2DO = salesPO1Item2ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item1ProductPrice1DO = salesPO2Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item1ProductPrice2DO = salesPO2Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item2ProductPrice1DO = salesPO2Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item2ProductPrice2DO = salesPO2Item2ProductDO.getDataObject("price[2]");

        //DataObject developmentDO = rootObject.getDataObject("development");
        DataObject stock1DO = rootObject.getDataObject("stock[1]");
        DataObject stock2DO = rootObject.getDataObject("stock[2]");
        DataObject stock3DO = rootObject.getDataObject("stock[3]");

        assertNull(salesDO.getChangeSummary());
        assertNotNull(salesPO1DO.getChangeSummary());
        assertNotNull(salesPO2DO.getChangeSummary());
        assertNotNull(salesPO1ItemsDO.getChangeSummary());
        assertNotNull(salesPO2ItemsDO.getChangeSummary());

        assertNull(salesDO2.getChangeSummary());
        assertNotNull(salesPO1DO2.getChangeSummary());
        assertNotNull(salesPO2DO2.getChangeSummary());
        assertNotNull(salesPO1ItemsDO2.getChangeSummary());
        assertNotNull(salesPO2ItemsDO2.getChangeSummary());

        // preoperation setup
        // delete the original items on the 2nd tree
        salesPO1ItemsDO2.detach();
        DataObject originalSalesPO1DO2 = copyHelper.copy(salesPO1DO2);
        assertTrue(equalityHelper.equal(salesPO1DO2, originalSalesPO1DO2));

        salesPO1CS.beginLogging();
        salesPO2CS.beginLogging();
        stock1CS.beginLogging();
        stock2CS.beginLogging();
        stock3CS.beginLogging();

        salesPO1CS2.beginLogging();
        salesPO2CS2.beginLogging();
        stock1CS2.beginLogging();
        stock2CS2.beginLogging();
        stock3CS2.beginLogging();

        // verify original VS is null and save a copy of current VS for object identity testing after undo
        assertValueStoresInitializedAfterLoggingOn(salesPO1DO);
        assertValueStoresInitializedAfterLoggingOn(salesPO2DO);
        assertValueStoresInitializedAfterLoggingOn(stock1DO);
        assertValueStoresInitializedAfterLoggingOn(stock2DO);
        assertValueStoresInitializedAfterLoggingOn(stock3DO);
        // save a copy of current VS for object identity testing after undo
        ValueStore aCurrentValueStoreAfterLoggingFirstOn = ((SDODataObject)salesPO1DO)._getCurrentValueStore();

        // move from buyer to emp[1]
        salesPO1DO2.set("items", salesPO1ItemsDO);
        //salesDO.set("employee[2]", null); NPE
        boolean wasDeleted = false;
        boolean wasReattachedInContextOfSourceChangeSummary = false;
        boolean wasReattachedInContextOfDestinationChangeSummary = true;

        assertModified(salesPO1DO, salesPO1CS);// buyer was set to null
        assertModified(salesPO1DO2, salesPO1CS2);// buyer was set to null
        assertNull(salesPO1DO.get("items"));
        assertNotNull(salesPO1DO2.get("items"));
        // moving an object outside and reattaching in another tree with another cs clears it from the original cs tree
        assertDetached(salesPO1ItemsDO, salesPO1CS, wasDeleted, wasReattachedInContextOfSourceChangeSummary, false);
        assertCreated(salesPO1ItemsDO, salesPO1CS2);
        //assertUnchanged(someChildofBuyerDO, salesPO1CS);
        assertEquals(10, salesPO1CS.getChangedDataObjects().size());// 1 + 9
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainer().size());
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size());

        assertEquals(2, salesPO1CS2.getChangedDataObjects().size());
        // 20070228: all copies of the CS now contain the full # of old* references
        assertEquals(7, ((SDOChangeSummary)salesPO1CS2).getOldContainer().size());
        assertEquals(7, ((SDOChangeSummary)salesPO1CS2).getOldContainmentProperty().size());

        //assertValueStoresReturnedToStartStateAfterUndoChanges(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);
        //writeXML(rootObject, URINAME, TYPENAME, System.out);
        // undo first changeSummary
        assertUndoChangesEqualToOriginal(salesPO1CS, salesPO1DO, originalSalesPO1DO);
        //assertUndoChangesEqualToOriginal(salesPO1CS2, salesPO1DO2, originalSalesPO1DO2);
        // verify that the objects are returned back to their original stes
        assertNotNull(salesPO1DO.get("items"));// undo should bring back the deepcopy not the original
        assertNotNull(salesPO1DO2.get("items"));

        // undo 2nd changeSummary
        //assertUndoChangesEqualToOriginal(salesPO1CS, salesPO1DO, originalSalesPO1DO);
        assertUndoChangesEqualToOriginal(salesPO1CS2, salesPO1DO2, originalSalesPO1DO2);
        // verify that the objects are returned back to their original stes
        assertNotNull(salesPO1DO.get("items"));
        assertNull(salesPO1DO2.get("items"));
        List preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
        assertEquals(62, preOrderList.size());
    }

    //* UC 10.7            move corp1.sales.po1.obj to corp1.sales.po2.obj (same tree/different cs)
    //* UC 10.8            move corp1.sales.obj above cs to corp2.sales.obj (different tree/no cs)
    //* UC 10.9            move obj corp1.sales.obj above cs to itself
    //* UC 10.9.1            move obj above cs (same tree/ no cs)
    //* UC 10.9.2            swap obj above cs (same tree/ no cs)
    //* UC 10.9.3            reset obj above cs (same tree/ no cs)
    //* UC 10.1             move corp1.sales.po1.buyer outside/above cs1 to corp1.sales.emp[1] (same tree/ out of cs)
    public void testMoveWithinSameTreeOutOfChangeSummaryAndUndo_MoveBuyerInCS1upasEmployeeOnParentWithoutCS() {
        // save original root for later comparison after undo
        DataObject originalRootDO = copyHelper.copy(rootObject);
        assertTrue(equalityHelper.equal(rootObject, originalRootDO));

        DataObject salesDO = rootObject.getDataObject("sales");
        DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");
        DataObject originalSalesPO1DO = copyHelper.copy(salesPO1DO);
        assertTrue(equalityHelper.equal(salesPO1DO, originalSalesPO1DO));
        DataObject salesPO2DO = salesDO.getDataObject("purchaseOrder[2]");

        DataObject salesPO1BuyerDO = salesPO1DO.getDataObject("buyer");
        DataObject salesPO2BuyerDO = salesPO2DO.getDataObject("buyer");

        DataObject salesPO1ItemsDO = salesPO1DO.getDataObject("items");
        DataObject salesPO2ItemsDO = salesPO2DO.getDataObject("items");

        DataObject salesPO1Item1DO = salesPO1ItemsDO.getDataObject("item[1]");
        DataObject salesPO1Item2DO = salesPO1ItemsDO.getDataObject("item[2]");
        DataObject salesPO2Item1DO = salesPO2ItemsDO.getDataObject("item[1]");
        DataObject salesPO2Item2DO = salesPO2ItemsDO.getDataObject("item[2]");

        DataObject salesPO1Item1ProductDO = salesPO1Item1DO.getDataObject("product");
        DataObject salesPO1Item2ProductDO = salesPO1Item2DO.getDataObject("product");
        DataObject salesPO2Item1ProductDO = salesPO2Item1DO.getDataObject("product");
        DataObject salesPO2Item2ProductDO = salesPO2Item2DO.getDataObject("product");

        DataObject salesPO1Item1ProductPrice1DO = salesPO1Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item1ProductPrice2DO = salesPO1Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO1Item2ProductPrice1DO = salesPO1Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item2ProductPrice2DO = salesPO1Item2ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item1ProductPrice1DO = salesPO2Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item1ProductPrice2DO = salesPO2Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item2ProductPrice1DO = salesPO2Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item2ProductPrice2DO = salesPO2Item2ProductDO.getDataObject("price[2]");

        //DataObject developmentDO = rootObject.getDataObject("development");
        DataObject stock1DO = rootObject.getDataObject("stock[1]");
        DataObject stock2DO = rootObject.getDataObject("stock[2]");
        DataObject stock3DO = rootObject.getDataObject("stock[3]");

        assertNull(salesDO.getChangeSummary());
        assertNotNull(salesPO1DO.getChangeSummary());
        assertNotNull(salesPO2DO.getChangeSummary());
        assertNotNull(salesPO1ItemsDO.getChangeSummary());
        assertNotNull(salesPO2ItemsDO.getChangeSummary());

        // preoperation setup
        salesPO1CS.beginLogging();
        salesPO2CS.beginLogging();
        stock1CS.beginLogging();
        stock2CS.beginLogging();
        stock3CS.beginLogging();

        // verify original VS is null and save a copy of current VS for object identity testing after undo
        assertValueStoresInitializedAfterLoggingOn(salesPO1DO);
        assertValueStoresInitializedAfterLoggingOn(salesPO2DO);
        assertValueStoresInitializedAfterLoggingOn(stock1DO);
        assertValueStoresInitializedAfterLoggingOn(stock2DO);
        assertValueStoresInitializedAfterLoggingOn(stock3DO);
        // save a copy of current VS for object identity testing after undo
        ValueStore aCurrentValueStoreAfterLoggingFirstOn = ((SDODataObject)salesPO1DO)._getCurrentValueStore();

        // move from buyer to emp[1]
        salesDO.set("employee[1]", salesPO1BuyerDO);
        //salesDO.set("employee[2]", null); NPE
        boolean wasDeleted = false;
        boolean wasReattachedInContextOfAChangeSummary = false;

        assertModified(salesPO1DO, salesPO1CS);// buyer was set to null
        assertNull(salesPO1DO.get("buyer"));
        // moving an object outside and reattaching above clears it from the cs tree
        assertDetached(salesPO1BuyerDO, salesPO1CS, wasDeleted, wasReattachedInContextOfAChangeSummary, false);
        //assertUnchanged(someChildofBuyerDO, salesPO1CS);
        assertEquals(2, salesPO1CS.getChangedDataObjects().size());
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainer().size());//  from 14 (sales has 2 PO's not 1)
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size());

        //assertValueStoresReturnedToStartStateAfterUndoChanges(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);
        //writeXML(rootObject, URINAME, TYPENAME, System.out);
        // undo will only work on the cs subtree, objects modified above - stay modified
        assertUndoChangesEqualToOriginal(salesPO1CS, salesPO1DO, originalSalesPO1DO);
        // verify that the object above the tree is still set
        assertNotNull(salesDO.get("employee[1]"));
        assertNotNull(salesPO1DO.get("buyer"));
        List preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
        assertEquals(63, preOrderList.size());
    }

    //* UC 10.2             move corp1.sales.emp[1] inside/down to cs1 as sales.po1.buyer (same tree/ into cs)
    public void testMoveWithinSameTreeIntoChildChangeSummaryAndUndo_MoveEmployeeDownIntoCS1asBuyerOfCurrentWithoutCS() {
        // save original root for later comparison after undo
        DataObject originalRootDO = copyHelper.copy(rootObject);
        assertTrue(equalityHelper.equal(rootObject, originalRootDO));

        DataObject salesDO = rootObject.getDataObject("sales");
        DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");
        DataObject salesPO2DO = salesDO.getDataObject("purchaseOrder[2]");

        DataObject salesPO1BuyerDO = salesPO1DO.getDataObject("buyer");
        DataObject salesPO2BuyerDO = salesPO2DO.getDataObject("buyer");

        DataObject salesPO1ItemsDO = salesPO1DO.getDataObject("items");
        DataObject salesPO2ItemsDO = salesPO2DO.getDataObject("items");

        DataObject salesPO1Item1DO = salesPO1ItemsDO.getDataObject("item[1]");
        DataObject salesPO1Item2DO = salesPO1ItemsDO.getDataObject("item[2]");
        DataObject salesPO2Item1DO = salesPO2ItemsDO.getDataObject("item[1]");
        DataObject salesPO2Item2DO = salesPO2ItemsDO.getDataObject("item[2]");

        DataObject salesPO1Item1ProductDO = salesPO1Item1DO.getDataObject("product");
        DataObject salesPO1Item2ProductDO = salesPO1Item2DO.getDataObject("product");
        DataObject salesPO2Item1ProductDO = salesPO2Item1DO.getDataObject("product");
        DataObject salesPO2Item2ProductDO = salesPO2Item2DO.getDataObject("product");

        DataObject salesPO1Item1ProductPrice1DO = salesPO1Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item1ProductPrice2DO = salesPO1Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO1Item2ProductPrice1DO = salesPO1Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item2ProductPrice2DO = salesPO1Item2ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item1ProductPrice1DO = salesPO2Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item1ProductPrice2DO = salesPO2Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item2ProductPrice1DO = salesPO2Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item2ProductPrice2DO = salesPO2Item2ProductDO.getDataObject("price[2]");

        //DataObject developmentDO = rootObject.getDataObject("development");
        DataObject stock1DO = rootObject.getDataObject("stock[1]");
        DataObject stock2DO = rootObject.getDataObject("stock[2]");
        DataObject stock3DO = rootObject.getDataObject("stock[3]");

        assertNull(salesDO.getChangeSummary());
        assertNotNull(salesPO1DO.getChangeSummary());
        assertNotNull(salesPO2DO.getChangeSummary());
        assertNotNull(salesPO1ItemsDO.getChangeSummary());
        assertNotNull(salesPO2ItemsDO.getChangeSummary());

        // preoperation setup
        // move from buyer to emp[1]
        salesDO.set("employee[1]", salesPO1BuyerDO);
        DataObject originalSalesPO1DO = copyHelper.copy(salesPO1DO);
        assertTrue(equalityHelper.equal(salesPO1DO, originalSalesPO1DO));

        DataObject salesEmp1DO = salesDO.getDataObject("employee[1]");

        salesPO1CS.beginLogging();
        salesPO2CS.beginLogging();
        stock1CS.beginLogging();
        stock2CS.beginLogging();
        stock3CS.beginLogging();

        // verify original VS is null and save a copy of current VS for object identity testing after undo
        assertValueStoresInitializedAfterLoggingOn(salesPO1DO);
        assertValueStoresInitializedAfterLoggingOn(salesPO2DO);
        assertValueStoresInitializedAfterLoggingOn(stock1DO);
        assertValueStoresInitializedAfterLoggingOn(stock2DO);
        assertValueStoresInitializedAfterLoggingOn(stock3DO);
        // save a copy of current VS for object identity testing after undo
        ValueStore aCurrentValueStoreAfterLoggingFirstOn = ((SDODataObject)salesPO1DO)._getCurrentValueStore();

        // move from buyer to emp[1]
        salesPO1DO.set("buyer", salesEmp1DO);
        //salesDO.set("employee[2]", null); NPE
        boolean wasDeleted = false;
        boolean wasReattachedInContextOfAChangeSummary = false;

        assertModified(salesPO1DO, salesPO1CS);// buyer was set to null
        assertEquals(0, salesDO.getList("employee").size());
        // moving an object outside and reattaching above clears it from the cs tree
        assertCreated(salesEmp1DO, salesPO1CS);//, wasDeleted, wasReattachedInContextOfAChangeSummary, false);
        //assertUnchanged(someChildofBuyerDO, salesPO1CS);
        assertEquals(2, salesPO1CS.getChangedDataObjects().size());
        assertEquals(15, ((SDOChangeSummary)salesPO1CS).getOldContainer().size());//  from 14 (sales has 2 PO's not 1)
        assertEquals(15, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size());

        //assertValueStoresReturnedToStartStateAfterUndoChanges(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);
        //writeXML(rootObject, URINAME, TYPENAME, System.out);
        // undo will only work on the cs subtree, objects modified above - stay modified
        assertUndoChangesEqualToOriginal(salesPO1CS, salesPO1DO, originalSalesPO1DO);
        // verify that the object above the tree is still set
        assertEquals(0, salesDO.getList("employee").size());
        assertNull(salesPO1DO.get("buyer"));

    }

    //* UC 10.4             move corp1.sales.po2.emp(buyer) outside/above cs1 to corp2 as sales.emp (diff tree/ out of cs)
    public void testMoveBetweenDifferentTreesOutOfChangeSummaryAndUndo_MoveBuyerInCS1UpasEmployeeOnParentWithoutCSInDiffTree() {
        // save original root for later comparison after undo
        DataObject originalRootDO = copyHelper.copy(rootObject);

        assertTrue(equalityHelper.equal(rootObject, originalRootDO));

        DataObject salesDO = rootObject.getDataObject("sales");
        DataObject salesDO2 = rootObject2.getDataObject("sales");
        DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");
        DataObject salesPO2DO = salesDO.getDataObject("purchaseOrder[2]");
        DataObject salesPO1DO2 = salesDO2.getDataObject("purchaseOrder[1]");
        DataObject salesPO2DO2 = salesDO2.getDataObject("purchaseOrder[2]");

        DataObject salesPO1BuyerDO = salesPO1DO.getDataObject("buyer");
        DataObject salesPO2BuyerDO = salesPO2DO.getDataObject("buyer");
        DataObject salesPO1BuyerDO2 = salesPO1DO2.getDataObject("buyer");
        DataObject salesPO2BuyerDO2 = salesPO2DO2.getDataObject("buyer");

        DataObject salesPO1ItemsDO = salesPO1DO.getDataObject("items");
        DataObject salesPO2ItemsDO = salesPO2DO.getDataObject("items");
        DataObject salesPO1ItemsDO2 = salesPO1DO2.getDataObject("items");
        DataObject salesPO2ItemsDO2 = salesPO2DO2.getDataObject("items");

        DataObject salesPO1Item1DO = salesPO1ItemsDO.getDataObject("item[1]");
        DataObject salesPO1Item2DO = salesPO1ItemsDO.getDataObject("item[2]");
        DataObject salesPO2Item1DO = salesPO2ItemsDO.getDataObject("item[1]");
        DataObject salesPO2Item2DO = salesPO2ItemsDO.getDataObject("item[2]");

        DataObject salesPO1Item1ProductDO = salesPO1Item1DO.getDataObject("product");
        DataObject salesPO1Item2ProductDO = salesPO1Item2DO.getDataObject("product");
        DataObject salesPO2Item1ProductDO = salesPO2Item1DO.getDataObject("product");
        DataObject salesPO2Item2ProductDO = salesPO2Item2DO.getDataObject("product");

        DataObject salesPO1Item1ProductPrice1DO = salesPO1Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item1ProductPrice2DO = salesPO1Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO1Item2ProductPrice1DO = salesPO1Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item2ProductPrice2DO = salesPO1Item2ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item1ProductPrice1DO = salesPO2Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item1ProductPrice2DO = salesPO2Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item2ProductPrice1DO = salesPO2Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item2ProductPrice2DO = salesPO2Item2ProductDO.getDataObject("price[2]");

        //DataObject developmentDO = rootObject.getDataObject("development");
        DataObject stock1DO = rootObject.getDataObject("stock[1]");
        DataObject stock2DO = rootObject.getDataObject("stock[2]");
        DataObject stock3DO = rootObject.getDataObject("stock[3]");

        assertNull(salesDO.getChangeSummary());
        assertNotNull(salesPO1DO.getChangeSummary());
        assertNotNull(salesPO2DO.getChangeSummary());
        assertNotNull(salesPO1ItemsDO.getChangeSummary());
        assertNotNull(salesPO2ItemsDO.getChangeSummary());

        assertNull(salesDO2.getChangeSummary());
        assertNotNull(salesPO1DO2.getChangeSummary());
        assertNotNull(salesPO2DO2.getChangeSummary());
        assertNotNull(salesPO1ItemsDO2.getChangeSummary());
        assertNotNull(salesPO2ItemsDO2.getChangeSummary());

        // preoperation setup
        // move from buyer to emp[1] on tree2
        //salesDO2.set("employee[1]", salesPO1BuyerDO2);
        // delete buyer on tree1
        //salesPO1BuyerDO.delete();
        assertEquals(0, salesDO2.getList("employee").size());

        salesPO1CS.beginLogging();
        salesPO2CS.beginLogging();
        stock1CS.beginLogging();
        stock2CS.beginLogging();
        stock3CS.beginLogging();

        salesPO1CS2.beginLogging();
        salesPO2CS2.beginLogging();
        stock1CS2.beginLogging();
        stock2CS2.beginLogging();
        stock3CS2.beginLogging();

        // verify original VS is null and save a copy of current VS for object identity testing after undo
        assertValueStoresInitializedAfterLoggingOn(salesPO1DO);
        assertValueStoresInitializedAfterLoggingOn(salesPO2DO);
        assertValueStoresInitializedAfterLoggingOn(stock1DO);
        assertValueStoresInitializedAfterLoggingOn(stock2DO);
        assertValueStoresInitializedAfterLoggingOn(stock3DO);
        // save a copy of current VS for object identity testing after undo
        ValueStore aCurrentValueStoreAfterLoggingFirstOn = ((SDODataObject)salesPO1DO)._getCurrentValueStore();

        // move from buyer to emp[1]
        //salesPO1DO.set("buyer", salesEmp1DO2);
        salesDO2.set("employee[1]", salesPO1BuyerDO);
        //salesDO.set("employee[2]", null); NPE
        boolean wasDeleted = false;
        boolean wasReattachedInContextOfAChangeSummary = false;

        assertModified(salesPO1DO, salesPO1CS);// buyer was set to null
        assertNull(salesPO1DO.get("buyer"));
        // moving an object outside and reattaching above clears it from the cs tree
        assertDetached(salesPO1BuyerDO, salesPO1CS, wasDeleted, wasReattachedInContextOfAChangeSummary, false);
        //assertUnchanged(someChildofBuyerDO, salesPO1CS);
        assertEquals(2, salesPO1CS.getChangedDataObjects().size());
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainer().size());//  from 14 (sales has 2 PO's not 1)
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size());

        //assertValueStoresReturnedToStartStateAfterUndoChanges(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);
        //writeXML(rootObject, URINAME, TYPENAME, System.out);
        // null xpath for create
    }

    //* UC 10.5             move corp2.sales.emp inside/down into corp1.sales.po2.buyer (diff tree/ into cs)
    public void testMoveBetweenDifferentTreesIntoChildChangeSummaryAndUndo_MoveEmployeeDownIntoCS1asBuyerOfCurrentWithoutCSInDiffTree() {
        // save original root for later comparison after undo
        DataObject originalRootDO = copyHelper.copy(rootObject);

        assertTrue(equalityHelper.equal(rootObject, originalRootDO));

        DataObject salesDO = rootObject.getDataObject("sales");
        DataObject salesDO2 = rootObject2.getDataObject("sales");
        DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");
        DataObject salesPO2DO = salesDO.getDataObject("purchaseOrder[2]");
        DataObject salesPO1DO2 = salesDO2.getDataObject("purchaseOrder[1]");
        DataObject salesPO2DO2 = salesDO2.getDataObject("purchaseOrder[2]");

        DataObject salesPO1BuyerDO = salesPO1DO.getDataObject("buyer");
        DataObject salesPO2BuyerDO = salesPO2DO.getDataObject("buyer");
        DataObject salesPO1BuyerDO2 = salesPO1DO2.getDataObject("buyer");
        DataObject salesPO2BuyerDO2 = salesPO2DO2.getDataObject("buyer");

        DataObject salesPO1ItemsDO = salesPO1DO.getDataObject("items");
        DataObject salesPO2ItemsDO = salesPO2DO.getDataObject("items");
        DataObject salesPO1ItemsDO2 = salesPO1DO2.getDataObject("items");
        DataObject salesPO2ItemsDO2 = salesPO2DO2.getDataObject("items");

        DataObject salesPO1Item1DO = salesPO1ItemsDO.getDataObject("item[1]");
        DataObject salesPO1Item2DO = salesPO1ItemsDO.getDataObject("item[2]");
        DataObject salesPO2Item1DO = salesPO2ItemsDO.getDataObject("item[1]");
        DataObject salesPO2Item2DO = salesPO2ItemsDO.getDataObject("item[2]");

        DataObject salesPO1Item1ProductDO = salesPO1Item1DO.getDataObject("product");
        DataObject salesPO1Item2ProductDO = salesPO1Item2DO.getDataObject("product");
        DataObject salesPO2Item1ProductDO = salesPO2Item1DO.getDataObject("product");
        DataObject salesPO2Item2ProductDO = salesPO2Item2DO.getDataObject("product");

        DataObject salesPO1Item1ProductPrice1DO = salesPO1Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item1ProductPrice2DO = salesPO1Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO1Item2ProductPrice1DO = salesPO1Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item2ProductPrice2DO = salesPO1Item2ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item1ProductPrice1DO = salesPO2Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item1ProductPrice2DO = salesPO2Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item2ProductPrice1DO = salesPO2Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item2ProductPrice2DO = salesPO2Item2ProductDO.getDataObject("price[2]");

        //DataObject developmentDO = rootObject.getDataObject("development");
        DataObject stock1DO = rootObject.getDataObject("stock[1]");
        DataObject stock2DO = rootObject.getDataObject("stock[2]");
        DataObject stock3DO = rootObject.getDataObject("stock[3]");

        assertNull(salesDO.getChangeSummary());
        assertNotNull(salesPO1DO.getChangeSummary());
        assertNotNull(salesPO2DO.getChangeSummary());
        assertNotNull(salesPO1ItemsDO.getChangeSummary());
        assertNotNull(salesPO2ItemsDO.getChangeSummary());

        assertNull(salesDO2.getChangeSummary());
        assertNotNull(salesPO1DO2.getChangeSummary());
        assertNotNull(salesPO2DO2.getChangeSummary());
        assertNotNull(salesPO1ItemsDO2.getChangeSummary());
        assertNotNull(salesPO2ItemsDO2.getChangeSummary());

        // preoperation setup
        // move from buyer to emp[1] on tree2
        salesDO2.set("employee[1]", salesPO1BuyerDO2);
        // delete buyer on tree1
        salesPO1BuyerDO.delete();

        DataObject salesEmp1DO2 = salesDO2.getDataObject("employee[1]");

        salesPO1CS.beginLogging();
        salesPO2CS.beginLogging();
        stock1CS.beginLogging();
        stock2CS.beginLogging();
        stock3CS.beginLogging();

        salesPO1CS2.beginLogging();
        salesPO2CS2.beginLogging();
        stock1CS2.beginLogging();
        stock2CS2.beginLogging();
        stock3CS2.beginLogging();

        // verify original VS is null and save a copy of current VS for object identity testing after undo
        assertValueStoresInitializedAfterLoggingOn(salesPO1DO);
        assertValueStoresInitializedAfterLoggingOn(salesPO2DO);
        assertValueStoresInitializedAfterLoggingOn(stock1DO);
        assertValueStoresInitializedAfterLoggingOn(stock2DO);
        assertValueStoresInitializedAfterLoggingOn(stock3DO);
        // save a copy of current VS for object identity testing after undo
        ValueStore aCurrentValueStoreAfterLoggingFirstOn = ((SDODataObject)salesPO1DO)._getCurrentValueStore();

        // move from buyer to emp[1]
        salesPO1DO.set("buyer", salesEmp1DO2);
        //salesDO.set("employee[2]", null); NPE
        boolean wasDeleted = false;
        boolean wasReattachedInContextOfAChangeSummary = false;

        assertModified(salesPO1DO, salesPO1CS);// buyer was set to null
        assertEquals(0, salesDO.getList("employee").size());
        // moving an object outside and reattaching above clears it from the cs tree
        assertCreated(salesEmp1DO2, salesPO1CS);//, wasDeleted, wasReattachedInContextOfAChangeSummary, false);
        //assertUnchanged(someChildofBuyerDO, salesPO1CS);
        assertEquals(2, salesPO1CS.getChangedDataObjects().size());
        assertEquals(15, ((SDOChangeSummary)salesPO1CS).getOldContainer().size());//  from 14 (sales has 2 PO's not 1)
        assertEquals(15, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size());

        //assertValueStoresReturnedToStartStateAfterUndoChanges(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);
        //writeXML(rootObject, URINAME, TYPENAME, System.out);
        // null xpath for create
    }

    // move above cs
    // move containing cs
    // move within cs

    /*
    // move between different CS
    public void testTC1MoveMoveSalesPO1ItemsToDifferentCS_MultiOperation_DetachSetComplexSingleWithManyChildBelowRootAndUndo() {
        // sequence (detach from cs1, set on cs2, detach cs2, (re)set on cs1) - or do undo after the first set on cs2
        // save original root for later comparison after undo
        DataObject originalRootDO = copyHelper.copy(rootObject);
        assertTrue(equalityHelper.equal(rootObject, originalRootDO));

        DataObject salesDO = rootObject.getDataObject("sales");
        DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");
        DataObject salesPO2DO = salesDO.getDataObject("purchaseOrder[2]");

        DataObject salesPO1ItemsDO = salesPO1DO.getDataObject("items");
        DataObject salesPO2ItemsDO = salesPO2DO.getDataObject("items");

        DataObject salesPO1Item1DO = salesPO1ItemsDO.getDataObject("item[1]");
        DataObject salesPO1Item2DO = salesPO1ItemsDO.getDataObject("item[2]");
        //DataObject salesPO2Item1DO = salesPO2ItemsDO.getDataObject("item[1]");
        //DataObject salesPO2Item2DO = salesPO2ItemsDO.getDataObject("item[2]");

        DataObject salesPO1Item1ProductDO = salesPO1Item1DO.getDataObject("product");
        DataObject salesPO1Item2ProductDO = salesPO1Item2DO.getDataObject("product");
        //DataObject salesPO2Item1ProductDO = salesPO2Item1DO.getDataObject("product");
        //DataObject salesPO2Item2ProductDO = salesPO2Item2DO.getDataObject("product");

        DataObject salesPO1Item1ProductPrice1DO = salesPO1Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item1ProductPrice2DO = salesPO1Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO1Item2ProductPrice1DO = salesPO1Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item2ProductPrice2DO = salesPO1Item2ProductDO.getDataObject("price[2]");
        //DataObject salesPO2Item1ProductPrice1DO = salesPO2Item1ProductDO.getDataObject("price[1]");
        //DataObject salesPO2Item1ProductPrice2DO = salesPO2Item1ProductDO.getDataObject("price[2]");
        //DataObject salesPO2Item2ProductPrice1DO = salesPO2Item2ProductDO.getDataObject("price[1]");
        //DataObject salesPO2Item2ProductPrice2DO = salesPO2Item2ProductDO.getDataObject("price[2]");

        //DataObject developmentDO = rootObject.getDataObject("development");
        DataObject stock1DO = rootObject.getDataObject("stock[1]");
        DataObject stock2DO = rootObject.getDataObject("stock[2]");
        DataObject stock3DO = rootObject.getDataObject("stock[3]");

        assertNull(salesDO.getChangeSummary());
        assertNotNull(salesPO1DO.getChangeSummary());
        assertNotNull(salesPO2DO.getChangeSummary());
        assertNotNull(salesPO1ItemsDO.getChangeSummary());
        assertNotNull(salesPO2ItemsDO.getChangeSummary());

        // preoperation setup
        // remove po2.items in prep for move (outside cs)
        salesPO2ItemsDO.detach();

        salesPO1CS.beginLogging();
        salesPO2CS.beginLogging();
        stock1CS.beginLogging();
        stock2CS.beginLogging();
        stock3CS.beginLogging();
    }
    */
    /*
        // detach above the CS and verify that CS is intact (Helena Yan)
        public void testDetachResetComplexSingleParentOfCSRootAndUndo() {
            // sequence (detach from above cs1 and reset)
            // save original root for later comparison after undo
            DataObject originalRootDO = copyHelper.copy(rootObject);
            assertTrue(equalityHelper.equal(rootObject, originalRootDO));

            DataObject salesDO = rootObject.getDataObject("sales");
            DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");
            DataObject salesPO2DO = salesDO.getDataObject("purchaseOrder[2]");

            DataObject salesPO1ItemsDO = salesPO1DO.getDataObject("items");
            DataObject salesPO2ItemsDO = salesPO2DO.getDataObject("items");

            DataObject salesPO1Item1DO = salesPO1ItemsDO.getDataObject("item[1]");
            DataObject salesPO1Item2DO = salesPO1ItemsDO.getDataObject("item[2]");
            //DataObject salesPO2Item1DO = salesPO2ItemsDO.getDataObject("item[1]");
            //DataObject salesPO2Item2DO = salesPO2ItemsDO.getDataObject("item[2]");

            DataObject salesPO1Item1ProductDO = salesPO1Item1DO.getDataObject("product");
            DataObject salesPO1Item2ProductDO = salesPO1Item2DO.getDataObject("product");
            //DataObject salesPO2Item1ProductDO = salesPO2Item1DO.getDataObject("product");
            //DataObject salesPO2Item2ProductDO = salesPO2Item2DO.getDataObject("product");

            DataObject salesPO1Item1ProductPrice1DO = salesPO1Item1ProductDO.getDataObject("price[1]");
            DataObject salesPO1Item1ProductPrice2DO = salesPO1Item1ProductDO.getDataObject("price[2]");
            DataObject salesPO1Item2ProductPrice1DO = salesPO1Item2ProductDO.getDataObject("price[1]");
            DataObject salesPO1Item2ProductPrice2DO = salesPO1Item2ProductDO.getDataObject("price[2]");
            //DataObject salesPO2Item1ProductPrice1DO = salesPO2Item1ProductDO.getDataObject("price[1]");
            //DataObject salesPO2Item1ProductPrice2DO = salesPO2Item1ProductDO.getDataObject("price[2]");
            //DataObject salesPO2Item2ProductPrice1DO = salesPO2Item2ProductDO.getDataObject("price[1]");
            //DataObject salesPO2Item2ProductPrice2DO = salesPO2Item2ProductDO.getDataObject("price[2]");

            //DataObject developmentDO = rootObject.getDataObject("development");
            DataObject stock1DO = rootObject.getDataObject("stock[1]");
            DataObject stock2DO = rootObject.getDataObject("stock[2]");
            DataObject stock3DO = rootObject.getDataObject("stock[3]");

            assertNull(salesDO.getChangeSummary());
            assertNotNull(salesPO1DO.getChangeSummary());
            assertNotNull(salesPO2DO.getChangeSummary());
            assertNotNull(salesPO1ItemsDO.getChangeSummary());
            assertNotNull(salesPO2ItemsDO.getChangeSummary());

            // preoperation setup
            // remove po2.items in prep for move (outside cs)
            salesPO2ItemsDO.detach();

            salesPO1CS.beginLogging();
            salesPO2CS.beginLogging();
            stock1CS.beginLogging();
            stock2CS.beginLogging();
            stock3CS.beginLogging();

            // verify original VS is null and save a copy of current VS for object identity testing after undo
            assertValueStoresInitializedAfterLoggingOn(salesPO1DO);
            assertValueStoresInitializedAfterLoggingOn(salesPO2DO);
            assertValueStoresInitializedAfterLoggingOn(stock1DO);
            assertValueStoresInitializedAfterLoggingOn(stock2DO);
            assertValueStoresInitializedAfterLoggingOn(stock3DO);
            // save a copy of current VS for object identity testing after undo
            ValueStore aCurrentValueStoreAfterLoggingFirstOn = ((SDODataObject)salesPO1DO).getCurrentValueStore();

            // 2 operations
            salesPO1DO.unset("items");
            salesPO2DO.set("items", salesPO1ItemsDO);
            // or 1 operation
            //salesPO2DO.set("items", salesPO1ItemsDO);
            boolean wasDeleted = false;

            // verify CS is null on removed trees
            assertChangeSummaryStatusIfClearedIfCSIsAncestor(salesPO1ItemsDO, true);

            // check valueStores
            assertValueStoresCopiedAndSwappedAfterFirstModifyOperation(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);

            assertNotNull(salesPO1Item1DO);
            assertNotNull(salesPO1Item2DO);

            assertModified(salesPO1DO, salesPO1CS);
            assertDetached(salesPO1ItemsDO, salesPO1CS); // 20070206 CS is not being deleted
            assertDetached(salesPO1Item1DO, salesPO1CS, wasDeleted);
            assertDetached(salesPO1Item2DO, salesPO1CS, wasDeleted);
            assertDetached(salesPO1Item1ProductDO, salesPO1CS, wasDeleted);
            assertDetached(salesPO1Item1ProductPrice1DO, salesPO1CS, wasDeleted);
            assertDetached(salesPO1Item1ProductPrice2DO, salesPO1CS, wasDeleted);
            assertDetached(salesPO1Item2ProductDO, salesPO1CS, wasDeleted);
            assertDetached(salesPO1Item2ProductPrice1DO, salesPO1CS, wasDeleted);
            assertDetached(salesPO1Item2ProductPrice2DO, salesPO1CS, wasDeleted);
            assertEquals(10, salesPO1CS.getChangedDataObjects().size());
            assertEquals(15, ((SDOChangeSummary)salesPO1CS).getOldContainer().size());//  from 14 (sales has 2 PO's not 1)
            assertEquals(15, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size());

            // set the items back  (in effect doing an undo)
            salesPO1DO.set("items", salesPO2ItemsDO);

            assertUndoChangesEqualToOriginal(salesPO1CS, rootObject, originalRootDO);

            // verify that property is reset
            assertTrue(salesPO2DO.isSet("items"));
            // get back items object
            DataObject itemsDOundone = salesPO1DO.getDataObject("items");
            // compare with original
            assertTrue(equalityHelper.equal(itemsDOundone, salesPO1ItemsDO));

            assertValueStoresReturnedToStartStateAfterUndoChanges(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);
        }
    */

    // move between different CS
    public void testMoveSalesPO1ItemsToDifferentCS_MultiOperation_DetachSetComplexSingleWithManyChildBelowRootAndUndo() {
        // sequence (detach from cs1, set on cs2, detach cs2, (re)set on cs1) - or do undo after the first set on cs2
        // save original root for later comparison after undo
        DataObject originalRootDO = copyHelper.copy(rootObject);
        assertTrue(equalityHelper.equal(rootObject, originalRootDO));

        DataObject salesDO = rootObject.getDataObject("sales");
        DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");
        DataObject salesPO2DO = salesDO.getDataObject("purchaseOrder[2]");

        DataObject salesPO1ItemsDO = salesPO1DO.getDataObject("items");
        DataObject salesPO2ItemsDO = salesPO2DO.getDataObject("items");

        DataObject salesPO1Item1DO = salesPO1ItemsDO.getDataObject("item[1]");
        DataObject salesPO1Item2DO = salesPO1ItemsDO.getDataObject("item[2]");
        DataObject salesPO2Item1DO = salesPO2ItemsDO.getDataObject("item[1]");
        DataObject salesPO2Item2DO = salesPO2ItemsDO.getDataObject("item[2]");

        DataObject salesPO1Item1ProductDO = salesPO1Item1DO.getDataObject("product");
        DataObject salesPO1Item2ProductDO = salesPO1Item2DO.getDataObject("product");
        DataObject salesPO2Item1ProductDO = salesPO2Item1DO.getDataObject("product");
        DataObject salesPO2Item2ProductDO = salesPO2Item2DO.getDataObject("product");

        DataObject salesPO1Item1ProductPrice1DO = salesPO1Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item1ProductPrice2DO = salesPO1Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO1Item2ProductPrice1DO = salesPO1Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item2ProductPrice2DO = salesPO1Item2ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item1ProductPrice1DO = salesPO2Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item1ProductPrice2DO = salesPO2Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO2Item2ProductPrice1DO = salesPO2Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO2Item2ProductPrice2DO = salesPO2Item2ProductDO.getDataObject("price[2]");

        //DataObject developmentDO = rootObject.getDataObject("development");
        DataObject stock1DO = rootObject.getDataObject("stock[1]");
        DataObject stock2DO = rootObject.getDataObject("stock[2]");
        DataObject stock3DO = rootObject.getDataObject("stock[3]");

        assertNull(salesDO.getChangeSummary());
        assertNotNull(salesPO1DO.getChangeSummary());
        assertNotNull(salesPO2DO.getChangeSummary());
        assertNotNull(salesPO1ItemsDO.getChangeSummary());
        assertNotNull(salesPO2ItemsDO.getChangeSummary());

        List preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
        assertEquals(62, preOrderList.size());

        // preoperation setup
        // remove po2.items in prep for move (outside cs)
        salesPO2ItemsDO.detach();

        preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
        assertEquals(53, preOrderList.size());// 9 nodes removed

        salesPO1CS.beginLogging();
        salesPO2CS.beginLogging();
        stock1CS.beginLogging();
        stock2CS.beginLogging();
        stock3CS.beginLogging();

        // verify original VS is null and save a copy of current VS for object identity testing after undo
        assertValueStoresInitializedAfterLoggingOn(salesPO1DO);
        assertValueStoresInitializedAfterLoggingOn(salesPO2DO);
        assertValueStoresInitializedAfterLoggingOn(stock1DO);
        assertValueStoresInitializedAfterLoggingOn(stock2DO);
        assertValueStoresInitializedAfterLoggingOn(stock3DO);
        // save a copy of current VS for object identity testing after undo
        ValueStore aCurrentValueStoreAfterLoggingFirstOn = ((SDODataObject)salesPO1DO)._getCurrentValueStore();

        // 2 operations
        salesPO1DO.unset("items");

        //salesPO2DO.set("items", salesPO1ItemsDO);
        // or 1 operation
        //salesPO2DO.set("items", salesPO1ItemsDO);
        boolean wasDeleted = false;

        // verify CS is not null on removed sub trees
        assertChangeSummaryStatusIfClearedIfCSIsAncestor(salesPO1ItemsDO, true);//false);

        // check valueStores
        assertValueStoresCopiedAndSwappedAfterFirstModifyOperation(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);

        assertNotNull(salesPO1Item1DO);
        assertNotNull(salesPO1Item2DO);

        // we have oldSettings on the original container
        assertModified(salesPO1DO, salesPO1CS);
        assertDetached(salesPO1ItemsDO, salesPO1CS);
        assertDetached(salesPO1Item1DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item2DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item1ProductDO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item1ProductPrice1DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item1ProductPrice2DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item2ProductDO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item2ProductPrice1DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item2ProductPrice2DO, salesPO1CS, wasDeleted);
        assertEquals(10, salesPO1CS.getChangedDataObjects().size());
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainer().size());//  from 14 (sales has 2 PO's not 1)
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size());

        //writeXML(rootObject, URINAME, TYPENAME, System.out);
        // move the items to the other cs
        salesPO2DO.set("items", salesPO1ItemsDO);

        //assertUndoChangesEqualToOriginal(salesPO1CS, rootObject, originalRootDO);
        // we have oldSettings (null ones) on the new container
        assertModified(salesPO2DO, salesPO2CS);
        assertCreated(salesPO1ItemsDO, salesPO2CS);
        assertUnchanged(salesPO1Item1DO, salesPO2CS);
        assertUnchanged(salesPO1Item2DO, salesPO2CS);
        assertUnchanged(salesPO1Item1ProductDO, salesPO2CS);
        assertUnchanged(salesPO1Item1ProductPrice1DO, salesPO2CS);
        assertUnchanged(salesPO1Item1ProductPrice2DO, salesPO2CS);
        assertUnchanged(salesPO1Item2ProductDO, salesPO2CS);
        assertUnchanged(salesPO1Item2ProductPrice1DO, salesPO2CS);
        assertUnchanged(salesPO1Item2ProductPrice2DO, salesPO2CS);
        assertEquals(2, salesPO2CS.getChangedDataObjects().size());
        assertEquals(6, ((SDOChangeSummary)salesPO2CS).getOldContainer().size());//  from 14 (sales has 2 PO's not 1)
        assertEquals(6, ((SDOChangeSummary)salesPO2CS).getOldContainmentProperty().size());

        // verify that property is set on new container
        assertTrue(salesPO2DO.isSet("items"));
        // get back items object
        DataObject itemsDOundone = salesPO2DO.getDataObject("items");

        // compare with original
        //assertTrue(equalityHelper.equal(itemsDOundone, salesPO2ItemsDO));
        assertFalse(equalityHelper.equal(itemsDOundone, salesPO2ItemsDO));

        //assertValueStoresReturnedToStartStateAfterUndoChanges(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);
        //writeXML(rootObject, URINAME, TYPENAME, System.out);
    }

    // reset
    public void testUnsetSalesPO1ItemsResetAndUndo_MultiOperation_UnsetComplexSingleWithManyChildBelowRootResetAndUndo() {
        // save original root for later comparison after undo
        DataObject originalRootDO = copyHelper.copy(rootObject);
        assertTrue(equalityHelper.equal(rootObject, originalRootDO));

        DataObject salesDO = rootObject.getDataObject("sales");
        DataObject salesPO1DO = salesDO.getDataObject("purchaseOrder[1]");
        DataObject salesPO2DO = salesDO.getDataObject("purchaseOrder[2]");

        DataObject salesPO1ItemsDO = salesPO1DO.getDataObject("items");
        DataObject salesPO2ItemsDO = salesPO2DO.getDataObject("items");

        DataObject salesPO1Item1DO = salesPO1ItemsDO.getDataObject("item[1]");
        DataObject salesPO1Item2DO = salesPO1ItemsDO.getDataObject("item[2]");

        //DataObject salesPO2Item1DO = salesPO2ItemsDO.getDataObject("item[1]");
        //DataObject salesPO2Item2DO = salesPO2ItemsDO.getDataObject("item[2]");
        DataObject salesPO1Item1ProductDO = salesPO1Item1DO.getDataObject("product");
        DataObject salesPO1Item2ProductDO = salesPO1Item2DO.getDataObject("product");

        //DataObject salesPO2Item1ProductDO = salesPO2Item1DO.getDataObject("product");
        //DataObject salesPO2Item2ProductDO = salesPO2Item2DO.getDataObject("product");
        DataObject salesPO1Item1ProductPrice1DO = salesPO1Item1ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item1ProductPrice2DO = salesPO1Item1ProductDO.getDataObject("price[2]");
        DataObject salesPO1Item2ProductPrice1DO = salesPO1Item2ProductDO.getDataObject("price[1]");
        DataObject salesPO1Item2ProductPrice2DO = salesPO1Item2ProductDO.getDataObject("price[2]");

        //DataObject salesPO2Item1ProductPrice1DO = salesPO2Item1ProductDO.getDataObject("price[1]");
        //DataObject salesPO2Item1ProductPrice2DO = salesPO2Item1ProductDO.getDataObject("price[2]");
        //DataObject salesPO2Item2ProductPrice1DO = salesPO2Item2ProductDO.getDataObject("price[1]");
        //DataObject salesPO2Item2ProductPrice2DO = salesPO2Item2ProductDO.getDataObject("price[2]");
        //DataObject developmentDO = rootObject.getDataObject("development");
        DataObject stock1DO = rootObject.getDataObject("stock[1]");
        DataObject stock2DO = rootObject.getDataObject("stock[2]");
        DataObject stock3DO = rootObject.getDataObject("stock[3]");

        assertNull(salesDO.getChangeSummary());
        assertNotNull(salesPO1DO.getChangeSummary());
        assertNotNull(salesPO2DO.getChangeSummary());
        assertNotNull(salesPO1ItemsDO.getChangeSummary());
        assertNotNull(salesPO2ItemsDO.getChangeSummary());

        salesPO1CS.beginLogging();
        salesPO2CS.beginLogging();
        stock1CS.beginLogging();
        stock2CS.beginLogging();
        stock3CS.beginLogging();

        // verify original VS is null and save a copy of current VS for object identity testing after undo
        assertValueStoresInitializedAfterLoggingOn(salesPO1DO);
        assertValueStoresInitializedAfterLoggingOn(salesPO2DO);
        assertValueStoresInitializedAfterLoggingOn(stock1DO);
        assertValueStoresInitializedAfterLoggingOn(stock2DO);
        assertValueStoresInitializedAfterLoggingOn(stock3DO);
        // save a copy of current VS for object identity testing after undo
        ValueStore aCurrentValueStoreAfterLoggingFirstOn = ((SDODataObject)salesPO1DO)._getCurrentValueStore();

        salesPO1DO.unset("items");
        boolean wasDeleted = false;

        // verify CS is null on removed trees
        assertChangeSummaryStatusIfClearedIfCSIsAncestor(salesPO1ItemsDO, true);

        // check valueStores
        assertValueStoresCopiedAndSwappedAfterFirstModifyOperation(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);

        assertNotNull(salesPO1Item1DO);
        assertNotNull(salesPO1Item2DO);

        assertModified(salesPO1DO, salesPO1CS);
        assertDetached(salesPO1ItemsDO, salesPO1CS);// 20070206 CS is not being deleted
        assertDetached(salesPO1Item1DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item2DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item1ProductDO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item1ProductPrice1DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item1ProductPrice2DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item2ProductDO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item2ProductPrice1DO, salesPO1CS, wasDeleted);
        assertDetached(salesPO1Item2ProductPrice2DO, salesPO1CS, wasDeleted);
        assertEquals(10, salesPO1CS.getChangedDataObjects().size());
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainer().size());//  from 14 (sales has 2 PO's not 1)
        assertEquals(16, ((SDOChangeSummary)salesPO1CS).getOldContainmentProperty().size());

        // set the items back  (in effect doing an undo)
        salesPO1DO.set("items", salesPO1ItemsDO);

        assertUndoChangesEqualToOriginal(salesPO1CS, rootObject, originalRootDO);

        // verify that property is reset
        assertTrue(salesPO1DO.isSet("items"));
        // get back items object
        DataObject itemsDOundone = salesPO1DO.getDataObject("items");

        // compare with original
        assertTrue(equalityHelper.equal(itemsDOundone, salesPO1ItemsDO));

        assertValueStoresReturnedToStartStateAfterUndoChanges(salesPO1DO, aCurrentValueStoreAfterLoggingFirstOn);
    }
}
