@SuppressWarnings("serial")
  private SuggestionCompletionEngine buildSuggestionCompletionEngine() {
    SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

    sce.setFieldsForTypes(
        new HashMap<String, ModelField[]>() {
          {
            put(
                "Driver",
                new ModelField[] {
                  new ModelField(
                      "name",
                      String.class.getName(),
                      ModelField.FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_STRING),
                  new ModelField(
                      "age",
                      Integer.class.getName(),
                      ModelField.FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_NUMERIC),
                  new ModelField(
                      "dateOfBirth",
                      Date.class.getName(),
                      ModelField.FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_DATE),
                  new ModelField(
                      "approved",
                      Boolean.class.getName(),
                      ModelField.FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_BOOLEAN)
                });
          }
        });
    return sce;
  }
  @Test
  public void testGetType() {
    SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

    sce.setFieldsForTypes(
        new HashMap<String, ModelField[]>() {
          {
            put(
                "Driver",
                new ModelField[] {
                  new ModelField(
                      "age",
                      Integer.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_NUMERIC),
                  new ModelField(
                      "name",
                      String.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_STRING),
                  new ModelField(
                      "date",
                      Date.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_DATE),
                  new ModelField(
                      "approved",
                      Boolean.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_BOOLEAN)
                });
          }
        });

    TypeSafeGuidedDecisionTable dt = new TypeSafeGuidedDecisionTable();

    AttributeCol salienceAttribute = new AttributeCol();
    salienceAttribute.setAttribute("salience");
    AttributeCol enabledAttribute = new AttributeCol();
    enabledAttribute.setAttribute("enabled");

    dt.getAttributeCols().add(salienceAttribute);
    dt.getAttributeCols().add(enabledAttribute);

    ConditionCol conditionColName = new ConditionCol();
    conditionColName.setBoundName("c1");
    conditionColName.setFactType("Driver");
    conditionColName.setFactField("name");
    conditionColName.setOperator("==");
    conditionColName.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(conditionColName);

    ConditionCol conditionColAge = new ConditionCol();
    conditionColAge.setBoundName("c1");
    conditionColAge.setFactType("Driver");
    conditionColAge.setFactField("age");
    conditionColAge.setOperator("==");
    conditionColAge.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(conditionColAge);

    ConditionCol conditionColDate = new ConditionCol();
    conditionColDate.setBoundName("c1");
    conditionColDate.setFactType("Driver");
    conditionColDate.setFactField("date");
    conditionColDate.setOperator("==");
    conditionColDate.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(conditionColDate);

    ConditionCol conditionColApproved = new ConditionCol();
    conditionColApproved.setBoundName("c1");
    conditionColApproved.setFactType("Driver");
    conditionColApproved.setFactField("approved");
    conditionColApproved.setOperator("==");
    conditionColApproved.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(conditionColApproved);

    ConditionCol conditionColAge2 = new ConditionCol();
    conditionColAge2.setBoundName("c1");
    conditionColAge2.setFactType("Driver");
    conditionColAge2.setFactField("age");
    conditionColAge2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(conditionColAge2);

    ActionSetFieldCol a = new ActionSetFieldCol();
    a.setBoundName("c1");
    a.setFactField("name");
    dt.getActionCols().add(a);

    ActionSetFieldCol a2 = new ActionSetFieldCol();
    a2.setBoundName("c1");
    a2.setFactField("age");
    dt.getActionCols().add(a2);

    ActionInsertFactCol ins = new ActionInsertFactCol();
    ins.setBoundName("x");
    ins.setFactType("Driver");
    ins.setFactField("name");
    dt.getActionCols().add(ins);

    ActionInsertFactCol ins_ = new ActionInsertFactCol();
    ins_.setBoundName("x");
    ins_.setFactType("Driver");
    ins_.setFactField("age");
    dt.getActionCols().add(ins_);

    assertEquals("salience", dt.getType(salienceAttribute, sce));
    assertEquals("enabled", dt.getType(enabledAttribute, sce));
    assertEquals(SuggestionCompletionEngine.TYPE_STRING, dt.getType(conditionColName, sce));
    assertEquals(SuggestionCompletionEngine.TYPE_NUMERIC, dt.getType(conditionColAge, sce));
    assertEquals(SuggestionCompletionEngine.TYPE_DATE, dt.getType(conditionColDate, sce));
    assertEquals(SuggestionCompletionEngine.TYPE_BOOLEAN, dt.getType(conditionColApproved, sce));
    assertEquals(SuggestionCompletionEngine.TYPE_STRING, dt.getType(a, sce));
    assertEquals(SuggestionCompletionEngine.TYPE_NUMERIC, dt.getType(a2, sce));
    assertEquals(SuggestionCompletionEngine.TYPE_STRING, dt.getType(ins, sce));
    assertEquals(SuggestionCompletionEngine.TYPE_NUMERIC, dt.getType(ins_, sce));
    assertEquals(SuggestionCompletionEngine.TYPE_NUMERIC, dt.getType(conditionColAge2, sce));
  }
  @Test
  public void testNoConstraints() {
    TypeSafeGuidedDecisionTable dt = new TypeSafeGuidedDecisionTable();

    // add cols for LHS
    RowNumberCol rnc = new RowNumberCol();
    DescriptionCol dc = new DescriptionCol();

    MetadataCol mdc = new MetadataCol();
    mdc.setMetadata("cheese");

    AttributeCol ac = new AttributeCol();
    ac.setAttribute("salience");

    ActionSetFieldCol asfc = new ActionSetFieldCol();
    asfc.setBoundName("d1");
    asfc.setFactField("age");

    ActionInsertFactCol aifc = new ActionInsertFactCol();
    aifc.setBoundName("d2");
    aifc.setFactType("Driver");
    aifc.setFactField("age");

    ConditionCol c1 = new ConditionCol();
    c1.setBoundName("c1");
    c1.setFactType("Driver");
    c1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(c1);

    ConditionCol c2 = new ConditionCol();
    c2.setBoundName("c2");
    c2.setFactType("Driver");
    c2.setFactField("age");
    c2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(c2);

    ConditionCol c3 = new ConditionCol();
    c3.setBoundName("c3");
    c3.setFactType("Driver");
    c3.setOperator("==");
    c3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(c3);

    ConditionCol c4 = new ConditionCol();
    c4.setBoundName("c4");
    c4.setFactType("Driver");
    c4.setFactField("age");
    c4.setOperator("==");
    c4.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(c4);

    ConditionCol c5 = new ConditionCol();
    c5.setBoundName("c5");
    c5.setFactType("Driver");
    c5.setConstraintValueType(BaseSingleFieldConstraint.TYPE_PREDICATE);
    dt.getConditionCols().add(c5);

    ConditionCol c6 = new ConditionCol();
    c6.setBoundName("c6");
    c6.setFactType("Driver");
    c6.setConstraintValueType(BaseSingleFieldConstraint.TYPE_RET_VALUE);
    dt.getConditionCols().add(c6);

    SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

    sce.setFieldsForTypes(
        new HashMap<String, ModelField[]>() {
          {
            put(
                "Driver",
                new ModelField[] {
                  new ModelField(
                      "age",
                      Integer.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_NUMERIC),
                  new ModelField(
                      "name",
                      String.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_STRING)
                });
          }
        });

    assertTrue(dt.isConstraintValid(rnc, sce));
    assertTrue(dt.isConstraintValid(dc, sce));
    assertTrue(dt.isConstraintValid(mdc, sce));
    assertTrue(dt.isConstraintValid(ac, sce));
    assertTrue(dt.isConstraintValid(asfc, sce));
    assertTrue(dt.isConstraintValid(aifc, sce));

    assertFalse(dt.isConstraintValid(c1, sce));
    assertFalse(dt.isConstraintValid(c2, sce));
    assertFalse(dt.isConstraintValid(c3, sce));
    assertTrue(dt.isConstraintValid(c4, sce));
    assertTrue(dt.isConstraintValid(c5, sce));
    assertTrue(dt.isConstraintValid(c6, sce));
  }
  @Test
  public void testNumeric() {
    SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

    sce.setFieldsForTypes(
        new HashMap<String, ModelField[]>() {
          {
            put(
                "Driver",
                new ModelField[] {
                  new ModelField(
                      "age",
                      Integer.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_NUMERIC),
                  new ModelField(
                      "name",
                      String.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_STRING)
                });
          }
        });

    TypeSafeGuidedDecisionTable dt = new TypeSafeGuidedDecisionTable();

    AttributeCol at = new AttributeCol();
    at.setAttribute("salience");
    AttributeCol at_ = new AttributeCol();
    at_.setAttribute("enabled");

    dt.getAttributeCols().add(at);
    dt.getAttributeCols().add(at_);

    ConditionCol c1 = new ConditionCol();
    c1.setBoundName("c1");
    c1.setFactType("Driver");
    c1.setFactField("name");
    c1.setOperator("==");
    c1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(c1);

    ConditionCol c1_ = new ConditionCol();
    c1_.setBoundName("c1");
    c1_.setFactType("Driver");
    c1_.setFactField("age");
    c1_.setOperator("==");
    c1_.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(c1_);

    ConditionCol c2 = new ConditionCol();
    c2.setBoundName("c1");
    c2.setFactType("Driver");
    c2.setFactField("age");
    c2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
    dt.getConditionCols().add(c2);

    ActionSetFieldCol a = new ActionSetFieldCol();
    a.setBoundName("c1");
    a.setFactField("name");
    dt.getActionCols().add(a);

    ActionSetFieldCol a2 = new ActionSetFieldCol();
    a2.setBoundName("c1");
    a2.setFactField("age");
    dt.getActionCols().add(a2);

    ActionInsertFactCol ins = new ActionInsertFactCol();
    ins.setBoundName("x");
    ins.setFactType("Driver");
    ins.setFactField("name");
    dt.getActionCols().add(ins);

    ActionInsertFactCol ins_ = new ActionInsertFactCol();
    ins_.setBoundName("x");
    ins_.setFactType("Driver");
    ins_.setFactField("age");
    dt.getActionCols().add(ins_);

    assertTrue(dt.isNumeric(at, sce));
    assertFalse(dt.isNumeric(at_, sce));
    assertFalse(dt.isNumeric(c1, sce));
    assertTrue(dt.isNumeric(c1_, sce));
    assertFalse(dt.isNumeric(a, sce));
    assertTrue(dt.isNumeric(a2, sce));
    assertFalse(dt.isNumeric(ins, sce));
    assertTrue(dt.isNumeric(ins_, sce));
    assertFalse(dt.isNumeric(c2, sce));
  }