@Test
  public void testFilter() {

    final SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

    sce.setFactTypes(new String[] {"Person", "Vehicle"});

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

            put(
                "Vehicle",
                new ModelField[] {
                  new ModelField(
                      "make",
                      String.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_STRING),
                });
          }
        });

    assertEquals(2, sce.getFactTypes().length);
    sce.setFactTypeFilter(
        new FactTypeFilter() {
          public boolean filter(String originalFact) {
            return "Person".equals(originalFact);
          }
        });

    assertEquals(1, sce.getFactTypes().length);
    sce.setFilteringFacts(false);

    assertEquals(2, sce.getFactTypes().length);
    sce.setFilteringFacts(true);
    assertEquals(1, sce.getFactTypes().length);

    sce.setFactTypeFilter(null);
    assertEquals(2, sce.getFactTypes().length);
  }
  @Test
  public void testAdd() {
    final SuggestionCompletionEngine com = new SuggestionCompletionEngine();
    com.setFactTypes(new String[] {"Foo"});
    com.setFieldsForTypes(
        new HashMap<String, ModelField[]>() {
          {
            put(
                "Foo",
                new ModelField[] {
                  new ModelField(
                      "a", String.class.getName(), FIELD_CLASS_TYPE.REGULAR_CLASS, "String")
                });
          }
        });

    assertEquals(1, com.getFactTypes().length);
    assertEquals("Foo", com.getFactTypes()[0]);

    assertEquals(1, com.getFieldCompletions("Foo").length);
    assertEquals("a", com.getFieldCompletions("Foo")[0]);
  }
  @Test
  @SuppressWarnings("serial")
  public void testCEPCompletions() {

    final SuggestionCompletionEngine com = new SuggestionCompletionEngine();

    com.setFactTypes(new String[] {"NotAnEvent", "AnEvent"});

    com.setFieldsForTypes(
        new HashMap<String, ModelField[]>() {
          {
            put(
                "NotAnEvent",
                new ModelField[] {
                  new ModelField(
                      "dateField",
                      Date.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_DATE)
                });

            put(
                "AnEvent",
                new ModelField[] {
                  new ModelField(
                      "this", Object.class.getName(), FIELD_CLASS_TYPE.REGULAR_CLASS, "AnEvent"),
                  new ModelField(
                      "dateField",
                      Date.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_DATE)
                });
          }
        });

    // Set-up annotation for Type 'AnEvent'
    Map<String, List<ModelAnnotation>> annotations = new HashMap<String, List<ModelAnnotation>>();
    List<ModelAnnotation> eventAnnotations = new ArrayList<ModelAnnotation>();
    ModelAnnotation ma = new ModelAnnotation();
    ma.setAnnotationName("role");
    Map<String, String> mav = new HashMap<String, String>();
    mav.put("value", "event");
    ma.setAnnotationValues(mav);
    eventAnnotations.add(ma);
    annotations.put("AnEvent", eventAnnotations);
    com.setAnnotationsForTypes(annotations);

    // Check completions
    String[] c = com.getFactTypes();
    assertEquals(2, c.length);
    assertContains("NotAnEvent", c);
    assertContains("AnEvent", c);

    c = com.getOperatorCompletions("NotAnEvent", "dateField");
    assertEquals(11, c.length);
    assertEquals(c[0], "==");
    assertEquals(c[1], "!=");
    assertEquals(c[2], "<");
    assertEquals(c[3], ">");
    assertEquals(c[4], "<=");
    assertEquals(c[5], ">=");
    assertEquals(c[6], "== null");
    assertEquals(c[7], "!= null");
    assertEquals(c[8], "after");
    assertEquals(c[9], "before");
    assertEquals(c[10], "coincides");

    c = com.getOperatorCompletions("AnEvent", "this");
    assertEquals(17, c.length);
    assertEquals(c[0], "==");
    assertEquals(c[1], "!=");
    assertEquals(c[2], "== null");
    assertEquals(c[3], "!= null");
    assertEquals(c[4], "after");
    assertEquals(c[5], "before");
    assertEquals(c[6], "coincides");
    assertEquals(c[7], "during");
    assertEquals(c[8], "finishes");
    assertEquals(c[9], "finishedby");
    assertEquals(c[10], "includes");
    assertEquals(c[11], "meets");
    assertEquals(c[12], "metby");
    assertEquals(c[13], "overlaps");
    assertEquals(c[14], "overlappedby");
    assertEquals(c[15], "starts");
    assertEquals(c[16], "startedby");
  }
  @Test
  @SuppressWarnings("serial")
  public void testCEPParameterCompletions() {

    final SuggestionCompletionEngine com = new SuggestionCompletionEngine();

    com.setFactTypes(new String[] {"AnEvent"});

    com.setFieldsForTypes(
        new HashMap<String, ModelField[]>() {
          {
            put(
                "AnEvent",
                new ModelField[] {
                  new ModelField(
                      "this", Object.class.getName(), FIELD_CLASS_TYPE.REGULAR_CLASS, "AnEvent")
                });
          }
        });

    // Set-up annotation for Type 'AnEvent'
    Map<String, List<ModelAnnotation>> annotations = new HashMap<String, List<ModelAnnotation>>();
    List<ModelAnnotation> eventAnnotations = new ArrayList<ModelAnnotation>();
    ModelAnnotation ma = new ModelAnnotation();
    ma.setAnnotationName("role");
    Map<String, String> mav = new HashMap<String, String>();
    mav.put("value", "event");
    ma.setAnnotationValues(mav);
    eventAnnotations.add(ma);
    annotations.put("AnEvent", eventAnnotations);
    com.setAnnotationsForTypes(annotations);

    // Check completions
    List<Integer> c = SuggestionCompletionEngine.getCEPOperatorParameterSets("after");
    assertEquals(3, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());
    assertEquals(2, c.get(2).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("before");
    assertEquals(3, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());
    assertEquals(2, c.get(2).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("coincides");
    assertEquals(3, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());
    assertEquals(2, c.get(2).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("during");
    assertEquals(4, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());
    assertEquals(2, c.get(2).intValue());
    assertEquals(4, c.get(3).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("finishes");
    assertEquals(2, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("finishedby");
    assertEquals(2, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("includes");
    assertEquals(4, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());
    assertEquals(2, c.get(2).intValue());
    assertEquals(4, c.get(3).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("meets");
    assertEquals(2, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("metby");
    assertEquals(2, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("overlaps");
    assertEquals(3, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());
    assertEquals(2, c.get(2).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("overlappedby");
    assertEquals(3, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());
    assertEquals(2, c.get(2).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("starts");
    assertEquals(2, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());

    c = SuggestionCompletionEngine.getCEPOperatorParameterSets("startedby");
    assertEquals(2, c.size());
    assertEquals(0, c.get(0).intValue());
    assertEquals(1, c.get(1).intValue());
  }
  @Test
  public void testCompletions() {

    final SuggestionCompletionEngine com = new SuggestionCompletionEngine();

    com.setFactTypes(new String[] {"Person", "Vehicle"});

    com.setFieldsForTypes(
        new HashMap<String, ModelField[]>() {
          {
            put(
                "Person",
                new ModelField[] {
                  new ModelField(
                      "age",
                      Integer.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER),
                  new ModelField(
                      "rank",
                      Integer.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_COMPARABLE),
                  new ModelField(
                      "name",
                      String.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_STRING)
                });

            put(
                "Vehicle",
                new ModelField[] {
                  new ModelField(
                      "make",
                      String.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_STRING),
                  new ModelField(
                      "type",
                      String.class.getName(),
                      FIELD_CLASS_TYPE.REGULAR_CLASS,
                      SuggestionCompletionEngine.TYPE_STRING)
                });
          }
        });

    com.setGlobalVariables(
        new HashMap<String, String>() {
          {
            put("bar", "Person");
            put("baz", "Vehicle");
          }
        });

    String[] c = com.getConditionalElements();
    assertEquals("not", c[0]);
    assertEquals("exists", c[1]);
    assertEquals("or", c[2]);

    c = com.getFactTypes();
    assertEquals(2, c.length);
    assertContains("Person", c);
    assertContains("Vehicle", c);

    c = com.getFieldCompletions("Person");
    assertEquals("age", c[0]);
    assertEquals("rank", c[1]);
    assertEquals("name", c[2]);

    c = com.getFieldCompletions("Vehicle");
    assertEquals("type", c[1]);
    assertEquals("make", c[0]);

    c = com.getOperatorCompletions("Person", "name");
    assertEquals(11, c.length);
    assertEquals("==", c[0]);
    assertEquals("!=", c[1]);
    assertEquals("<", c[2]);
    assertEquals(">", c[3]);
    assertEquals("<=", c[4]);
    assertEquals(">=", c[5]);
    assertEquals("matches", c[6]);
    assertEquals("soundslike", c[7]);
    assertEquals("== null", c[8]);
    assertEquals("!= null", c[9]);
    assertEquals("in", c[10]);

    c = com.getOperatorCompletions("Person", "age");
    assertEquals(8, c.length);
    assertEquals(c[0], "==");
    assertEquals(c[1], "!=");
    assertEquals(c[2], "<");
    assertEquals(c[3], ">");
    assertEquals(c[4], "<=");
    assertEquals(c[5], ">=");
    assertEquals(c[6], "== null");
    assertEquals(c[7], "!= null");

    c = com.getOperatorCompletions("Person", "rank");
    assertEquals(8, c.length);
    assertEquals(c[0], "==");
    assertEquals(c[1], "!=");
    assertEquals(c[2], "<");
    assertEquals(c[3], ">");
    assertEquals(c[4], "<=");
    assertEquals(c[5], ">=");
    assertEquals(c[6], "== null");
    assertEquals(c[7], "!= null");

    c = com.getConnectiveOperatorCompletions("Vehicle", "make");
    assertEquals(13, c.length);
    assertEquals("|| ==", c[0]);
    assertEquals("|| !=", c[1]);
    assertEquals("&& !=", c[2]);
    assertEquals("&& >", c[3]);
    assertEquals("&& <", c[4]);
    assertEquals("|| >", c[5]);
    assertEquals("|| <", c[6]);
    assertEquals("&& >=", c[7]);
    assertEquals("&& <=", c[8]);
    assertEquals("|| <=", c[9]);
    assertEquals("|| >=", c[10]);
    assertEquals("&& matches", c[11]);
    assertEquals("|| matches", c[12]);

    c = com.getGlobalVariables();
    assertEquals(2, c.length);
    assertEquals("baz", c[0]);
    assertEquals("bar", c[1]);

    c = com.getFieldCompletionsForGlobalVariable("bar");
    assertEquals(3, c.length);
    assertEquals("age", c[0]);
    assertEquals("rank", c[1]);
    assertEquals("name", c[2]);

    c = com.getFieldCompletionsForGlobalVariable("baz");
    assertEquals(2, c.length);
    assertEquals("make", c[0]);
    assertEquals("type", c[1]);

    // check that it has default operators for general objects
    c = com.getOperatorCompletions("Person", "wankle");
    assertEquals(4, c.length);

    assertEquals("Integer", com.getFieldType("Person", "age"));
  }