Skip to content

Commit 75a0edb

Browse files
author
Vladimir Sitnikov
committed
WIP: use L128X1024Mix for random generator
fixes #363
1 parent 7a37d8d commit 75a0edb

File tree

146 files changed

+1033
-844
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

146 files changed

+1033
-844
lines changed

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,4 @@ Use _jqwik_ itself for all tests and properties.
3737

3838
Use _AssertJ_ for non trivial assertions.
3939

40-
Use `@ForAll Random random` parameter if you need a random value.
40+
Use `@ForAll JqwikRandom random` parameter if you need a random value.

api/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,6 @@ signing {
5353
dependencies {
5454
api("org.opentest4j:opentest4j:${opentest4jVersion}")
5555
api("org.junit.platform:junit-platform-commons:${junitPlatformVersion}")
56+
api(platform("org.apache.commons:commons-rng-bom:1.5"))
57+
api("org.apache.commons:commons-rng-core")
5658
}

api/src/main/java/net/jqwik/api/Arbitraries.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import javax.annotation.*;
44
import java.util.*;
55
import java.util.function.*;
6-
import java.util.stream.*;
76

87
import org.apiguardian.api.*;
98

@@ -112,7 +111,7 @@ public static <T> Arbitrary<T> fromGenerator(RandomGenerator<T> generator) {
112111
* @param <T> The type of values to generate
113112
* @return a new arbitrary instance
114113
*/
115-
public static <T> Arbitrary<T> randomValue(Function<Random, T> generator) {
114+
public static <T> Arbitrary<T> randomValue(Function<JqwikRandom, T> generator) {
116115
return fromGenerator(random -> Shrinkable.unshrinkable(generator.apply(random)));
117116
}
118117

@@ -121,8 +120,8 @@ public static <T> Arbitrary<T> randomValue(Function<Random, T> generator) {
121120
*
122121
* @return a new arbitrary instance
123122
*/
124-
public static Arbitrary<Random> randoms() {
125-
return randomValue(random -> new Random(random.nextLong()));
123+
public static Arbitrary<JqwikRandom> randoms() {
124+
return randomValue(JqwikRandom::split);
126125
}
127126

128127
/**
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package net.jqwik.api;
2+
3+
import net.jqwik.api.random.*;
4+
5+
import org.apache.commons.rng.*;
6+
7+
import java.util.*;
8+
9+
public interface JqwikRandom extends UniformRandomProvider {
10+
JqwikRandom jump();
11+
12+
default JqwikRandom split() {
13+
return split(this);
14+
}
15+
16+
JqwikRandom split(UniformRandomProvider source);
17+
18+
JqwikRandomState saveState();
19+
20+
void restoreState(JqwikRandomState state);
21+
22+
default Random asJdkRandom() {
23+
return new Random() {
24+
@Override
25+
protected int next(int bits) {
26+
int next = JqwikRandom.this.nextInt();
27+
next &= ((1L << bits) - 1);
28+
return next;
29+
}
30+
31+
@Override
32+
public long nextLong() {
33+
return JqwikRandom.this.nextLong();
34+
}
35+
};
36+
}
37+
}

api/src/main/java/net/jqwik/api/RandomDistribution.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package net.jqwik.api;
22

33
import java.math.*;
4-
import java.util.*;
54

65
import org.apiguardian.api.*;
76

@@ -61,7 +60,7 @@ interface RandomNumericGenerator {
6160
*
6261
* @return an instance of BigInteger. Never {@code null}.
6362
*/
64-
BigInteger next(Random random);
63+
BigInteger next(JqwikRandom random);
6564
}
6665

6766
/**

api/src/main/java/net/jqwik/api/RandomGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public abstract <T, U> Shrinkable<U> flatMap(
4444
* @param random the source of randomness. Injected by jqwik itself.
4545
* @return the next generated value wrapped within the Shrinkable interface. The method must ALWAYS return a next value.
4646
*/
47-
Shrinkable<T> next(Random random);
47+
Shrinkable<T> next(JqwikRandom random);
4848

4949
@API(status = INTERNAL)
5050
default <U> RandomGenerator<U> map(Function<T, U> mapper) {
@@ -87,7 +87,7 @@ default RandomGenerator<T> withEdgeCases(int genSize, EdgeCases<T> edgeCases) {
8787
}
8888

8989
@API(status = INTERNAL)
90-
default Stream<Shrinkable<T>> stream(Random random) {
90+
default Stream<Shrinkable<T>> stream(JqwikRandom random) {
9191
return Stream.generate(() -> this.next(random));
9292
}
9393

api/src/main/java/net/jqwik/api/facades/ShrinkingSupportFacade.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package net.jqwik.api.facades;
22

3-
import java.util.*;
4-
53
import org.apiguardian.api.*;
64

75
import net.jqwik.api.*;
@@ -17,9 +15,9 @@ public abstract class ShrinkingSupportFacade {
1715
implementation = FacadeLoader.load(ShrinkingSupportFacade.class);
1816
}
1917

20-
public abstract <T> T falsifyThenShrink(Arbitrary<? extends T> arbitrary, Random random, Falsifier<T> falsifier);
18+
public abstract <T> T falsifyThenShrink(Arbitrary<? extends T> arbitrary, JqwikRandom random, Falsifier<T> falsifier);
2119

22-
public abstract <T> T falsifyThenShrink(RandomGenerator<? extends T> arbitrary, Random random, Falsifier<T> falsifier);
20+
public abstract <T> T falsifyThenShrink(RandomGenerator<? extends T> arbitrary, JqwikRandom random, Falsifier<T> falsifier);
2321

2422
public abstract <T> T shrink(
2523
Shrinkable<T> falsifiedShrinkable,

api/src/main/java/net/jqwik/api/facades/TestingSupportFacade.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public abstract class TestingSupportFacade {
1313
implementation = FacadeLoader.load(TestingSupportFacade.class);
1414
}
1515

16-
public abstract <T> Shrinkable<T> generateUntil(RandomGenerator<T> generator, Random random, Function<T, Boolean> condition);
16+
public abstract <T> Shrinkable<T> generateUntil(RandomGenerator<T> generator, JqwikRandom random, Function<T, Boolean> condition);
1717

1818
public abstract String singleLineReport(Object any);
1919

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package net.jqwik.api.random;
2+
3+
public interface JqwikRandomSeed {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package net.jqwik.api.random;
2+
3+
public interface JqwikRandomState {
4+
}

0 commit comments

Comments
 (0)