// Path: src/main/java/au/com/anthonybruno/generator/Generator.java
// @FunctionalInterface
// public interface Generator<T> {
// 
//     T generate();
// }
// 
// Path: src/main/java/au/com/anthonybruno/generator/OptionGenerator.java
// public class OptionGenerator<T> implements Generator<T> {
// 
//     private final T[] options;
//     private final IntGenerator indexGenerator;
// 
//     public OptionGenerator(T... options)  {
//         this.options = options;
//         this.indexGenerator = new IntGenerator(0, options.length);
//     }
// 
// 
//     @Override
//     public T generate() {
//         return options[indexGenerator.generate()];
//     }
// }
// 
// Path: src/main/java/au/com/anthonybruno/generator/defaults/IntGenerator.java
// public class IntGenerator extends RangedGenerator<Integer> {
// 
//     public IntGenerator() {
//        this(Integer.MIN_VALUE, Integer.MAX_VALUE);
//     }
// 
//     public IntGenerator(int min, int max) {
//         super(min, max);
//     }
// 
//     @Override
//     public Integer generate() {
//         return ThreadLocalRandom.current().nextInt(min, max);
//     }
// }
// 
// Path: src/test/java/au/com/anthonybruno/annotated/GeneratorAnnotationTest.java
// public static final int maxAge = 80;
// 
// Path: src/test/java/au/com/anthonybruno/annotated/GeneratorAnnotationTest.java
// public static final int minAge = 18;


import au.com.anthonybruno.annotation.Generation;
import au.com.anthonybruno.annotation.Range;
import au.com.anthonybruno.generator.Generator;
import au.com.anthonybruno.generator.OptionGenerator;
import au.com.anthonybruno.generator.defaults.IntGenerator;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import static au.com.anthonybruno.annotated.GeneratorAnnotationTest.maxAge;
import static au.com.anthonybruno.annotated.GeneratorAnnotationTest.minAge;
package au.com.anthonybruno.annotated;




public class AnnotatedPerson {

    @Generation(NameGenerator.class)
    private final String name;

    @Range(min=minAge, max=maxAge)
    @Generation(value = IntGenerator.class, name="yearsSinceBirth")
    private final int age;

    @Generation(GenderGenerator.class)
    private final String gender;

    public AnnotatedPerson(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public static class NameGenerator implements Generator<String> {

        private static final String[] names = {"Olivia", "Charlotte", "Mia", "Ava", "Amelia", "Emily", "Sofia", "Ruby"};
        private static final int namesLength = names.length;

        @Override
        public String generate() {
            int randIndex = ThreadLocalRandom.current().nextInt(0, namesLength);
            return names[randIndex];
        }

        public static List<String> getNames() {
// Path: src/main/java/au/com/anthonybruno/generator/Generator.java
// @FunctionalInterface
// public interface Generator<T> {
// 
//     T generate();
// }
// 
// Path: src/main/java/au/com/anthonybruno/generator/OptionGenerator.java
// public class OptionGenerator<T> implements Generator<T> {
// 
//     private final T[] options;
//     private final IntGenerator indexGenerator;
// 
//     public OptionGenerator(T... options)  {
//         this.options = options;
//         this.indexGenerator = new IntGenerator(0, options.length);
//     }
// 
// 
//     @Override
//     public T generate() {
//         return options[indexGenerator.generate()];
//     }
// }
// 
// Path: src/main/java/au/com/anthonybruno/generator/defaults/IntGenerator.java
// public class IntGenerator extends RangedGenerator<Integer> {
// 
//     public IntGenerator() {
//        this(Integer.MIN_VALUE, Integer.MAX_VALUE);
//     }
// 
//     public IntGenerator(int min, int max) {
//         super(min, max);
//     }
// 
//     @Override
//     public Integer generate() {
//         return ThreadLocalRandom.current().nextInt(min, max);
//     }
// }
// 
// Path: src/test/java/au/com/anthonybruno/annotated/GeneratorAnnotationTest.java
// public static final int maxAge = 80;
// 
// Path: src/test/java/au/com/anthonybruno/annotated/GeneratorAnnotationTest.java
// public static final int minAge = 18;


// Path: src/test/java/au/com/anthonybruno/annotated/AnnotatedPerson.java
import au.com.anthonybruno.annotation.Generation;
import au.com.anthonybruno.annotation.Range;
import au.com.anthonybruno.generator.Generator;
import au.com.anthonybruno.generator.OptionGenerator;
import au.com.anthonybruno.generator.defaults.IntGenerator;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import static au.com.anthonybruno.annotated.GeneratorAnnotationTest.maxAge;
import static au.com.anthonybruno.annotated.GeneratorAnnotationTest.minAge;

package au.com.anthonybruno.annotated;




public class AnnotatedPerson {

    @Generation(NameGenerator.class)
    private final String name;

    @Range(min=minAge, max=maxAge)
    @Generation(value = IntGenerator.class, name="yearsSinceBirth")
    private final int age;

    @Generation(GenderGenerator.class)
    private final String gender;

    public AnnotatedPerson(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public static class NameGenerator implements Generator<String> {

        private static final String[] names = {"Olivia", "Charlotte", "Mia", "Ava", "Amelia", "Emily", "Sofia", "Ruby"};
        private static final int namesLength = names.length;

        @Override
        public String generate() {
            int randIndex = ThreadLocalRandom.current().nextInt(0, namesLength);
            return names[randIndex];
        }

        public static List<String> getNames() {
            return Arrays.asList(names);