@Test
  public void testToDrl() {

    List<FieldMetaModel> fields = new ArrayList<FieldMetaModel>();
    fields.add(new FieldMetaModel("f1", "int"));
    fields.add(new FieldMetaModel("f2", "String"));

    FactMetaModel mm = new FactMetaModel("FooBar", fields);

    FactModelContentHandler ch = new FactModelContentHandler();
    String drl = ch.toDRL(mm);
    assertNotNull(drl);
    System.err.println(drl);
    assertEquals("declare FooBar\n\tf1: int\n\tf2: String\nend", drl);

    FactMetaModel mm2 = new FactMetaModel("BooBah", new ArrayList<FieldMetaModel>());
    List<FactMetaModel> models = new ArrayList<FactMetaModel>();
    models.add(mm);
    models.add(mm2);

    drl = ch.toDRL(models);
    System.err.println(drl);
    assertTrue(drl.indexOf("FooBar") > -1);
    assertTrue(drl.indexOf("BooBah") > drl.indexOf("FooBar"));
  }
  @Test
  public void testFromEmptyDrl() throws Exception {
    String drl = "";

    FactModelContentHandler ch = new FactModelContentHandler();
    List<FactMetaModel> list = ch.toModel(drl);
    assertNotNull(list);
  }
  @Test
  public void testFromDrlDeclarationEmpty() throws Exception {

    String drl = "declare FooBar\nend";

    FactModelContentHandler ch = new FactModelContentHandler();
    List<FactMetaModel> list = ch.toModel(drl);
    assertEquals(1, list.size());
    FactMetaModel mm = list.get(0);
    assertEquals("FooBar", mm.getName());
    assertEquals(0, mm.getFields().size());
  }
  @Test
  public void testAdvanced() throws Exception {

    String drl = "#advanced editor \ndeclare FooBar\n\t name: String  \nend";
    try {
      FactModelContentHandler ch = new FactModelContentHandler();
      ch.toModel(drl);
      fail("should not parse this");
    } catch (DroolsParserException e) {
      assertNotNull(e.getMessage());
    }
  }
  @Test
  public void testFromDrlDeclarationWithAnnotations() throws Exception {

    String drl = "declare FooBar\n\t@role(event)\nend";

    FactModelContentHandler ch = new FactModelContentHandler();
    List<FactMetaModel> list = ch.toModel(drl);
    assertEquals(1, list.size());
    FactMetaModel mm = list.get(0);
    assertEquals("FooBar", mm.getName());
    assertEquals(0, mm.getFields().size());
    assertEquals(1, mm.getAnnotations().size());
    assertEquals("event", mm.getAnnotations().get(0).values.get("value"));
  }
  @Test
  public void testStore() throws Exception {
    FactModelContentHandler ch = new FactModelContentHandler();

    RulesRepository repo = rulesRepository;

    PackageItem pkg = repo.loadDefaultPackage();
    AssetItem asset = pkg.addAsset("testDeclaredTypeStore", "");
    asset.updateFormat("model.drl");
    asset.updateContent("declare Foo\n name: String\n end");
    asset.checkin("");

    RuleAsset ass = new RuleAsset();
    ch.retrieveAssetContent(ass, asset);
    assertTrue(ass.getContent() instanceof FactModels);
    FactModels fm = (FactModels) ass.getContent();

    assertEquals(1, fm.models.size());
    FactMetaModel mm = (FactMetaModel) fm.models.get(0);
    assertEquals(1, mm.getFields().size());
    assertEquals("Foo", mm.getName());

    FieldMetaModel fmm = (FieldMetaModel) mm.getFields().get(0);
    assertEquals("name", fmm.name);

    mm.getFields().add(new FieldMetaModel("age", "int"));

    ch.storeAssetContent(ass, asset);

    assertTrue(asset.getContent().indexOf("age: int") > -1);

    asset.updateContent("rubbish here");
    asset.checkin("");

    ch.retrieveAssetContent(ass, asset);
    assertTrue(ass.getContent() instanceof RuleContentText);

    ch.storeAssetContent(ass, asset);

    assertEquals("rubbish here", asset.getContent());
  }
  @Test
  public void testFromDrlDeclarationWithFields() throws Exception {
    String drl = "declare FooBar\n\tf1: int\n\tf2: String\nend";

    FactModelContentHandler ch = new FactModelContentHandler();
    List<FactMetaModel> list = ch.toModel(drl);
    assertEquals(1, list.size());
    FactMetaModel mm = list.get(0);
    assertEquals("FooBar", mm.getName());
    assertEquals(2, mm.getFields().size());
    for (int i = 0; i < mm.getFields().size(); i++) {
      FieldMetaModel fm = (FieldMetaModel) mm.getFields().get(1);
      if (fm.name.equals("f1")) {
        assertEquals("f1", fm.name);
        assertEquals("int", fm.type);
      } else {
        assertEquals("f2", fm.name);
        assertEquals("String", fm.type);
      }
    }
  }