package org.finra.datagenerator.scaffolding.random;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.util.Assert;
import java.util.Random;
import java.util.function.Supplier;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* Created by dkopel on 11/24/16.
*/
public final class JavaPrimitiveRandomizer {
final public Random random;
public IntegerRandomizer ints = new IntegerRandomizer();
public FloatRandomizer floats = new FloatRandomizer();
public DoubleRandomizer doubles = new DoubleRandomizer();
public LongRandomizer longs = new LongRandomizer();
public CharacterRandomizer chars = new CharacterRandomizer();
public ByteRandomizer bytes = new ByteRandomizer();
public ShortRandomizer shorts = new ShortRandomizer();
public BooleanRandomizer booleans = new BooleanRandomizer();
public StringRandomizer strings = new StringRandomizer();
public JavaPrimitiveRandomizer(long seed) {
random = new Random(seed);
}
public JavaPrimitiveRandomizer() {
random = new Random();
}
private float convert(float n) {
return (n < 1) ? n : convert(n * .1F);
}
private float convert (double n) {
return convert(((Number) n).floatValue());
}
public class IntegerRandomizer {
public Integer nextInt() {
return random.nextInt();
}
public Integer nextInt(Integer start, Integer bound) {
return intStream(1, start, bound).findFirst().getAsInt();
}
public IntStream intStream(Integer size, Integer start, Integer bound) {
return random.ints(size, start, bound);
}
}
public class LongRandomizer {
public Long nextLong() {
return random.nextLong();
}
public Long nextLong(Long start, Long bound) {
return longStream(1L, start, bound).findFirst().get();
}
public Stream<Long> longStream(Long size, Long start, Long bound) {
return random.longs(size, start, bound).boxed();
}
}
public class DoubleRandomizer {
public Double nextDouble() {
return random.nextDouble();
}
public Double nextDouble(Double start, Double bound) {
return doubleStream(1L, start, bound).findFirst().get();
}
public Stream<Double> doubleStream(Long size, Double start, Double bound) {
return random.doubles(size, start, bound).boxed();
}
}
public class FloatRandomizer {
public Float nextFloat() {
return random.nextFloat();
}
public Float nextFloat(Float start, Float bound) {
return floatStream(1L, start, bound).findFirst().get();
}
public Stream<Float> floatStream(Long size, Float start, Float bound) {
return random.doubles(size, start, bound)
.mapToObj(i -> convert(i));
}
}
public class ByteRandomizer {
public byte[] nextBytes(byte[] bytes) {
for(int i=0; i<0; i++) {
bytes[i] = nextByte();
}
return bytes;
}
public Byte nextByte() {
return ints.nextInt((int)Byte.MIN_VALUE, (int)Byte.MAX_VALUE).byteValue();
}
public Byte nextByte(Byte start, Byte bound) {
return ints.nextInt((int) start, (int) bound).byteValue();
}
public Stream<Byte> bytesStream(Long size, Byte start, Byte bound) {
return random.ints(size, start, bound)
.mapToObj(i -> (byte)i);
}
}
public class CharacterRandomizer {
final private int[] DIGITS = IntStream.range(48, 57).toArray();
final private int[] ALPHA_LOWER = IntStream.range(97, 122).toArray();
final private int[] ALPHA_UPPER = IntStream.range(65, 90).toArray();
final private int[] ALPHA = ArrayUtils.addAll(ALPHA_LOWER, ALPHA_UPPER);
final private int[] ALPHA_NUMERIC = ArrayUtils.addAll(DIGITS, ALPHA);
public Character nextChar() {
return (char) ints.nextInt((int) Character.MIN_VALUE, (int) Character.MAX_VALUE).intValue();
}
public Character nextChar(Integer start, Integer bound) {
return charStream(1, start, bound).findFirst().get();
}
public char nextDigit() {
return (char) DIGITS[ints.nextInt(0, DIGITS.length)];
}
public char nextLowerAlpha() {
return (char) ALPHA_LOWER[ints.nextInt(0, ALPHA_LOWER.length)];
}
public char nextUpperAlpha() {
return (char) ALPHA_UPPER[ints.nextInt(0, ALPHA_UPPER.length)];
}
public char nextAlpha() { return (char) ALPHA[ints.nextInt(0, ALPHA.length)];}
public char nextAlphaNumeric() {
return (char) ALPHA_NUMERIC[ints.nextInt(0, ALPHA_NUMERIC.length)];
}
public Stream<Character> charStream(Integer size, Integer start, Integer bound) {
Assert.isTrue(start >= Character.MIN_VALUE);
Assert.isTrue(bound < Character.MAX_VALUE);
return ints.intStream(size, start, bound)
.mapToObj(i -> (char) i);
}
}
public class ShortRandomizer {
public Short nextShort() {
return ints.nextInt((int)Short.MIN_VALUE, (int)Short.MAX_VALUE).shortValue();
}
public Short nextShort(Short start, Short bound) {
return ints.nextInt((int)start, (int)bound).shortValue();
}
public Stream<Short> shortStream(Long size, Short start, Short bound) {
return random.ints(size, start, bound)
.mapToObj(i -> (short)i);
}
}
public class BooleanRandomizer {
public Boolean nextBoolean() {
return booleanStream(1).findFirst().get();
}
public Stream<Boolean> booleanStream(Integer size) {
return ints.intStream(size, Integer.MIN_VALUE, Integer.MAX_VALUE)
.mapToObj(i -> i % 2 == 0);
}
}
public class StringRandomizer {
final int MIN_DEFAULT = 0;
final int MAX_DEFAULT = 100;
public String next(int min, int max, Supplier<Character> action) {
StringBuffer b = new StringBuffer();
for(int i=0; i<=ints.nextInt(min, max);i++) {
b.append(action.get());
}
return b.toString();
}
public String nextString() {
return next(MIN_DEFAULT, MAX_DEFAULT, ()->chars.nextAlphaNumeric());
}
public String nextString(int max) {
return next(MIN_DEFAULT, max, ()->chars.nextAlphaNumeric());
}
public String nextString(int min, int max) {
return next(min, max, ()->chars.nextAlphaNumeric());
}
public String nextAlphaString() {
return next(MIN_DEFAULT, MAX_DEFAULT, ()->chars.nextAlpha());
}
public String nextAlphString(int max) {
return next(MIN_DEFAULT, max, ()->chars.nextAlpha());
}
public String nextAlphaString(int min, int max) {
return next(min, max, ()->chars.nextAlpha());
}
}
}