public void testDomainClassBinding() {
    GroovyClassLoader cl = new GroovyClassLoader();
    GrailsDomainClass domainClass =
        new DefaultGrailsDomainClass(
            cl.parseClass(
                "public class BinderTestClass {\n"
                    + "    Long id; \n"
                    + "    Long version; \n"
                    + "\n"
                    + "    String firstName; \n"
                    + "    String lastName; \n"
                    + "    String comment; \n"
                    + "    Integer age;\n"
                    + "    boolean active = true"
                    + "\n"
                    + "    static constraints = {\n"
                    + "        firstName(nullable:true,size:4..15)\n"
                    + "        lastName(nullable:false)\n"
                    + "        age(nullable:true)\n"
                    + "    }\n"
                    + "}"));

    DefaultGrailsDomainConfiguration config = getDomainConfig(cl, cl.getLoadedClasses());

    // Test database mappings
    PersistentClass persistentClass = config.getClassMapping("BinderTestClass");
    assertTrue(
        "Property [firstName] must be optional in db mapping",
        persistentClass.getProperty("firstName").isOptional());
    assertFalse(
        "Property [lastName] must be required in db mapping",
        persistentClass.getProperty("lastName").isOptional());
    // Property must be required by default
    assertFalse(
        "Property [comment] must be required in db mapping",
        persistentClass.getProperty("comment").isOptional());

    // Test properties
    assertTrue(
        "Property [firstName] must be optional",
        domainClass.getPropertyByName("firstName").isOptional());
    assertFalse(
        "Property [lastName] must be optional",
        domainClass.getPropertyByName("lastName").isOptional());
    assertFalse(
        "Property [comment] must be required",
        domainClass.getPropertyByName("comment").isOptional());
    assertTrue(
        "Property [age] must be optional", domainClass.getPropertyByName("age").isOptional());
  }
 /**
  * Returns the class type of the searchable property
  *
  * @param grailsDomainClass
  * @param propertyName
  * @param searchableGrailsDomainClasses
  * @return
  */
 public static Class getSearchablePropertyAssociatedClass(
     GrailsDomainClass grailsDomainClass,
     String propertyName,
     Collection searchableGrailsDomainClasses) {
   Assert.notNull(grailsDomainClass, "grailsDomainClass cannot be null");
   Assert.notNull(propertyName, "propertyName cannot be null");
   return getSearchablePropertyAssociatedClass(
       grailsDomainClass.getPropertyByName(propertyName), searchableGrailsDomainClasses);
 }
 private Class<?> getReferencedTypeForCollection(String name, Object target) {
   final GrailsApplication grailsApplication = ApplicationHolder.getApplication();
   if (grailsApplication != null) {
     GrailsDomainClass dc =
         (GrailsDomainClass)
             grailsApplication.getArtefact(
                 DomainClassArtefactHandler.TYPE, target.getClass().getName());
     if (dc != null) {
       GrailsDomainClassProperty domainProperty = dc.getPropertyByName(name);
       if (domainProperty != null) {
         return domainProperty.getReferencedPropertyType();
       }
     }
   }
   return null;
 }