1 package io.atlassian.fugue.quickcheck;
2
3 import com.pholser.junit.quickcheck.generator.ComponentizedGenerator;
4 import com.pholser.junit.quickcheck.generator.GenerationStatus;
5 import com.pholser.junit.quickcheck.random.SourceOfRandomness;
6 import io.atlassian.fugue.Option;
7
8 import java.util.Collections;
9 import java.util.List;
10 import java.util.stream.Collectors;
11 import java.util.stream.Stream;
12
13
14
15
16 public class OptionGenerator extends ComponentizedGenerator<Option<?>> {
17
18 @SuppressWarnings("unchecked") public OptionGenerator() {
19 super((Class) Option.class);
20 }
21
22 @Override public Option<?> generate(SourceOfRandomness random, GenerationStatus status) {
23 double trial = random.nextDouble();
24 if (trial < 0.25) {
25 return Option.none();
26 } else {
27 Object item;
28 do {
29 item = componentGenerators().get(0).generate(random, status);
30 } while (item == null);
31 return Option.some(item);
32 }
33 }
34
35 @Override public List<Option<?>> doShrink(SourceOfRandomness random, Option<?> larger) {
36 return larger
37 .fold(
38 Collections::emptyList,
39 largerItem -> Stream.concat(Stream.of(Option.none()),
40 componentGenerators().get(0).shrink(random, largerItem).stream().filter(item -> item != null).map(Option::some)).collect(
41 Collectors.toList()));
42 }
43
44 @Override public int numberOfNeededComponents() {
45 return 1;
46 }
47
48 }