/** Test that create message move down shift correctly all sub event ends. */
  public void testCreateMessageMoveDownToShiftAllSubEventEnds() {

    validateOrdering(20);
    Point startOfCreateMessage =
        new Point(instanceRoleEditPartDBounds.getCenter().x, firstInteractionUseBounds.y - 10);
    Point finishOfCreateMessage = instanceRoleEditPartEBounds.getCenter();
    createMessage(
        InteractionsConstants.CREATE_TOOL_ID,
        startOfCreateMessage.x,
        startOfCreateMessage.y,
        finishOfCreateMessage.x,
        finishOfCreateMessage.y);

    validateOrdering(22);
    SWTBotGefConnectionEditPart createMessageBot =
        instanceRoleEditPartEBot.parent().targetConnections().get(0);
    Rectangle createMessageBounds = editor.getBounds(createMessageBot);

    int dy = 8;
    int NB_MOVE_DOWN = 5;
    createMessageBot.select();

    // Avoid to drag from the label.
    editor.clickContextMenu("Hide label");

    SequenceDiagram sequenceDiagram = getSequenceDiagram();
    SequenceDDiagram sequenceDDiagram = sequenceDiagram.getSequenceDDiagram();
    List<EventEnd> initalSemanticOrdering =
        Lists.newArrayList(sequenceDDiagram.getSemanticOrdering().getEventEnds());
    Map<ISequenceEvent, Range> initalState = Maps.newHashMap();
    Set<ISequenceEvent> initalEvents = sequenceDiagram.getAllOrderedDelimitedSequenceEvents();
    for (ISequenceEvent ise : initalEvents) {
      initalState.put(ise, ise.getVerticalRange());
    }

    for (int i = 1; i <= NB_MOVE_DOWN; i++) {
      createMessageBounds = editor.getBounds(createMessageBot);

      CheckSequenceMessageEditPartMoved checkSequenceMessageEditPartMoved =
          new CheckSequenceMessageEditPartMoved(createMessageBot);
      editor.drag(
          createMessageBounds.getCenter(), createMessageBounds.getCenter().translate(0, dy));
      bot.waitUntil(checkSequenceMessageEditPartMoved);

      assertEquals(
          "The expected drag n�" + (i) + " did not occurs",
          createMessageBounds.getCenter().getTranslated(0, dy).y,
          editor.getBounds(createMessageBot).getCenter().y,
          2);

      // Check graphical and semantic ordering are sync.
      validateOrdering(22);

      // Check no reorder occurs / initial ordering
      assertTrue(
          "No reorder should occur in this test.",
          Iterables.elementsEqual(
              initalSemanticOrdering, sequenceDDiagram.getGraphicalOrdering().getEventEnds()));

      Set<ISequenceEvent> events = sequenceDiagram.getAllOrderedDelimitedSequenceEvents();
      assertEquals("We should have the same number of events.", initalEvents.size(), events.size());
      for (ISequenceEvent ise : events) {
        assertEquals(
            "We should have the same number of events.",
            initalState.get(ise).shifted(i * dy),
            ise.getVerticalRange());
      }
    }
  }