// Path: src/main/java/com/sergiandreplace/testabean/exception/FieldException.java
// public class FieldException extends Exception {
//     private String field;
// 
//     public FieldException(String message, String field) {
//         super(message);
//         setField(field);
//     }
// 
//     public FieldException(String message, String field, Throwable cause) {
//         super(message,cause);
//         setField(field);
//     }
// 
//     public String getField() {
//         return field;
//     }
// 
//     public void setField(String field) {
//         this.field = field;
//     }
// }
// 
// Path: src/main/java/com/sergiandreplace/testabean/generator/Generator.java
// public interface Generator<T> {
//     T next();
// 
// }
// 
// Path: src/main/java/com/sergiandreplace/testabean/generator/GeneratorFactory.java
// public class GeneratorFactory {
//     private final Map<Class, Generator> generators;
// 
//     public GeneratorFactory() {
//         generators = new HashMap<>();
//         add(new StringGenerator());
//         add(new IntGenerator());
//         add(new LongGenerator());
//         add(new BooleanGenerator());
//         add(new FloatGenerator());
//         add(new DoubleGenerator());
//         add(new ShortGenerator());
//         add(new ByteGenerator());
//         add(new DateGenerator());
//         add(new ListGenerator());
//         add(new CharGenerator());
//     }
// 
// 
//     public void add(Generator generator) {
//         TargetClass annotation = generator.getClass().getAnnotation(com.sergiandreplace.testabean.annotation.TargetClass.class);
//         if (annotation == null) {
//             throw new IllegalArgumentException("TargetClass annotation not found");
//         }
// 
//         for (Class clazz : annotation.value()) {
//             generators.put(clazz, generator);
//         }
//     }
// 
//     public Generator get(Class targetClass) {
//         if (targetClass.isArray()) {
//             return new ArrayGenerator(targetClass.getComponentType(), this);
//         }
//         return generators.get(targetClass);
//     }
// 
//     public Map<Class, Generator> getGenerators() {
//         return generators;
//     }
// 
// 
// }


import com.sergiandreplace.testabean.exception.FieldException;
import com.sergiandreplace.testabean.generator.Generator;
import com.sergiandreplace.testabean.generator.GeneratorFactory;
import java.lang.reflect.InvocationTargetException;
        if (!value.equals(returnedValue)) {
            throw new FieldException("Field " + beanField.getFieldName() + " assignment not working as expected\n" +
                    "Expected: " + value.toString() + "\n" +
                    "Obtained: " + returnedValue, beanField.getFieldName());
        }
    }

    public void checkAssignment(int times) throws FieldException {

        for (int i=0;i<times;i++) {
            checkAssignment();
        }

    }

    public void checkTransitivePropertyWorking() throws FieldException {
        Object instanceX=instantiateBean();
        Object instanceY=instantiateBean();
        Object instanceZ=instantiateBean();

        Object value=getGenerator().next();

        executeSetter(instanceX, value);
        executeSetter(instanceY, executeGetter(instanceX));
        executeSetter(instanceZ, executeGetter(instanceY));

        Object returnedValue = executeGetter(instanceZ);

        if (!value.equals(returnedValue)) {
            throw new FieldException("Field " + beanField.getFieldName() + " transitive property not working as expected\n" +
// Path: src/main/java/com/sergiandreplace/testabean/exception/FieldException.java
// public class FieldException extends Exception {
//     private String field;
// 
//     public FieldException(String message, String field) {
//         super(message);
//         setField(field);
//     }
// 
//     public FieldException(String message, String field, Throwable cause) {
//         super(message,cause);
//         setField(field);
//     }
// 
//     public String getField() {
//         return field;
//     }
// 
//     public void setField(String field) {
//         this.field = field;
//     }
// }
// 
// Path: src/main/java/com/sergiandreplace/testabean/generator/Generator.java
// public interface Generator<T> {
//     T next();
// 
// }
// 
// Path: src/main/java/com/sergiandreplace/testabean/generator/GeneratorFactory.java
// public class GeneratorFactory {
//     private final Map<Class, Generator> generators;
// 
//     public GeneratorFactory() {
//         generators = new HashMap<>();
//         add(new StringGenerator());
//         add(new IntGenerator());
//         add(new LongGenerator());
//         add(new BooleanGenerator());
//         add(new FloatGenerator());
//         add(new DoubleGenerator());
//         add(new ShortGenerator());
//         add(new ByteGenerator());
//         add(new DateGenerator());
//         add(new ListGenerator());
//         add(new CharGenerator());
//     }
// 
// 
//     public void add(Generator generator) {
//         TargetClass annotation = generator.getClass().getAnnotation(com.sergiandreplace.testabean.annotation.TargetClass.class);
//         if (annotation == null) {
//             throw new IllegalArgumentException("TargetClass annotation not found");
//         }
// 
//         for (Class clazz : annotation.value()) {
//             generators.put(clazz, generator);
//         }
//     }
// 
//     public Generator get(Class targetClass) {
//         if (targetClass.isArray()) {
//             return new ArrayGenerator(targetClass.getComponentType(), this);
//         }
//         return generators.get(targetClass);
//     }
// 
//     public Map<Class, Generator> getGenerators() {
//         return generators;
//     }
// 
// 
// }


// Path: src/main/java/com/sergiandreplace/testabean/beanfield/BeanFieldTester.java
import com.sergiandreplace.testabean.exception.FieldException;
import com.sergiandreplace.testabean.generator.Generator;
import com.sergiandreplace.testabean.generator.GeneratorFactory;
import java.lang.reflect.InvocationTargetException;

        if (!value.equals(returnedValue)) {
            throw new FieldException("Field " + beanField.getFieldName() + " assignment not working as expected\n" +
                    "Expected: " + value.toString() + "\n" +
                    "Obtained: " + returnedValue, beanField.getFieldName());
        }
    }

    public void checkAssignment(int times) throws FieldException {

        for (int i=0;i<times;i++) {
            checkAssignment();
        }

    }

    public void checkTransitivePropertyWorking() throws FieldException {
        Object instanceX=instantiateBean();
        Object instanceY=instantiateBean();
        Object instanceZ=instantiateBean();

        Object value=getGenerator().next();

        executeSetter(instanceX, value);
        executeSetter(instanceY, executeGetter(instanceX));
        executeSetter(instanceZ, executeGetter(instanceY));

        Object returnedValue = executeGetter(instanceZ);

        if (!value.equals(returnedValue)) {
            throw new FieldException("Field " + beanField.getFieldName() + " transitive property not working as expected\n" +
                    "Expected: " + value.toString() + "\n" +