@Test
  public final void testConvert() {
    Variable v1 = null;
    try {
      v1 = new Variable("v1", this.mCFG);
      this.mCFG.addVariable(v1);

      Input i1;
      i1 = new Input(this.mCFG);

      ICFGBasicBlockNode D = new CFGBasicBlockNode(this.mCFG);
      this.mCFG.addBasicBlockNode(D);
      CFEdge e6 = new CFEdge(this.mCFG, this.mCFGStart, D);
      Statement s1 = new Statement(this.mCFG, v1, i1);
      D.addStatement(s1);

      ConcreteConstant exp1 = new ConcreteConstant(15, this.mCFG);
      GreaterThanExpression exp2 = new GreaterThanExpression(this.mCFG, v1, exp1);
      ICFGDecisionNode A = new CFGDecisionNode(this.mCFG, exp2, null, null);
      this.mCFG.addDecisionNode(A);
      ICFEdge e1 = new CFEdge(this.mCFG, D, A);

      ICFGBasicBlockNode B = new CFGBasicBlockNode(this.mCFG);
      IArithmeticExpression exp3 =
          new AddExpression(
              this.mCFG, new ConcreteConstant(10, this.mCFG), new ConcreteConstant(20, this.mCFG));
      B.addStatement(new Statement(this.mCFG, v1, exp3));
      this.mCFG.addBasicBlockNode(B);

      ICFGBasicBlockNode C = new CFGBasicBlockNode(this.mCFG);
      IArithmeticExpression exp4 =
          new AddExpression(
              this.mCFG, new ConcreteConstant(1, this.mCFG), new ConcreteConstant(2, this.mCFG));
      C.addStatement(new Statement(this.mCFG, v1, exp4));
      this.mCFG.addBasicBlockNode(C);

      ICFEdge e2 = new CFEdge(null, A, B);
      this.mCFG.addEdge(e2);
      ICFEdge e3 = new CFEdge(null, A, C);
      this.mCFG.addEdge(e3);
      A.setThenEdge(e2);
      A.setElseEdge(e3);
      ICFEdge e4 = new CFEdge(null, B, this.mCFGEnd);
      this.mCFG.addEdge(e4);
      ICFEdge e5 = new CFEdge(null, C, this.mCFGEnd);
      this.mCFG.addEdge(e5);

      System.out.println("start.id = " + this.mCFGStart.getId());
      System.out.println("D.id = " + D.getId());
      System.out.println("A.id = " + A.getId());
      System.out.println("B.id = " + B.getId());
      System.out.println("C.id = " + C.getId());
      System.out.println("end.id = " + this.mCFGEnd.getId());

      System.out.println("e6.id = " + e6.getId());
      System.out.println("e1.id = " + e1.getId());
      System.out.println("e2.id = " + e2.getId());
      System.out.println("e3.id = " + e3.getId());
      System.out.println("e4.id = " + e4.getId());
      System.out.println("e5.id = " + e5.getId());

      for (IStatement s : D.getStatements()) {
        System.out.println("D.statement = " + s.toString());
      }

      System.out.println("A.condition = " + A.getCondition().toString());
      for (IStatement s : B.getStatements()) {
        System.out.println("B.statement = " + s.toString());
      }
      for (IStatement s : C.getStatements()) {
        System.out.println("C.statement = " + s.toString());
      }

      CFGToGraphConvertor convertor = new CFGToGraphConvertor(this.mCFG);
      IGraph graph = convertor.getGraph();
      System.out.println(graph.toString());
      System.out.println("Node map:\n");
      for (ICFGNode node : this.mCFG.getNodeSet()) {
        System.out.println(node.getId() + "->" + convertor.getGraphNode(node).getId() + "\n");
      }
      System.out.println("Edge map:\n");
      for (ICFEdge edge : this.mCFG.getEdgeSet()) {
        System.out.println(edge.getId() + "->" + convertor.getGraphEdge(edge).getId() + "\n");
      }
    } catch (Exception e) {
      System.out.println(e.getMessage());
      e.printStackTrace();
    }
  }
  @Test
  public final void testGMCS1() {
    // input variables
    Variable i1 = null;
    Variable i2 = null;
    Variable i3 = null;
    Variable i4 = null;

    try {
      i1 = new Variable("i1", this.mCFG);
      i2 = new Variable("i2", this.mCFG);
      i3 = new Variable("i3", this.mCFG);
      i4 = new Variable("i4", this.mCFG);
    } catch (Exception e) {
      System.out.println(e.getMessage());
      e.printStackTrace();
    }

    // constants
    try {
      ConcreteConstant C1 = new ConcreteConstant(1, this.mCFG);
      ConcreteConstant C2 = new ConcreteConstant(2, this.mCFG);
      ConcreteConstant C3 = new ConcreteConstant(3, this.mCFG);
      ConcreteConstant C4 = new ConcreteConstant(4, this.mCFG);
      ConcreteConstant C5 = new ConcreteConstant(5, this.mCFG);
      True C6 = new True(this.mCFG);
      ConcreteConstant C7 = new ConcreteConstant(7, this.mCFG);
      ConcreteConstant C8 = new ConcreteConstant(8, this.mCFG);

      // internal variables
      Variable v1 = null;
      Variable v2 = null;
      Variable v3 = null;
      Variable v4 = null;
      Variable v5 = null;
      Variable v6 = null;
      Variable v7 = null;
      Variable v9 = null;
      Variable v10 = null;
      Variable v14 = null;

      v1 = new Variable("v1", Type.BOOLEAN, this.mCFG);
      v2 = new Variable("v2", Type.BOOLEAN, this.mCFG);
      v3 = new Variable("v3", Type.BOOLEAN, this.mCFG);
      v4 = new Variable("v4", Type.BOOLEAN, this.mCFG);
      v5 = new Variable("v5", Type.BOOLEAN, this.mCFG);
      v6 = new Variable("v6", Type.BOOLEAN, this.mCFG);
      v7 = new Variable("v7", Type.BOOLEAN, this.mCFG);
      v9 = new Variable("v9", Type.BOOLEAN, this.mCFG);
      v10 = new Variable("v10", Type.BOOLEAN, this.mCFG);
      v14 = new Variable("v14", Type.BOOLEAN, this.mCFG);

      ICFGBasicBlockNode InputBlock = new CFGBasicBlockNode("IB", this.mCFG);
      this.mCFG.addBasicBlockNode(InputBlock);

      Input I1;
      I1 = new Input(this.mCFG);

      Statement inputStatement1 = new Statement(this.mCFG, i1, I1);
      InputBlock.addStatement(inputStatement1);

      Input I2 = new Input(this.mCFG);
      Statement inputStatement2 = new Statement(this.mCFG, i2, I2);
      InputBlock.addStatement(inputStatement2);

      Input I3 = new Input(this.mCFG);
      Statement inputStatement3 = new Statement(this.mCFG, i3, I3);
      InputBlock.addStatement(inputStatement3);

      Input I4 = new Input(this.mCFG);
      Statement inputStatement4 = new Statement(this.mCFG, i4, I4);
      InputBlock.addStatement(inputStatement4);

      // A
      // ADB
      EqualsExpression ADBC = new EqualsExpression(this.mCFG, i1, C1);
      CFGDecisionNode ADB = new CFGDecisionNode("ADB", this.mCFG, ADBC, null, null);
      // ABB1
      Statement ABB1S = new Statement(this.mCFG, v1, new True(this.mCFG));
      CFGBasicBlockNode ABB1 = new CFGBasicBlockNode("ABB1", this.mCFG);
      ABB1.addStatement(ABB1S);

      // ABB2
      Statement ABB2S = new Statement(this.mCFG, v1, new False(this.mCFG));
      CFGBasicBlockNode ABB2 = new CFGBasicBlockNode("ABB2", this.mCFG);
      ABB2.addStatement(ABB2S);
      // B
      // BDB
      EqualsExpression BDBC = new EqualsExpression(this.mCFG, i3, C2);
      CFGDecisionNode BDB = new CFGDecisionNode("BDB", this.mCFG, BDBC, null, null);
      // BBB1
      Statement BBB1S = new Statement(this.mCFG, v3, new True(this.mCFG));
      CFGBasicBlockNode BBB1 = new CFGBasicBlockNode("BBB1", this.mCFG);
      BBB1.addStatement(BBB1S);
      // BBB2
      Statement BBB2S = new Statement(this.mCFG, v3, new False(this.mCFG));
      CFGBasicBlockNode BBB2 = new CFGBasicBlockNode("BBB2", this.mCFG);
      BBB2.addStatement(BBB2S);
      // C
      // CDB
      EqualsExpression CDBC = new EqualsExpression(this.mCFG, i2, C3);
      CFGDecisionNode CDB = new CFGDecisionNode("CDB", this.mCFG, CDBC, null, null);

      // CBB1
      Statement CBB1S = new Statement(this.mCFG, v4, new True(this.mCFG));
      CFGBasicBlockNode CBB1 = new CFGBasicBlockNode("CBB1", this.mCFG);
      CBB1.addStatement(CBB1S);
      // CBB2
      Statement CBB2S = new Statement(this.mCFG, v4, new False(this.mCFG));
      CFGBasicBlockNode CBB2 = new CFGBasicBlockNode("CBB2", this.mCFG);
      CBB2.addStatement(CBB2S);
      // D
      EqualsExpression DDBC = new EqualsExpression(this.mCFG, i2, C4);
      CFGDecisionNode DDB = new CFGDecisionNode("DDB", this.mCFG, DDBC, null, null);

      // DBB1
      Statement DBB1S = new Statement(this.mCFG, v5, new True(this.mCFG));
      CFGBasicBlockNode DBB1 = new CFGBasicBlockNode("DBB1", this.mCFG);
      DBB1.addStatement(DBB1S);
      // DBB2
      Statement DBB2S = new Statement(this.mCFG, v5, new False(this.mCFG));
      CFGBasicBlockNode DBB2 = new CFGBasicBlockNode("DBB2", this.mCFG);
      DBB2.addStatement(DBB2S);

      // E
      // EDB
      NotExpression EDBC = new NotExpression(this.mCFG, new EqualsExpression(this.mCFG, i3, i4));
      CFGDecisionNode EDB = new CFGDecisionNode("EDB", this.mCFG, EDBC, null, null);
      // EBB1
      Statement EBB1S = new Statement(this.mCFG, v2, new True(this.mCFG));
      CFGBasicBlockNode EBB1 = new CFGBasicBlockNode("EBB1", this.mCFG);
      EBB1.addStatement(EBB1S);
      // EBB2
      Statement EBB2S = new Statement(this.mCFG, v2, new False(this.mCFG));
      CFGBasicBlockNode EBB2 = new CFGBasicBlockNode("EBB2", this.mCFG);
      EBB2.addStatement(EBB2S);

      // BB
      Statement BBS1 = new Statement(this.mCFG, v6, new OrExpression(this.mCFG, v4, v5));
      Statement BBS2 =
          new Statement(
              this.mCFG, v7, new OrExpression(this.mCFG, v2, new OrExpression(this.mCFG, v3, v6)));
      Statement BBS3 = new Statement(this.mCFG, v9, new OrExpression(this.mCFG, v6, C6));
      Statement BBS4 = new Statement(this.mCFG, v10, new AndExpression(this.mCFG, v1, v7));

      CFGBasicBlockNode BB = new CFGBasicBlockNode("BB", this.mCFG);
      BB.addStatement(BBS1);
      BB.addStatement(BBS2);
      BB.addStatement(BBS3);
      BB.addStatement(BBS4);
      // F
      // FDB
      EqualsExpression FDBC = new EqualsExpression(this.mCFG, v10, new True(this.mCFG));
      CFGDecisionNode FDB = new CFGDecisionNode("FDB", this.mCFG, FDBC, null, null);
      // FBB1
      Statement FBB1S = new Statement(this.mCFG, v14, C5);
      CFGBasicBlockNode FBB1 = new CFGBasicBlockNode("FBB1", this.mCFG);
      FBB1.addStatement(FBB1S);
      // G
      EqualsExpression GDBC = new EqualsExpression(this.mCFG, v9, new True(this.mCFG));
      CFGDecisionNode GDB = new CFGDecisionNode("GDB", this.mCFG, GDBC, null, null);

      // GBB1
      Statement GBB1S = new Statement(this.mCFG, v14, C7);
      CFGBasicBlockNode GBB1 = new CFGBasicBlockNode("GBB1", this.mCFG);
      GBB1.addStatement(GBB1S);
      // GBB2
      Statement GBB2S = new Statement(this.mCFG, v14, C8);
      CFGBasicBlockNode GBB2 = new CFGBasicBlockNode("GBB2", this.mCFG);
      GBB2.addStatement(GBB2S);

      // Edges
      CFEdge e1 = new CFEdge("e1", this.mCFG, this.mCFGStart, InputBlock);
      CFEdge e2 = new CFEdge("e2", this.mCFG, InputBlock, ADB);
      CFEdge e3 = new CFEdge("e3", this.mCFG, ADB, ABB1);
      CFEdge e4 = new CFEdge("e4", this.mCFG, ADB, ABB2);
      CFEdge e5 = new CFEdge("e5", this.mCFG, ABB1, BDB);
      CFEdge e6 = new CFEdge("e6", this.mCFG, ABB2, BDB);
      CFEdge e7 = new CFEdge("e7", this.mCFG, BDB, BBB1);
      CFEdge e8 = new CFEdge("e8", this.mCFG, BDB, BBB2);
      CFEdge e9 = new CFEdge("e9", this.mCFG, BBB1, CDB);
      CFEdge e10 = new CFEdge("e10", this.mCFG, BBB2, CDB);
      CFEdge e11 = new CFEdge("e11", this.mCFG, CDB, CBB1);
      CFEdge e12 = new CFEdge("e12", this.mCFG, CDB, CBB2);
      CFEdge e13 = new CFEdge("e13", this.mCFG, CBB1, DDB);
      CFEdge e14 = new CFEdge("e14", this.mCFG, CBB2, DDB);
      CFEdge e15 = new CFEdge("e15", this.mCFG, DDB, DBB1);
      CFEdge e16 = new CFEdge("e16", this.mCFG, DDB, DBB2);
      CFEdge e17 = new CFEdge("e17", this.mCFG, DBB1, EDB);
      CFEdge e18 = new CFEdge("e18", this.mCFG, DBB2, EDB);
      CFEdge e19 = new CFEdge("e19", this.mCFG, EDB, EBB1);
      CFEdge e20 = new CFEdge("e20", this.mCFG, EDB, EBB2);
      CFEdge e21 = new CFEdge("e21", this.mCFG, EBB1, BB);
      CFEdge e22 = new CFEdge("e22", this.mCFG, EBB2, BB);
      CFEdge e23 = new CFEdge("e23", this.mCFG, BB, FDB);
      CFEdge e24 = new CFEdge("e24", this.mCFG, FDB, FBB1);
      CFEdge e25 = new CFEdge("e25", this.mCFG, FDB, GDB);
      CFEdge e26 = new CFEdge("e26", this.mCFG, GDB, GBB1);
      CFEdge e27 = new CFEdge("e27", this.mCFG, GDB, GBB2);
      CFEdge e28 = new CFEdge("e28", this.mCFG, FBB1, this.mCFGEnd);
      CFEdge e29 = new CFEdge("e29", this.mCFG, GBB1, this.mCFGEnd);
      CFEdge e30 = new CFEdge("e30", this.mCFG, GBB2, this.mCFGEnd);
      CFEdge e31 = new CFEdge("e31", this.mCFG, this.mCFGEnd, this.mCFGStart);

      System.out.println(this.mCFG.toString());
      CFGToGraphConvertor convertor = new CFGToGraphConvertor(this.mCFG);
      IGraph graph = convertor.getGraph();
      System.out.println(graph.toString());
      System.out.println("Node map:\n");
      for (ICFGNode node : this.mCFG.getNodeSet()) {
        System.out.println(node.getId() + "->" + convertor.getGraphNode(node).getId() + "\n");
      }
      System.out.println("Edge map:\n");
      for (ICFEdge edge : this.mCFG.getEdgeSet()) {
        System.out.println(edge.getId() + "->" + convertor.getGraphEdge(edge).getId() + "\n");
      }
    } catch (Exception e) {
      System.out.println(e.getMessage());
      e.printStackTrace();
    }
  }