package org.eclipse.uml2.diagram.sequence.tests;
import junit.framework.Assert;
import org.eclipse.uml2.diagram.sequence.model.builder.SDBuilder;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDBracket;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDExecution;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDInvocation;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDLifeLine;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDMessage;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDModel;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDSimpleNode;
import org.eclipse.uml2.uml.Interaction;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.StateInvariant;
import org.eclipse.uml2.uml.UMLPackage;
public class SDModelBuilderTest extends AbstractSDModelBuilderTest {
private static final String MEMORY_GAME_FILE = "Testable Version Of MemoryGame Model.uml";
public void testPrecondition_LoadRedrawInteraction() {
Package memoryGame = loadExampleFile(MEMORY_GAME_FILE);
Interaction redraw = (Interaction) memoryGame.getPackagedElement("Redraw", true, UMLPackage.eINSTANCE.getInteraction(), false);
assertNotNull(redraw);
}
public void testBuildNormalAndSelfMessage() {
SDBuilder builder = buildFrame(MEMORY_GAME_FILE, "ReDraw");
SDModel sdModel = builder.getSDModel();
assertTrue(sdModel.getGates().isEmpty());
assertFalse(sdModel.getLifelines().isEmpty());
assertFalse(sdModel.getMessages().isEmpty());
assertEquals(2, sdModel.getLifelines().size());
assertEquals(2, sdModel.getMessages().size());
SDMessage mouseClicked = (SDMessage) findMessageByName(sdModel, "mouseClicked");
SDMessage redraw = (SDMessage) findMessageByName(sdModel, "reDraw");
assertNotNull(redraw);
assertNotNull(mouseClicked);
assertFalse(redraw == mouseClicked);
assertNotNull(mouseClicked.getSource());
assertNotNull(mouseClicked.getTarget());
assertNotNull(redraw.getSource());
assertNotNull(redraw.getTarget());
SDInvocation redrawInvocation = redraw.getSource();
SDExecution redrawExecution = redraw.getTarget();
assertNull(redrawInvocation.getUmlExecutionSpec());
assertNotNull(redrawExecution.getUmlExecutionSpec());
assertNotNull(redrawExecution.getCoveredLifeLine());
assertSame(redrawInvocation.getCoveredLifeLine(), redrawExecution.getCoveredLifeLine());
assertTrue(redrawInvocation.getBrackets().contains(redrawExecution));
}
public void testNormalMessageDetails() {
SDBuilder builder = buildFrame(MEMORY_GAME_FILE, "ReDraw");
SDModel sdModel = builder.getSDModel();
SDMessage redraw = (SDMessage) findMessageByName(sdModel, "reDraw");
assertNotNull(redraw);
assertNotNull(redraw.getSource());
assertNotNull(redraw.getTarget());
SDInvocation redrawInvocation = redraw.getSource();
SDExecution redrawExecution = redraw.getTarget();
assertNull(redrawInvocation.getUmlExecutionSpec());
assertNotNull(redrawExecution.getUmlExecutionSpec());
assertNotNull(redrawExecution.getCoveredLifeLine());
assertSame(redrawInvocation.getCoveredLifeLine(), redrawExecution.getCoveredLifeLine());
assertTrue(redrawInvocation.getBrackets().contains(redrawExecution));
}
public void testSelfMessageDetails() {
SDBuilder builder = buildFrame(MEMORY_GAME_FILE, "ReDraw");
SDModel sdFrame = builder.getSDModel();
SDMessage mouseClicked = (SDMessage) findMessageByName(sdFrame, "mouseClicked");
assertNotNull(mouseClicked);
SDInvocation mouseClickedInvocation = mouseClicked.getSource();
SDExecution mouseClickedExecution = mouseClicked.getTarget();
assertNotNull(mouseClickedExecution);
assertNotNull(mouseClickedInvocation);
assertNull(mouseClickedInvocation.getUmlExecutionSpec());
assertNotNull(mouseClickedExecution.getUmlExecutionSpec());
SDLifeLine sendingLifeline = mouseClickedInvocation.getCoveredLifeLine();
SDLifeLine receivingLifeline = mouseClickedExecution.getCoveredLifeLine();
assertNotNull(sendingLifeline);
assertNotNull(receivingLifeline);
assertNotSame(sendingLifeline, receivingLifeline);
assertNotNull(sendingLifeline.getUmlLifeline());
assertNotNull(receivingLifeline.getUmlLifeline());
assertNotSame(sendingLifeline.getUmlLifeline(), receivingLifeline.getUmlLifeline());
assertTrue(sendingLifeline.getBrackets().contains(mouseClickedInvocation));
assertTrue(receivingLifeline.getBrackets().contains(mouseClickedExecution));
}
public void testCallStackCompleted() {
SDBuilder builder = buildFrame(MEMORY_GAME_FILE, "ReDraw");
checkCallStackCompleted(builder);
checkTraces(builder);
}
public void testTwoMessagesCreatedFromDiagram() {
SDBuilder builder = buildFrame("Two Messages Created From Diagram.uml", "Interaction");
SDModel sdModel = builder.getSDModel();
SDLifeLine a = findLifeLineByName(sdModel, "a");
SDLifeLine b = findLifeLineByName(sdModel, "b");
assertEquals(2, a.getBrackets().size());
assertEquals(2, b.getBrackets().size());
for (SDBracket nextABracket : a.getBrackets()) {
assertTrue(nextABracket instanceof SDInvocation);
SDInvocation invocation = (SDInvocation) nextABracket;
assertTrue(invocation.getBrackets().isEmpty());
assertNotNull(invocation.getOutgoingMessage());
assertNotNull(invocation.getReceiveExecution());
assertNotNull(invocation.getReceiveExecution().getIncomingMessage());
assertSame(invocation.getOutgoingMessage(), invocation.getReceiveExecution().getIncomingMessage());
assertEquals(a.getBrackets().indexOf(invocation), b.getBrackets().indexOf(invocation.getReceiveExecution()));
}
SDMessage firstMessage = null;
SDMessage secondMessage = null;
for (SDBracket nextBBracket : b.getBrackets()) {
assertTrue(nextBBracket instanceof SDExecution);
SDExecution execution = (SDExecution) nextBBracket;
assertTrue(execution.getBrackets().isEmpty());
assertNotNull(execution.getIncomingMessage());
if (firstMessage == null) {
firstMessage = execution.getIncomingMessage();
} else {
secondMessage = execution.getIncomingMessage();
}
}
assertNotNull(firstMessage.getUmlMessage());
assertNotNull(secondMessage.getUmlMessage());
assertFalse(firstMessage == secondMessage);
assertFalse(firstMessage.getUmlMessage() == secondMessage.getUmlMessage());
assertEquals("1", firstMessage.getMessageNumber());
assertEquals("2", secondMessage.getMessageNumber());
checkCallStackCompleted(builder);
checkTraces(builder);
}
public void testMessageChain_ABCD() {
SDBuilder builder = buildFrame("Message Chain From Diagram - abcd.uml", "Interaction");
SDModel sdModel = builder.getSDModel();
checkCallStackCompleted(builder);
checkTraces(builder);
assertEquals(3, sdModel.getMessages().size());
SDLifeLine a = findLifeLineByName(sdModel, "a");
SDLifeLine b = findLifeLineByName(sdModel, "b");
SDLifeLine c = findLifeLineByName(sdModel, "c");
SDLifeLine d = findLifeLineByName(sdModel, "d");
assertEquals(1, a.getBrackets().size());
assertEquals(1, b.getBrackets().size());
assertEquals(1, c.getBrackets().size());
assertEquals(1, d.getBrackets().size());
ThreeMessagesChainChecker chainChecker = new ThreeMessagesChainChecker(//
a.getBrackets().get(0), //
b.getBrackets().get(0), //
c.getBrackets().get(0), //
d.getBrackets().get(0));
chainChecker.checkChain("1");
}
public void testMessageChainX3_ABCD_BDAC_CADB() {
SDBuilder builder = buildFrame("Message Chain From Diagram - x3 - abcd - bdac - cadb.uml", "Interaction");
SDModel sdModel = builder.getSDModel();
checkCallStackCompleted(builder);
checkTraces(builder);
assertEquals(3 * 3, sdModel.getMessages().size());
SDLifeLine a = findLifeLineByName(sdModel, "a");
SDLifeLine b = findLifeLineByName(sdModel, "b");
SDLifeLine c = findLifeLineByName(sdModel, "c");
SDLifeLine d = findLifeLineByName(sdModel, "d");
assertEquals(3, a.getBrackets().size());
assertEquals(3, b.getBrackets().size());
assertEquals(3, c.getBrackets().size());
assertEquals(3, d.getBrackets().size());
ThreeMessagesChainChecker abcdChecker = new ThreeMessagesChainChecker(//
a.getBrackets().get(0), //
b.getBrackets().get(0), //
c.getBrackets().get(0), //
d.getBrackets().get(0));
abcdChecker.checkChain("1");
ThreeMessagesChainChecker bdacChecker = new ThreeMessagesChainChecker(//
b.getBrackets().get(1), //
d.getBrackets().get(1), //
a.getBrackets().get(1), //
c.getBrackets().get(1));
bdacChecker.checkChain("2");
ThreeMessagesChainChecker cadbChecker = new ThreeMessagesChainChecker(//
c.getBrackets().get(2), //
a.getBrackets().get(2), //
d.getBrackets().get(2), //
b.getBrackets().get(2));
cadbChecker.checkChain("3");
}
public void testWhenCantNavigateFromMessageEndToMessage(){
fail("We need to contsruct uml example where message.getSendEvent().getMessage() != null");
}
public void testStateInvariant(){
SDBuilder builder = buildFrame("StateInvariant From Diagram - invariantA-message-invariantB.uml", "Interaction");
SDModel sdModel = builder.getSDModel();
checkCallStackCompleted(builder);
checkTraces(builder);
SDLifeLine a = findLifeLineByName(sdModel, "a");
SDLifeLine b = findLifeLineByName(sdModel, "b");
assertEquals(2, a.getBrackets().size());
assertEquals(2, b.getBrackets().size());
assertTrue(a.getBrackets().get(0) instanceof SDSimpleNode);
assertTrue(a.getBrackets().get(1) instanceof SDInvocation);
assertTrue(b.getBrackets().get(0) instanceof SDExecution);
assertTrue(b.getBrackets().get(1) instanceof SDSimpleNode);
SDSimpleNode invariantA = (SDSimpleNode) a.getBrackets().get(0);
SDSimpleNode invariantB = (SDSimpleNode) b.getBrackets().get(1);
SDInvocation invocation = (SDInvocation) a.getBrackets().get(1);
SDExecution execution = (SDExecution) b.getBrackets().get(0);
assertNotNull(invariantA.getUmlFragment());
assertNotNull(invariantB.getUmlFragment());
assertTrue(invariantA.getUmlFragment() instanceof StateInvariant);
assertTrue(invariantB.getUmlFragment() instanceof StateInvariant);
assertFalse(invariantB.getUmlFragment() == invariantA.getUmlFragment());
assertEquals(execution, invocation.getReceiveExecution());
assertEquals(invocation, execution.getInvocation());
}
class ThreeMessagesChainChecker extends Assert {
private final SDInvocation myRoot;
private final SDExecution myMiddle1;
private final SDExecution myMiddle2;
private final SDExecution myTarget;
public ThreeMessagesChainChecker(SDBracket root, SDBracket middle1, SDBracket middle2, SDBracket target) {
assertTrue(root instanceof SDInvocation);
assertTrue(middle1 instanceof SDExecution);
assertTrue(middle2 instanceof SDExecution);
assertTrue(target instanceof SDExecution);
myRoot = (SDInvocation) root;
myMiddle1 = (SDExecution) middle1;
myMiddle2 = (SDExecution) middle2;
myTarget = (SDExecution) target;
}
public void checkChain(String expectedRootNumber) {
checkInvocationExecutionPair(myRoot, myMiddle1);
assertEquals(1, myMiddle1.getBrackets().size());
assertTrue(myMiddle1.getBrackets().get(0) instanceof SDInvocation);
SDInvocation deepInvocation1 = (SDInvocation) myMiddle1.getBrackets().get(0);
checkInvocationExecutionPair(deepInvocation1, myMiddle2);
assertEquals(1, myMiddle2.getBrackets().size());
assertTrue(myMiddle2.getBrackets().get(0) instanceof SDInvocation);
SDInvocation deepInvocation2 = (SDInvocation) myMiddle2.getBrackets().get(0);
checkInvocationExecutionPair(deepInvocation2, myTarget);
assertTrue(myRoot.getBrackets().isEmpty());
assertTrue(deepInvocation1.getBrackets().isEmpty());
assertTrue(deepInvocation2.getBrackets().isEmpty());
assertTrue(myTarget.getBrackets().isEmpty());
SDMessage msgRoot = myRoot.getOutgoingMessage();
SDMessage msgMiddle = deepInvocation1.getOutgoingMessage();
SDMessage msgFinal = deepInvocation2.getOutgoingMessage();
assertNotNull(msgRoot);
assertNotNull(msgMiddle);
assertNotNull(msgFinal);
assertTrue(msgRoot != msgMiddle);
assertTrue(msgRoot != msgFinal);
assertTrue(msgMiddle != msgFinal);
assertEquals(expectedRootNumber, msgRoot.getMessageNumber());
assertEquals(expectedRootNumber + ".1", msgMiddle.getMessageNumber());
assertEquals(expectedRootNumber + ".1.1", msgFinal.getMessageNumber());
}
}
}