blob: d2722df5147d57053e22f0066dcff0a0889f5cc6 [file] [log] [blame]
/*
* 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.ArrayList;
import commonj.sdo.DataObject;
import junit.textui.TestRunner;
import org.eclipse.persistence.sdo.SDOChangeSummary;
import org.eclipse.persistence.sdo.SDODataObject;
import org.eclipse.persistence.sdo.SDOSetting;
import org.eclipse.persistence.sdo.SDOType;
public class ChangeSummaryCreatedModifiedDeletedTests extends ChangeSummaryCreatedModifiedDeletedTestCase {
public ChangeSummaryCreatedModifiedDeletedTests(String name) {
super(name);
}
public static void main(String[] args) {
String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.model.changesummary.ChangeSummaryCreatedModifiedDeletedTests" };
TestRunner.main(arguments);
}
// Failure condition test cases
public void testGetFunctionsWithNullParameters() {
buildTree();
changeSummaryB = dataObjectB.getChangeSummary();
changeSummaryC = dataObjectC.getChangeSummary();
changeSummaryB.beginLogging();
changeSummaryC.beginLogging();
// check a null DO call
assertFalse(changeSummaryB.isDeleted(null));
assertFalse(changeSummaryB.isCreated(null));
assertFalse(changeSummaryB.isModified(null));
assertEquals(new ArrayList(), changeSummaryB.getOldValues(null));
assertNull(changeSummaryB.getOldValue(null, null));
assertNull(changeSummaryB.getOldContainer(null));
assertNull(changeSummaryB.getOldContainmentProperty(null));
//assertNull(changeSummaryB.getOldSequence(null));
}
public void testSetFunctionsWithNullParameters() {
//commented out this test case because it doesn't really make sense
/* buildTree();
changeSummaryB = (SDOChangeSummary)dataObjectB.getChangeSummary();
changeSummaryC = (SDOChangeSummary)dataObjectC.getChangeSummary();
changeSummaryB.beginLogging();
changeSummaryC.beginLogging();
// these operations are not really public and are set from resetChanges
changeSummaryB.setOldContainer(null, null);// HashMap allows null:null
assertNull(changeSummaryB.getOldContainer(null));
changeSummaryB.setOldContainer(null, root);// HashMap allows null:null
// even though we get null=root, the get function always returns null for non-do not in deleted|modified state
assertEquals(null, changeSummaryB.getOldContainer(null));
*/
}
//
public void testIsCreatedAfterMoveDataObjectFromOneOwnerToAnotherSameChangeSummary() {
rootType.addDeclaredProperty(rootChangeSummaryProperty);
root = (SDODataObject)dataFactory.create(rootType);
changeSummaryA = root.getChangeSummary();
buildTreeWithoutChildChangeSummaries();
changeSummaryA.beginLogging();
assertUnchanged(root, changeSummaryA);
assertUnchanged(dataObjectB, changeSummaryA);
assertUnchanged(dataObjectC, changeSummaryA);
assertUnchanged(dataObjectD, changeSummaryA);
assertEquals(0, changeSummaryA.getChangedDataObjects().size());
assertNotNull(dataObjectD.getChangeSummary());
dataObjectD.detach();
// verify CS is null on removed trees
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectD, true);
assertEquals(2, changeSummaryA.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryA);
assertModified(dataObjectB, changeSummaryA);
assertUnchanged(dataObjectC, changeSummaryA);
assertDetached(dataObjectD, changeSummaryA);
// move D as child of C
dataObjectC.set(propertyC, dataObjectD);
// the 3 normally modified-c, modifed-b, deleted-d/created-d flags are reduced to
// 2 modified flags on c and b because created-d cancels deleted-d
assertEquals(2, changeSummaryA.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryA);
assertModified(dataObjectB, changeSummaryA);
assertModified(dataObjectC, changeSummaryA);
//assertModified(dataObjectD, changeSummaryA);
//TODO: A move in a single CS is a delete and create but together they cancel
// the question is do we include the oldContainer change in the change scope
// (with scope limited to the created|modified|deleted sets)
// Spec value
// A: 20070106: Yes we keep oldSettings in the old cs - currently we do not cancel out operations
// unset + (re)set != no changes
//assertUnchanged(dataObjectD, changeSummaryA);
assertFalse(changeSummaryA.isCreated(dataObjectD));
assertFalse(changeSummaryA.isModified(dataObjectD));
assertFalse(changeSummaryA.isDeleted(dataObjectD));
// current value (wrong)
//assertDeleted(dataObjectD, changeSummaryA);
// with oldContainer change in the change scope
//assertModified(dataObjectD, changeSummaryA);
}
public void testIsCreatedAfterMoveDataObjectFromOneOwnerToAnotherDiffChangeSummary() {
buildTree();
changeSummaryB = dataObjectB.getChangeSummary();
changeSummaryC = dataObjectC.getChangeSummary();
changeSummaryB.beginLogging();
changeSummaryC.beginLogging();
assertEquals(0, changeSummaryB.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertUnchanged(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertUnchanged(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
assertNotNull(dataObjectD.getChangeSummary());
dataObjectD.detach();
// verify CS is null on removed trees
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectD, true);
assertEquals(2, changeSummaryB.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertDetached(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
dataObjectC.set(propertyC, dataObjectD);
assertEquals(2, changeSummaryB.getChangedDataObjects().size());
assertEquals(2, changeSummaryC.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertDetached(dataObjectD, changeSummaryB, false); // set after a detach will result in a non-null container
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertModified(dataObjectC, changeSummaryC);
assertCreated(dataObjectD, changeSummaryC);
}
// verify recursive delete sets isSet properly
public void testOldSettingsAfterInternalDeleteOfLevel2of4AfterLoggingOn() {
buildTreeWith4LevelsOfProperties();
changeSummaryB = dataObjectB.getChangeSummary();
changeSummaryB.beginLogging();
assertNotNull(dataObjectD.getChangeSummary());
dataObjectD.delete();
// verify CS is null on removed trees
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectD, true);
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
// both d and child e are deleted (recursively)
assertDeleted(dataObjectD, changeSummaryB);
assertDeleted(dataObjectE, changeSummaryB);
assertEquals(1, changeSummaryB.getOldValues(dataObjectB).size());
assertTrue(changeSummaryB.getOldValue(dataObjectB, propertyB).isSet());
DataObject deepCopyD = (DataObject)changeSummaryB.getDeepCopies().get(dataObjectD);
assertTrue(changeSummaryB.getOldValue(dataObjectB, propertyB).getValue().equals(deepCopyD));
assertTrue(changeSummaryB.getOldContainer(dataObjectD).equals(dataObjectB));
assertTrue(changeSummaryB.getOldContainmentProperty(dataObjectD).equals(propertyB));
//assertEquals(1, dataObjectD.getOldSettings().size());
//assertEquals(1, changeSummaryB.dataObjectD.getOldSettings().size());
SDOSetting aSetting = (SDOSetting)changeSummaryB.getOldValue(dataObjectD, propertyD);
assertTrue(aSetting.isSet());
DataObject deepCopyE = (DataObject)changeSummaryB.getDeepCopies().get(dataObjectE);
assertTrue(aSetting.getValue().equals(deepCopyE));
}
// perform a move of a cs root (delete CCB) to another cs as child and observe the old* instance variables
// TODO: THIS NEEDS TO BE VERIFIED WITH SPEC
//public void testOldSettingsAfterMoveCSDataObjectFromOneOwnerToAnotherDiffChangeSummary() {
public void testDetachCSRoot() {
buildTree();
changeSummaryB = dataObjectB.getChangeSummary();
changeSummaryC = dataObjectC.getChangeSummary();
changeSummaryB.beginLogging();
changeSummaryC.beginLogging();
assertEquals(0, changeSummaryB.getChangedDataObjects().size());
assertEquals(0, changeSummaryC.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertUnchanged(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertUnchanged(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
// oldSettings should not be set
checkOldSettingsSizeTree("0000", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);
checkOldSettingsSizeTree("0000", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
assertNotNull(dataObjectB.getChangeSummary());
dataObjectB.detach();
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectB, false);
assertNotNull(dataObjectB.getChangeSummary());
assertNotNull(dataObjectD.getChangeSummary());
assertEquals(dataObjectB.getChangeSummary(),dataObjectD.getChangeSummary());
assertEquals(0, changeSummaryB.getChangedDataObjects().size());// was 0
assertEquals(0, changeSummaryC.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertUnchanged(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertUnchanged(dataObjectD, changeSummaryB);// unchanged
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
// oldSettings
checkOldSettingsSizeTree("0000", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);// 0000
checkOldSettingsSizeTree("0000", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
}
public void testDeleteCSRoot() {
buildTree();
changeSummaryB = dataObjectB.getChangeSummary();
changeSummaryC = dataObjectC.getChangeSummary();
changeSummaryB.beginLogging();
changeSummaryC.beginLogging();
assertEquals(0, changeSummaryB.getChangedDataObjects().size());
assertEquals(0, changeSummaryC.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertUnchanged(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertUnchanged(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
// oldSettings should not be set
checkOldSettingsSizeTree("0000", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);
checkOldSettingsSizeTree("0000", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
assertNotNull(dataObjectB.getChangeSummary());
dataObjectB.delete();
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectB, false);
assertEquals(2, changeSummaryB.getChangedDataObjects().size());// 1
assertEquals(0, changeSummaryC.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertDeleted(dataObjectD, changeSummaryB);// unchanged
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
// oldSettings
checkOldSettingsSizeTree("0101", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);// 0000
checkOldSettingsSizeTree("0000", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
}
// perform a move of a cs root (delete CCB) to another cs as child and observe the old* instance variables
public void testOldSettingsAfterMoveCSDataObjectFromOneOwnerToAnotherDiffChangeSummaryByUnset() {
buildTree();
changeSummaryB = dataObjectB.getChangeSummary();
changeSummaryC = dataObjectC.getChangeSummary();
changeSummaryB.beginLogging();
changeSummaryC.beginLogging();
assertEquals(0, changeSummaryB.getChangedDataObjects().size());
assertEquals(0, changeSummaryC.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertUnchanged(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertUnchanged(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
// oldSettings should not be set
checkOldSettingsSizeTree("0000", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);
checkOldSettingsSizeTree("0000", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
assertNotNull(dataObjectD.getChangeSummary());
// remove leaf from CS-B off of B
dataObjectB.unset(propertyB);
// verify CS is null on removed trees
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectB, false);
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectD, true);
assertEquals(2, changeSummaryB.getChangedDataObjects().size());
assertEquals(0, changeSummaryC.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertDetached(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
// oldSettings
checkOldSettingsSizeTree("0101", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);
checkOldSettingsSizeTree("0000", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
// add leaf (move) to CS-C off of C
dataObjectC.set(propertyC, dataObjectD);
assertEquals(2, changeSummaryB.getChangedDataObjects().size());
assertEquals(2, changeSummaryC.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertDetached(dataObjectD, changeSummaryB, false); // set after a detach will result in a non-null container
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertModified(dataObjectC, changeSummaryC);
assertCreated(dataObjectD, changeSummaryC);// set propagates recursively
// oldSettings
checkOldSettingsSizeTree("0101", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);
checkOldSettingsSizeTree("0010", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
}
// perform a move between changeSummaries and observe the old* instance variables
public void testOldSettingsAfterMoveDataObjectFromOneOwnerToAnotherDiffChangeSummary() {
buildTree();
changeSummaryB = dataObjectB.getChangeSummary();
changeSummaryC = dataObjectC.getChangeSummary();
changeSummaryB.beginLogging();
changeSummaryC.beginLogging();
assertEquals(0, changeSummaryB.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertUnchanged(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertUnchanged(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
// oldSettings should not be set
checkOldSettingsSizeTree("0000", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);
checkOldSettingsSizeTree("0000", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
// remove leaf from CS-B off of B
assertNotNull(dataObjectD.getChangeSummary());
dataObjectD.detach();
// verify CS is null on removed trees
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectD, true);
assertEquals(2, changeSummaryB.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertDetached(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
// oldSettings
// not in changeSummary
checkOldSettingsSizeTree("0101", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);// 0100
checkOldSettingsSizeTree("0000", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
// add leaf (move) to CS-C off of C
dataObjectC.set(propertyC, dataObjectD);
assertEquals(2, changeSummaryB.getChangedDataObjects().size());
assertEquals(2, changeSummaryC.getChangedDataObjects().size());
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertDetached(dataObjectD, changeSummaryB, false); // set after a detach will result in a non-null container
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertModified(dataObjectC, changeSummaryC);
assertCreated(dataObjectD, changeSummaryC);
// oldSettings
checkOldSettingsSizeTree("0101", changeSummaryB, root, dataObjectB, dataObjectC, dataObjectD);// 1000
checkOldSettingsSizeTree("0010", changeSummaryC, root, dataObjectB, dataObjectC, dataObjectD);
// root
// -> B
// -> CS-B
// -> D (String)
// -> C
// -> CS-C
// check oldContainer all should be set after beginLogging()
checkOldContainer(changeSummaryB,//
root, null,// root is above csB and csC
dataObjectB, root,// B is a child of root at the level of csB
dataObjectC, null,// C is not in csB scope
dataObjectD, dataObjectB);// D is a child of B inside csB scope
checkOldContainer(changeSummaryC,//
root, null,// root is above csB and csC
dataObjectB, null,// B is not in csC scope
dataObjectC, root,// C is in csC scope
dataObjectD, null);// D is inside csB scope
}
public void testIsCreatedAfterUseDataFactory() {
rootType.addDeclaredProperty(rootChangeSummaryProperty);
root = (SDODataObject)dataFactory.create(rootType);
changeSummaryA = root.getChangeSummary();
buildTreeWithoutChildChangeSummaries();
changeSummaryA.beginLogging();
assertUnchanged(root, changeSummaryA);
assertUnchanged(dataObjectB, changeSummaryA);
assertUnchanged(dataObjectC, changeSummaryA);
assertUnchanged(dataObjectD, changeSummaryA);
SDOType type_E = new SDOType("EURI", "E");
SDODataObject dataObjectE = (SDODataObject)dataFactory.create(type_E);
dataObjectC.set(propertyC, dataObjectE);
assertUnchanged(root, changeSummaryA);
assertUnchanged(dataObjectB, changeSummaryA);
assertModified(dataObjectC, changeSummaryA);
assertUnchanged(dataObjectD, changeSummaryA);
assertCreated(dataObjectE, changeSummaryA);
}
// purpose: verify that the CS is cleared
public void testUnsetChildOfCS() {
rootType.addDeclaredProperty(rootChangeSummaryProperty);
root = (SDODataObject)dataFactory.create(rootType);
changeSummaryA = root.getChangeSummary();
buildTreeWithoutChildChangeSummaries();
changeSummaryA.beginLogging();
assertUnchanged(root, changeSummaryA);
assertUnchanged(dataObjectB, changeSummaryA);
assertUnchanged(dataObjectC, changeSummaryA);
assertUnchanged(dataObjectD, changeSummaryA);
assertNotNull(dataObjectD.getChangeSummary());
dataObjectB.unset(propertyB); // unset D
// verify CS is null on removed trees
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectD, true);
assertUnchanged(root, changeSummaryA);
assertModified(dataObjectB, changeSummaryA);
assertUnchanged(dataObjectC, changeSummaryA);
assertDetached(dataObjectD, changeSummaryA);
}
public void testIsCreatedAfterUseUnset() {
rootType.addDeclaredProperty(rootChangeSummaryProperty);
root = (SDODataObject)dataFactory.create(rootType);
changeSummaryA = root.getChangeSummary();
buildTreeWithoutChildChangeSummaries();
changeSummaryA.beginLogging();
assertUnchanged(root, changeSummaryA);
assertUnchanged(dataObjectB, changeSummaryA);
assertUnchanged(dataObjectC, changeSummaryA);
assertUnchanged(dataObjectD, changeSummaryA);
assertNotNull(dataObjectD.getChangeSummary());
dataObjectB.unset(propertyB);
// verify CS is null on removed trees
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectB, false);
assertUnchanged(root, changeSummaryA);
assertModified(dataObjectB, changeSummaryA);
assertUnchanged(dataObjectC, changeSummaryA);
assertDetached(dataObjectD, changeSummaryA);
}
public void testIsCreatedAfterUnSetDiffChangeSummary() {
root = (SDODataObject)dataFactory.create(rootType);
changeSummaryA = root.getChangeSummary();
assertNull(changeSummaryA);
buildTree();
changeSummaryB = dataObjectB.getChangeSummary();
changeSummaryC = dataObjectC.getChangeSummary();
changeSummaryB.beginLogging();
changeSummaryC.beginLogging();
assertUnchanged(root, changeSummaryB);
assertUnchanged(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertUnchanged(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
dataObjectB.unset(propertyB);
// verify CS is null on removed trees
assertChangeSummaryStatusIfClearedIfCSIsAncestor(dataObjectB, false);
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertDetached(dataObjectD, changeSummaryB);
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertUnchanged(dataObjectC, changeSummaryC);
assertUnchanged(dataObjectD, changeSummaryC);
dataObjectC.set(propertyC, dataObjectD);
assertUnchanged(root, changeSummaryB);
assertModified(dataObjectB, changeSummaryB);
assertUnchanged(dataObjectC, changeSummaryB);
assertDetached(dataObjectD, changeSummaryB, false); // set after a detach will result in a non-null container
assertUnchanged(root, changeSummaryC);
assertUnchanged(dataObjectB, changeSummaryC);
assertModified(dataObjectC, changeSummaryC);
assertCreated(dataObjectD, changeSummaryC);
}
}