@Test
  public void testCycle() throws JSONObjectAdapterException {
    // Create an object with nesting
    ObjectSchema root = new ObjectSchema();
    root.setName("Root");
    String rootId = new String("root");
    root.setId(rootId);
    // Create a child class
    ObjectSchema child = new ObjectSchema();
    String childId = new String("child");
    child.setName("Child");
    child.setId(childId);
    child.setType(TYPE.OBJECT);
    root.putProperty("childInstance1", child);
    // Add a self reference child
    ObjectSchema rootRef = new ObjectSchema();
    rootRef.setRef(rootId);
    child.putProperty("rootRef", rootRef);
    // Create a grand child

    List<ObjectSchema> list = new ArrayList<ObjectSchema>();
    list.add(root);
    Map<String, ObjectSchema> register =
        PojoGeneratorDriver.registerAllIdentifiedObjectSchemas(list);
    PojoGeneratorDriver.findAndReplaceAllReferencesSchemas(register, list);
  }
 @Test
 public void testCreateOrGetTypeExtends() throws ClassNotFoundException {
   JCodeModel codeModel = new JCodeModel();
   ObjectSchema parent = new ObjectSchema();
   parent.setType(TYPE.OBJECT);
   parent.setName("ParentClass");
   parent.setId("org.sample." + parent.getName());
   schema.setExtends(parent);
   schema.setType(TYPE.OBJECT);
   schema.setName("ChildClass");
   JType type = driver.createOrGetType(codeModel, schema);
   assertNotNull(type);
   JDefinedClass def = (JDefinedClass) type;
   String classDeffString = declareToString(def);
   assertTrue(classDeffString.indexOf("extends org.sample.ParentClass") > 0);
 }
 @Before
 public void before() {
   driver = new PojoGeneratorDriver(new HandlerFactoryImpl03());
   schema = new ObjectSchema();
   schema.setName("SampleClass");
   schema.setId("org.sample." + schema.getName());
 }
  @Test
  public void testInterfaceField() throws JSONObjectAdapterException, ClassNotFoundException {
    // Create an object with nesting
    ObjectSchema inter = new ObjectSchema();
    inter.setName("SomeInterface");
    inter.setType(TYPE.INTERFACE);
    inter.setId("example.org.SomeInterface");

    ObjectSchema interRef = new ObjectSchema();
    interRef.setRef(inter.getId());

    ObjectSchema impl = new ObjectSchema();
    impl.setName("SomeInterfaceImpl");
    impl.setType(TYPE.OBJECT);
    impl.setId("example.org.SomeInterfaceImpl");
    impl.setImplements(new ObjectSchema[] {interRef});

    ObjectSchema root = new ObjectSchema();
    root.setName("Root");
    root.setId(new String("root"));
    root.setType(TYPE.OBJECT);

    // Create a child class
    ObjectSchema child = new ObjectSchema();
    String childId = new String("child");
    child.setName("Child");
    child.setId(childId);
    child.setType(TYPE.OBJECT);
    child.setRef(inter.getId());
    root.putProperty("interfaceField", child);

    List<ObjectSchema> list = new ArrayList<ObjectSchema>();
    list.add(inter);
    list.add(impl);
    list.add(root);
    //		Map<String, ObjectSchema> register =
    // PojoGeneratorDriver.registerAllIdentifiedObjectSchemas(list);
    //		List<ObjectSchema> schemaList =
    // PojoGeneratorDriver.findAndReplaceAllReferencesSchemas(register, list);
    JCodeModel codeModel = new JCodeModel();
    driver.createAllClasses(codeModel, list);
  }
 @Test
 public void testCreateOrGetTypeImplements() throws ClassNotFoundException {
   JCodeModel codeModel = new JCodeModel();
   ObjectSchema parent = new ObjectSchema();
   parent.setType(TYPE.INTERFACE);
   parent.setName("ParentInterface");
   parent.setId("org.sample." + parent.getName());
   schema.setImplements(new ObjectSchema[] {parent});
   schema.setType(TYPE.OBJECT);
   schema.setName("ChildClass");
   JType type = driver.createOrGetType(codeModel, schema);
   assertNotNull(type);
   JDefinedClass def = (JDefinedClass) type;
   String classDeffString = declareToString(def);
   //		System.out.println(classDeffString);
   assertTrue(
       classDeffString.indexOf(
               "implements java.io.Serializable, org.sagebionetworks.schema.adapter.JSONEntity, org.sample.ParentInterface")
           > 0);
 }
  @Test
  public void testNestedObjects() throws JSONObjectAdapterException {
    // Create an object with nesting
    ObjectSchema root = new ObjectSchema();
    root.setName("Root");
    root.setId(new String("root"));
    // Create a child class
    ObjectSchema child = new ObjectSchema();
    child.setName("Child");
    child.setType(TYPE.OBJECT);
    root.putProperty("childInstance1", child);
    // Create a grand child
    ObjectSchema grand = new ObjectSchema();
    grand.setName("Grand");
    grand.setType(TYPE.OBJECT);
    String grandId = new String("grand");
    grand.setId(grandId);
    child.putProperty("grandChildInstance1", grand);
    ObjectSchema grandRef = new ObjectSchema();
    grandRef.setRef(grandId);
    child.putProperty("grandChildInstance2", grandRef);
    System.out.println(root.toJSONString(new JSONObjectAdapterImpl()));
    List<ObjectSchema> list = new ArrayList<ObjectSchema>();
    list.add(root);

    // Now before the are replaces this should be a references
    ObjectSchema test = child.getProperties().get("grandChildInstance2");
    assertNotNull(test);
    assertEquals(grandId, test.getRef());

    Map<String, ObjectSchema> register =
        PojoGeneratorDriver.registerAllIdentifiedObjectSchemas(list);
    PojoGeneratorDriver.findAndReplaceAllReferencesSchemas(register, list);
    // Validate that the nest grand child reference is replaced
    test = child.getProperties().get("grandChildInstance2");
    assertNotNull(test);
    assertEquals(null, test.getRef());
    assertEquals(grand, test);
  }