package org.archstudio.xarchadt.variability; import java.util.List; import org.archstudio.sysutils.UIDGenerator; import org.archstudio.xadl3.hints_3_0.HintsExtension; import org.archstudio.xadl3.hints_3_0.Hints_3_0Package; import org.archstudio.xadl3.structure_3_0.Component; import org.archstudio.xadl3.structure_3_0.Direction; import org.archstudio.xadl3.structure_3_0.Interface; import org.archstudio.xadl3.structure_3_0.Structure; import org.archstudio.xadl3.structure_3_0.Structure_3_0Factory; import org.archstudio.xadl3.structure_3_0.Structure_3_0Package; import org.archstudio.xadl3.variability_3_0.Variability_3_0Factory; import org.archstudio.xadl3.variability_3_0.Variability_3_0Package; import org.archstudio.xadl3.xadlcore_3_0.DocumentRoot; import org.archstudio.xadl3.xadlcore_3_0.XADLType; import org.archstudio.xadl3.xadlcore_3_0.Xadlcore_3_0Factory; import org.archstudio.xadl3.xadlcore_3_0.Xadlcore_3_0Package; import org.archstudio.xarchadt.IXArchADT; import org.archstudio.xarchadt.ObjRef; import org.archstudio.xarchadt.XArchADTProxy; import org.archstudio.xarchadt.common.AbstractXArchADTTest; import org.archstudio.xarchadt.variability.IXArchADTVariability.ChangeStatus; import org.archstudio.xarchadt.variability.core.XArchADTVariabilityImpl; import com.google.common.collect.Lists; @SuppressWarnings("unused") public class XArchADTVariabilityImplTest extends AbstractXArchADTTest { IXArchADTVariability xarch; Xadlcore_3_0Package corePackage; Xadlcore_3_0Factory coreFactory; Variability_3_0Package varPackage; Variability_3_0Factory varFactory; Structure_3_0Package strPackage; Structure_3_0Factory strFactory; DocumentRoot documentRoot; XADLType xadlType; Structure structure; @Override protected IXArchADT createXArch() { return new XArchADTVariabilityImpl(); } @Override public void setUp() throws Exception { super.setUp(); xarch = (IXArchADTVariability) super.xarch; corePackage = Xadlcore_3_0Package.eINSTANCE; coreFactory = XArchADTProxy.proxy(xarch, corePackage.getNsURI()); varPackage = Variability_3_0Package.eINSTANCE; varFactory = XArchADTProxy.proxy(xarch, varPackage.getNsURI()); strPackage = Structure_3_0Package.eINSTANCE; strFactory = XArchADTProxy.proxy(xarch, strPackage.getNsURI()); documentRoot = XArchADTProxy.proxy(xarch, documentRootRef); xadlType = coreFactory.createXADLType(); documentRoot.setXADL(xadlType); structure = strFactory.createStructure(); structure.setId(UIDGenerator.generateUID()); xadlType.getTopLevelElement().add(structure); } public void testAttribute() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> originalChangeSets = xarch.getAppliedChangeSets(documentRootRef); structure.setName("A"); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Rename Structure"); structure.setName("B"); assertEquals("B", structure.getName()); xarch.applyChangeSets(documentRootRef, originalChangeSets); assertEquals("A", structure.getName()); xarch.applyChangeSets(documentRootRef, updatedChangeSets); assertEquals("B", structure.getName()); } public void testAttributeReset() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> originalChangeSets = xarch.getAppliedChangeSets(documentRootRef); structure.setName("A"); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Rename Structure"); structure.setName("B"); assertEquals("B", structure.getName()); xarch.applyChangeSets(documentRootRef, originalChangeSets); assertEquals("A", structure.getName()); structure.setName("B"); assertEquals("A", structure.getName()); xarch.applyChangeSets(documentRootRef, updatedChangeSets); assertEquals("B", structure.getName()); } public void testAdd() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> originalChangeSets = xarch.getAppliedChangeSets(documentRootRef); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Add Component"); Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); assertEquals(oldID, c.getId()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(structure, c.eContainer()); xarch.applyChangeSets(documentRootRef, originalChangeSets); assertEquals(oldID, c.getId()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(null, c.eContainer()); xarch.applyChangeSets(documentRootRef, updatedChangeSets); assertEquals(oldID, c.getId()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(structure, c.eContainer()); } public void testExplicitAdd() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Add Component"); Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); xarch.setExplicitChangeSets(documentRootRef, Lists.newArrayList(updatedChangeSets.get(1))); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); assertEquals(ChangeStatus.EXPLICITLY_ADDED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); xarch.setExplicitChangeSets(documentRootRef, Lists.<ObjRef> newArrayList()); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); } public void testOverviewAdd() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> originalChangeSets = xarch.getAppliedChangeSets(documentRootRef); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Add Component"); Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); xarch.applyChangeSets(documentRootRef, originalChangeSets); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); xarch.setOverviewModeEnabled(documentRootRef, true); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); xarch.setOverviewModeEnabled(documentRootRef, false); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); } public void testRemove() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> originalChangeSets = xarch.getAppliedChangeSets(documentRootRef); Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Remove Component"); structure.getComponent().remove(c); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); xarch.applyChangeSets(documentRootRef, originalChangeSets); // Note: the old objref should be used here assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); xarch.applyChangeSets(documentRootRef, updatedChangeSets); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); } public void testExplicitRemove() { xarch.setChangeSetsEnabled(documentRootRef, true); Component c = strFactory.createComponent(); Interface i = strFactory.createInterface(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); i.setId(UIDGenerator.generateUID()); structure.getComponent().add(c); c.getInterface().add(i); assertEquals(structure, c.eContainer()); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Remove Component"); structure.getComponent().remove(c); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); xarch.setExplicitChangeSets(documentRootRef, Lists.newArrayList(updatedChangeSets.get(1))); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); assertEquals(ChangeStatus.EXPLICITLY_REMOVED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.EXPLICITLY_REMOVED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); xarch.setExplicitChangeSets(documentRootRef, Lists.<ObjRef> newArrayList()); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); xarch.applyChangeSets(documentRootRef, updatedChangeSets.subList(0, 1)); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); xarch.setExplicitChangeSets(documentRootRef, updatedChangeSets.subList(1, 2)); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); assertEquals(ChangeStatus.EXPLICITLY_REMOVED_BUT_REALLY_ADDED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.EXPLICITLY_REMOVED_BUT_REALLY_ADDED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); } public void testExplicitAddWithRemove() { xarch.setChangeSetsEnabled(documentRootRef, true); Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); assertEquals(structure, c.eContainer()); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Remove Component"); structure.getComponent().remove(c); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); xarch.setExplicitChangeSets(documentRootRef, Lists.newArrayList(updatedChangeSets.get(0))); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); assertEquals(ChangeStatus.EXPLICITLY_ADDED_BUT_REALLY_REMOVED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); xarch.setExplicitChangeSets(documentRootRef, Lists.<ObjRef> newArrayList()); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); } public void testOverviewRemove() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> originalChangeSets = xarch.getAppliedChangeSets(documentRootRef); Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Remove Component"); structure.getComponent().remove(c); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); xarch.setOverviewModeEnabled(documentRootRef, true); assertEquals(oldID, c.getId()); assertEquals(structure, c.eContainer()); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); xarch.setOverviewModeEnabled(documentRootRef, false); assertEquals(oldID, c.getId()); assertEquals(null, c.eContainer()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); } public void testModifyParents() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> originalChangeSets = xarch.getAppliedChangeSets(documentRootRef); Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Add Interface"); xarch.setExplicitChangeSets(documentRootRef, Lists.newArrayList(updatedChangeSets.get(1))); assertEquals(oldID, c.getId()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); Interface i = strFactory.createInterface(); i.setId(UIDGenerator.generateUID()); c.getInterface().add(i); assertEquals(ChangeStatus.EXPLICITLY_MODIFIED, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.EXPLICITLY_MODIFIED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.EXPLICITLY_ADDED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); } public void testModifyParentsViaAttributeThenChildrenViaRemove() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> originalChangeSets = xarch.getAppliedChangeSets(documentRootRef); Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); Interface i = strFactory.createInterface(); i.setId(UIDGenerator.generateUID()); c.getInterface().add(i); Interface i2 = strFactory.createInterface(); i2.setId(UIDGenerator.generateUID()); c.getInterface().add(i2); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Modify Interface"); xarch.setExplicitChangeSets(documentRootRef, Lists.newArrayList(updatedChangeSets.get(1))); assertEquals(oldID, c.getId()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); i.setDirection(Direction.NONE); assertEquals(ChangeStatus.EXPLICITLY_MODIFIED, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.EXPLICITLY_MODIFIED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.EXPLICITLY_MODIFIED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); List<ObjRef> removedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Remove Component"); xarch.setExplicitChangeSets(documentRootRef, removedChangeSets.subList(2, 3)); structure.getComponent().remove(c); assertEquals(ChangeStatus.EXPLICITLY_REMOVED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.EXPLICITLY_REMOVED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); assertEquals(ChangeStatus.EXPLICITLY_REMOVED, xarch.getChangeStatus(XArchADTProxy.unproxy(i2))); xarch.setExplicitChangeSets(documentRootRef, removedChangeSets.subList(1, 2)); assertEquals(ChangeStatus.EXPLICITLY_MODIFIED_BUT_REALLY_REMOVED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.EXPLICITLY_MODIFIED_BUT_REALLY_REMOVED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(i2))); assertEquals(null, i2.eContainer()); } public void testInitialCreate() { Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); Interface i = strFactory.createInterface(); i.setId(UIDGenerator.generateUID()); c.getInterface().add(i); HintsExtension e = XArchADTProxy.getExtension(xarch, i, Hints_3_0Package.Literals.HINTS_EXTENSION, true); xarch.setChangeSetsEnabled(documentRootRef, true); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(e))); xarch.applyChangeSets(documentRootRef, xarch.getAppliedChangeSets(documentRootRef)); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(e))); xarch.setExplicitChangeSets(documentRootRef, Lists.<ObjRef> newArrayList()); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); assertEquals(ChangeStatus.ATTACHED, xarch.getChangeStatus(XArchADTProxy.unproxy(e))); } public void testOverviewWithDependent() { xarch.setChangeSetsEnabled(documentRootRef, true); List<ObjRef> originalChangeSets = xarch.getAppliedChangeSets(documentRootRef); List<ObjRef> updatedChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Add Component"); Component c = strFactory.createComponent(); String oldID; c.setId(oldID = UIDGenerator.generateUID()); structure.getComponent().add(c); List<ObjRef> allChangeSets = VariabilityUtils.createAndApplyChangeSet(xarch, documentRootRef, "Add Interface"); Interface i = strFactory.createInterface(); i.setId(UIDGenerator.generateUID()); c.getInterface().add(i); xarch.applyChangeSets(documentRootRef, Lists.<ObjRef> newArrayList()); xarch.setOverviewModeEnabled(documentRootRef, true); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); xarch.applyChangeSets(documentRootRef, updatedChangeSets.subList(1, 2)); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); xarch.applyChangeSets(documentRootRef, allChangeSets.subList(2, 3)); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(structure))); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(c))); assertEquals(ChangeStatus.OVERVIEW, xarch.getChangeStatus(XArchADTProxy.unproxy(i))); } }