@Test
  public void testNoIssues() throws Exception {
    GuidedDecisionTable52 table52 =
        new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable")
            .withConditionIntegerColumn("application", "LoanApplication", "amount", ">")
            .withConditionIntegerColumn("application", "LoanApplication", "amount", "<=")
            .withConditionIntegerColumn("application", "LoanApplication", "lengthYears", "==")
            .withConditionIntegerColumn("application", "LoanApplication", "deposit", "<")
            .withStringColumn("income", "IncomeSource", "type", "==")
            .withActionSetField("application", "approved", DataType.TYPE_BOOLEAN)
            .withActionSetField("application", "insuranceCost", DataType.TYPE_NUMERIC_INTEGER)
            .withActionSetField("application", "approvedRate", DataType.TYPE_NUMERIC_INTEGER)
            .withData(
                new Object[][] {
                  {1, "description", 131000, 200000, 30, 20000, "Asset", true, 0, 2},
                  {2, "description", 10000, 100000, 20, 2000, "Job", true, 0, 4},
                  {3, "description", 100001, 130000, 20, 3000, "Job", true, 10, 6},
                  {4, "description", null, null, null, null, null, null, null, null},
                  {5, "description", null, null, null, null, null, null, null, null}
                })
            .build();

    DecisionTableAnalyzer analyzer = getDecisionTableAnalyzer(table52);

    analyzer.onValidate(
        new ValidateEvent(
            new HashMap<Coordinate, List<List<CellValue<? extends Comparable<?>>>>>()));

    assertDoesNotContain("ThisRowIsRedundantTo(1)", analysisReport);
    assertDoesNotContain("ThisRowIsRedundantTo(2)", analysisReport);
    assertDoesNotContain("ThisRowIsRedundantTo(3)", analysisReport);
    assertDoesNotContain("ThisRowIsRedundantTo(4)", analysisReport);
    assertDoesNotContain("ThisRowIsRedundantTo(5)", analysisReport);
  }
  @Test
  public void testRedundantRows003() throws Exception {
    GuidedDecisionTable52 table52 =
        new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable")
            .withStringColumn("application", "LoanApplication", "amount", ">")
            .withStringColumn("person", "Person", "name", "==")
            .withEnumColumn("income", "IncomeSource", "type", "==", "Asset,Job")
            .withActionSetField("application", "approved", DataType.TYPE_STRING)
            .withData(
                new Object[][] {
                  {1, "description", "131000", "Toni", "Asset", "true"},
                  {2, "description", "131000", "Toni", "Asset", "true"},
                  {3, "description", "100001", "Michael", "Job", "true"}
                })
            .build();

    DecisionTableAnalyzer analyzer = getDecisionTableAnalyzer(table52);

    analyzer.onValidate(
        new ValidateEvent(
            new HashMap<Coordinate, List<List<CellValue<? extends Comparable<?>>>>>()));

    assertContains("RedundantRows", analysisReport, 1);
    assertContains("RedundantRows", analysisReport, 2);
  }
  @Test
  public void testRedundantRows001() throws Exception {
    GuidedDecisionTable52 table52 =
        new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable")
            .withNumericColumn("application", "LoanApplication", "amount", ">")
            .withNumericColumn("application", "LoanApplication", "amount", "<=")
            .withNumericColumn("application", "LoanApplication", "lengthYears", "==")
            .withNumericColumn("application", "LoanApplication", "deposit", "<")
            .withStringColumn("income", "IncomeSource", "type", "==")
            .withActionSetField("application", "approved", DataType.TYPE_BOOLEAN)
            .withActionSetField("application", "insuranceCost", DataType.TYPE_NUMERIC)
            .withActionSetField("application", "approvedRate", DataType.TYPE_NUMERIC)
            .withData(
                new Object[][] {
                  {1, "description", 131000, 200000, 30, 20000, "Asset", true, 0, 2},
                  {2, "description", 131000, 200000, 30, 20000, "Asset", true, 0, 2},
                  {3, "description", 100001, 130000, 20, 3000, "Job", true, 10, 6}
                })
            .build();

    DecisionTableAnalyzer analyzer = getDecisionTableAnalyzer(table52);

    analyzer.onValidate(
        new ValidateEvent(
            new HashMap<Coordinate, List<List<CellValue<? extends Comparable<?>>>>>()));

    assertContains("RedundantRows", analysisReport, 1);
    assertContains("RedundantRows", analysisReport, 2);
  }
  @Test
  public void testRedundantConditions001() throws Exception {
    GuidedDecisionTable52 table52 =
        new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable")
            .withEnumColumn("a", "Person", "name", "==", "Toni,Eder")
            .withConditionIntegerColumn("a", "Person", "name", "==")
            .withData(new Object[][] {{1, "description", "Toni", "Toni"}})
            .build();

    DecisionTableAnalyzer analyzer = getDecisionTableAnalyzer(table52);

    analyzer.onValidate(
        new ValidateEvent(
            new HashMap<Coordinate, List<List<CellValue<? extends Comparable<?>>>>>()));

    assertContains("RedundantConditions", analysisReport);
  }
  @Test
  public void testRedundantActionsInOneRow002() throws Exception {
    GuidedDecisionTable52 table52 =
        new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable")
            .withConditionIntegerColumn("a", "Person", "name", "==")
            .withActionInsertFact("Person", "b", "salary", DataType.TYPE_NUMERIC_INTEGER)
            .withActionSetField("b", "salary", DataType.TYPE_NUMERIC_INTEGER)
            .withData(
                new Object[][] {
                  {1, "description", "Toni", 100, 100},
                  {2, "description", "Eder", 200, null},
                  {3, "description", "Michael", null, 300},
                  {4, "description", null, null, null, null, null}
                })
            .build();

    DecisionTableAnalyzer analyzer = getDecisionTableAnalyzer(table52);

    analyzer.onValidate(
        new ValidateEvent(
            new HashMap<Coordinate, List<List<CellValue<? extends Comparable<?>>>>>()));

    assertContains("ValueForFactFieldIsSetTwice(b, salary)", analysisReport);
  }
  @Test
  public void testRedundantRowsWithConflict() throws Exception {
    GuidedDecisionTable52 table52 =
        new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable")
            .withConditionIntegerColumn("a", "Person", "age", ">")
            .withConditionIntegerColumn("d", "Account", "deposit", "<")
            .withActionSetField("a", "approved", DataType.TYPE_BOOLEAN)
            .withActionSetField("a", "approved", DataType.TYPE_BOOLEAN)
            .withData(
                new Object[][] {
                  {1, "description", 100, 0, true, true},
                  {2, "description", 100, 0, true, false}
                })
            .build();

    DecisionTableAnalyzer analyzer = getDecisionTableAnalyzer(table52);

    analyzer.onValidate(
        new ValidateEvent(
            new HashMap<Coordinate, List<List<CellValue<? extends Comparable<?>>>>>()));

    assertDoesNotContain("ThisRowIsRedundantTo(1)", analysisReport);
    assertDoesNotContain("ThisRowIsRedundantTo(2)", analysisReport);
  }