package org.eclipse.uml2.diagram.sequence.tests; import java.util.Arrays; import java.util.HashSet; import org.eclipse.uml2.diagram.sequence.model.builder.SDBuilder; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDBracketContainer; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDCombinedFragment; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDFrame; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDFrameContainer; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDInteractionOperand; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDInteractionUse; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDLifeLine; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDModel; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDMountingRegion; import org.eclipse.uml2.diagram.sequence.model.sequenced.SDPackage; import org.eclipse.uml2.uml.Lifeline; public class SDFramesBuilderTest extends AbstractSDModelBuilderTest { public void testEmptyCombinedFragment(){ SDBuilder builder = buildFrame("CombinedFragment-alt-x2-empty.uml", "Interaction"); SDModel sdModel = builder.getSDModel(); assertNotNull(sdModel); checkCallStackCompleted(builder); checkTraces(builder); SDLifeLine a = findLifeLineByName(sdModel, "a"); SDLifeLine b = findLifeLineByName(sdModel, "b"); assertFalse(sdModel.getFrames().isEmpty()); assertEquals(1, sdModel.getFrames().size()); checkCombinedFragment(sdModel.getFrames().get(0), a, b); } public void testCombinedFragmentWithContents(){ SDBuilder builder = buildFrame("CombinedFragment-alt-x2-message-x2.uml", "Interaction"); SDModel sdModel = builder.getSDModel(); assertNotNull(sdModel); checkCallStackCompleted(builder); checkTraces(builder); SDLifeLine a = findLifeLineByName(sdModel, "a"); SDLifeLine b = findLifeLineByName(sdModel, "b"); assertFalse(sdModel.getFrames().isEmpty()); assertEquals(1, sdModel.getFrames().size()); assertTrue(sdModel.getFrames().get(0) instanceof SDCombinedFragment); SDCombinedFragment combined = (SDCombinedFragment)sdModel.getFrames().get(0); checkCombinedFragment(combined, a, b); //digging for operand contents SDMountingRegion mountingForCombinedOnA = combined.findRegionForSDLifeLine(a); SDMountingRegion mountingForCombinedOnB = combined.findRegionForSDLifeLine(b); assertFalse(combined.getFrames().isEmpty()); assertEquals(2, combined.getFrames().size()); for (SDFrame nextOperand : combined.getFrames()){ assertTrue(nextOperand instanceof SDInteractionOperand); checkFrame(nextOperand, a, b); SDMountingRegion operandMounterOnA = mountingForCombinedOnA.findMountingRegionForSubFrame(nextOperand); SDMountingRegion operandMounterOnB = mountingForCombinedOnB.findMountingRegionForSubFrame(nextOperand); assertNotNull(operandMounterOnA); assertNotNull(operandMounterOnB); assertEquals(1, operandMounterOnA.getBrackets().size()); assertEquals(1, operandMounterOnB.getBrackets().size()); checkExpectedMessage(operandMounterOnA.getBrackets().get(0), operandMounterOnB.getBrackets().get(0)); } } protected void checkCombinedFragment(SDFrame sdFrame, SDLifeLine...expectedLifeLines){ checkFrame(sdFrame, expectedLifeLines); assertTrue(sdFrame instanceof SDCombinedFragment); SDCombinedFragment combined = (SDCombinedFragment)sdFrame; assertEquals(combined.getUmlCombinedFragment().getOperands().size(), combined.getFrames().size()); for (SDFrame nextSubFrame : combined.getFrames()){ assertTrue(nextSubFrame instanceof SDInteractionOperand); SDInteractionOperand nextOperand = (SDInteractionOperand)nextSubFrame; assertTrue(combined.getUmlCombinedFragment().getOperands().contains(nextOperand.getUmlInteractionOperand())); checkFrame(nextSubFrame, expectedLifeLines); } } protected void checkFrame(SDFrame sdFrame, SDLifeLine...expectedLifeLines){ assertNotNull(sdFrame); assertNotNull(sdFrame.getFrameContainer()); assertTrue(sdFrame.getFrameContainer().getFrames().contains(sdFrame)); assertNotNull(sdFrame.getUmlFragment()); switch (sdFrame.eClass().getClassifierID()){ case SDPackage.SD_COMBINED_FRAGMENT : assertSame(sdFrame.getUmlFragment(), ((SDCombinedFragment)sdFrame).getUmlCombinedFragment()); break; case SDPackage.SD_INTERACTION_OPERAND : assertSame(sdFrame.getUmlFragment(), ((SDInteractionOperand)sdFrame).getUmlInteractionOperand()); break; case SDPackage.SD_INTERACTION_USE : assertSame(sdFrame.getUmlFragment(), ((SDInteractionUse)sdFrame).getUmlInteractionUse()); break; default: fail("Unknown SDFrame kind: " + sdFrame); } assertFalse(sdFrame.getCoveredLifeLines().isEmpty()); assertEquals(sdFrame.getCoveredLifeLines().size(), sdFrame.getUmlFragment().getCovereds().size()); assertEquals(new HashSet<SDLifeLine>(sdFrame.getCoveredLifeLines()), new HashSet<SDLifeLine>(Arrays.asList(expectedLifeLines))); for (Lifeline nextUmlLifeline : sdFrame.getUmlFragment().getCovereds()){ SDLifeLine matchedSDLifeLine = null; for (SDLifeLine nextSDLifeLine : sdFrame.getCoveredLifeLines()){ if (nextSDLifeLine.getUmlLifeline() == nextUmlLifeline){ matchedSDLifeLine = nextSDLifeLine; break; } } assertNotNull("For each uml-lifelines covered by uml-fragment there should be covered sd-lifeline", matchedSDLifeLine); } for (SDLifeLine nextSDLifeLine : sdFrame.getCoveredLifeLines()){ SDMountingRegion region = sdFrame.findRegionForSDLifeLine(nextSDLifeLine); assertNotNull(region); assertSame(sdFrame, region.getFrame()); assertSame(nextSDLifeLine, region.getCoveredLifeLine()); assertSame(region, sdFrame.findRegionForUmlLifeLine(nextSDLifeLine.getUmlLifeline())); SDBracketContainer expectedRegionParent; SDFrameContainer frameContainer = sdFrame.getFrameContainer(); assertNotNull(frameContainer); if (frameContainer instanceof SDFrame){ expectedRegionParent = ((SDFrame)frameContainer).findRegionForSDLifeLine(nextSDLifeLine); } else if (frameContainer instanceof SDModel){ expectedRegionParent = nextSDLifeLine; } else { fail("Unknown FrameContainer: " + frameContainer); throw new InternalError("Never thrown"); } assertNotNull(expectedRegionParent); assertSame(expectedRegionParent, region.getBracketContainer()); } assertFalse(sdFrame.getRegions().isEmpty()); assertEquals(sdFrame.getRegions().size(), sdFrame.getCoveredLifeLines().size()); for (SDMountingRegion nextRegion : sdFrame.getRegions()){ assertNotNull(nextRegion.getCoveredLifeLine()); assertTrue(sdFrame.getCoveredLifeLines().contains(nextRegion.getCoveredLifeLine())); } } }