net.jqwik.engine.properties.arbitraries.randomized.RandomIntegralGenerators Maven / Gradle / Ivy
The newest version!
package net.jqwik.engine.properties.arbitraries.randomized;
import java.math.*;
import net.jqwik.api.*;
import net.jqwik.api.RandomDistribution.*;
import net.jqwik.engine.properties.*;
import net.jqwik.engine.properties.shrinking.*;
public class RandomIntegralGenerators {
public static RandomGenerator bigIntegers(
int genSize,
BigInteger min,
BigInteger max,
BigInteger shrinkingTarget,
RandomDistribution distribution
) {
Range range = Range.of(min, max);
checkTargetInRange(range, shrinkingTarget);
if (range.isSingular()) {
return ignored -> Shrinkable.unshrinkable(range.min);
}
RandomNumericGenerator numericGenerator =
distribution.createGenerator(genSize, range.min, range.max, shrinkingTarget);
return random -> {
BigInteger value = numericGenerator.next(random);
return new ShrinkableBigInteger(
value,
range,
shrinkingTarget
);
};
}
private static void checkTargetInRange(Range range, BigInteger value) {
if (!range.includes(value)) {
String message = String.format("Shrinking target <%s> is outside allowed range %s", value, range);
throw new JqwikException(message);
}
}
public static BigInteger defaultShrinkingTarget(Range range) {
if (range.includes(BigInteger.ZERO)) {
return BigInteger.ZERO;
}
if (range.max.compareTo(BigInteger.ZERO) < 0) return range.max;
if (range.min.compareTo(BigInteger.ZERO) > 0) return range.min;
throw new RuntimeException("This should not be possible");
}
}