@Before
  public void setupNodes() {
    // Dummy process for each test consists of 3 connected nodes
    // ---------------------------------------------------------
    //
    // [StartNode]--e1-->[DummyNode]--e2-->[EndNode]
    //
    process = new ProcessNode();
    ruleManager = new DefaultRuleManagerImpl();
    node1 = new StartProcessNode();
    node2 = new TestDummyNode();
    node3 = new EndProcessNode();
    commandManager = new DefaultCommandManagerImpl();

    for (Rule rule : getConnectionRules()) {
      ruleManager.addRule(rule);
    }
    for (Rule rule : getCardinalityRules()) {
      ruleManager.addRule(rule);
    }

    // Add StartProcessNode
    final Results results1 =
        commandManager.execute(ruleManager, new AddGraphNodeCommand(process, node1));

    assertNotNull(results1);
    assertEquals(0, results1.getMessages().size());

    // Add TestDummyNode
    final Results results2 =
        commandManager.execute(ruleManager, new AddGraphNodeCommand(process, node2));

    assertNotNull(results2);
    assertEquals(0, results2.getMessages().size());

    // Add EndProcessNode
    final Results results3 =
        commandManager.execute(ruleManager, new AddGraphNodeCommand(process, node3));

    assertNotNull(results3);
    assertEquals(0, results3.getMessages().size());

    // Add Edge between StartNode and DummyNode1
    e1 = new BpmnEdgeImpl(new DefaultRoleImpl("general_edge"));
    final Results results4 =
        commandManager.execute(ruleManager, new AddEdgeCommand(node1, node2, e1));

    assertNotNull(results4);
    assertEquals(0, results4.getMessages().size());

    // Add Edge between DummyNode2 and EndNode
    e2 = new BpmnEdgeImpl(new DefaultRoleImpl("general_edge"));
    final Results results5 =
        commandManager.execute(ruleManager, new AddEdgeCommand(node2, node3, e2));

    assertNotNull(results5);
    assertEquals(0, results5.getMessages().size());
  }
  @Test
  public void testDeleteOutgoingCardinalityIncomingMinimum() {
    ruleManager.addRule(
        new CardinalityRuleImpl(
            "DummyNode Incoming Cardinality Rule",
            new DefaultRoleImpl("dummy"),
            0,
            2,
            Collections.EMPTY_SET,
            new HashSet<CardinalityRule.ConnectorRule>() {
              {
                add(
                    new CardinalityRule.ConnectorRule() {
                      @Override
                      public long getMinOccurrences() {
                        return 1;
                      }

                      @Override
                      public long getMaxOccurrences() {
                        return 2;
                      }

                      @Override
                      public Role getRole() {
                        return new DefaultRoleImpl("general_edge");
                      }

                      @Override
                      public String getName() {
                        return "End Node DummyNode Connector Rule 1";
                      }
                    });
              }
            }));

    // Delete edge between DummyNode1 and DummyNode2
    final Results results1 =
        commandManager.execute(ruleManager, new DeleteEdgeCommand(node2, node3, e2));

    assertNotNull(results1);
    assertEquals(0, results1.getMessages().size());

    assertEquals(1, node2.getInEdges().size());
    assertEquals(1, node2.getOutEdges().size());
    assertEquals(1, node3.getInEdges().size());
    assertEquals(1, node3.getOutEdges().size());

    // Try to delete the other edge between DummyNode1 and DummyNode2 again. This should fail
    // validation.
    final Results results2 =
        commandManager.execute(ruleManager, new DeleteEdgeCommand(node2, node3, e4));

    assertNotNull(results2);
    assertEquals(1, results2.getMessages().size());
    assertEquals(1, results2.getMessages(ResultType.ERROR).size());

    assertEquals(1, node2.getInEdges().size());
    assertEquals(1, node2.getOutEdges().size());
    assertEquals(1, node3.getInEdges().size());
    assertEquals(1, node3.getOutEdges().size());
  }