| /* |
| * Copyright (c) 1998, 2021 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.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 commonj.sdo.ChangeSummary; |
| import commonj.sdo.DataObject; |
| |
| /** |
| * 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); |
| } |
| |
| @Override |
| 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<DataObject> 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<DataObject> 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<DataObject> 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); |
| } |
| } |