package net.karneim.pojobuilder.testenv;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.google.common.collect.Iterables;
import com.google.common.collect.Iterators;
/**
* @author Adrodoc55
*/
public class TestDslBase {
private static final Random RANDOM = new Random(5);
private static final IntBuilder $int = new IntBuilder(RANDOM);
public static <P> P some(Builder<P> builder) {
return builder.build();
}
public static IntBuilder $int() {
return $int;
}
public static Builder<String> $String() {
return new Builder<String>() {
@Override
public String build() {
return "String" + some($int());
}
};
}
public static Builder<Boolean> $boolean() {
return new Builder<Boolean>() {
@Override
public Boolean build() {
return RANDOM.nextBoolean();
}
};
}
public static int few() {
return some($int().between(2, 4));
}
public static int several() {
return some($int().between(5, 10));
}
public static int many() {
return some($int().between(11, 100));
}
@SafeVarargs
public static <C> Builder<C> $oneOf(C... choices) {
return $oneOf(Arrays.asList(choices));
}
public static <C> Builder<C> $oneOf(Iterable<C> choices) {
return new OneOf<C>(choices);
}
public static class OneOf<C> implements Builder<C> {
private final Map<C, Integer> counter;
private final Iterator<C> it;
public OneOf(Iterable<C> choices) {
int size = Iterables.size(choices);
counter = new IdentityHashMap<C, Integer>(size);
it = Iterators.cycle(choices);
Iterators.advance(it, some($int().between(0, size)));
}
public int getCount(C choice) {
Integer integer = counter.get(choice);
if (integer == null)
return 0;
else
return integer;
}
@Override
public C build() {
C next = it.next();
counter.put(next, getCount(next) + 1);
return next;
}
}
public static <P> Builder<List<P>> $listOf(final int count, final Builder<P> prototype) {
return new Builder<List<P>>() {
@Override
public List<P> build() {
return listOf(count, prototype);
}
};
}
@SafeVarargs
public static <E> List<E> listOf(E... elements) {
return Arrays.asList(elements);
}
public static <P> List<P> listOf(int count, Builder<P> prototype) {
List<P> list = new ArrayList<P>();
for (int i = 0; i < count; i++) {
list.add(prototype.build());
}
return list;
}
}