View Javadoc

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   * Produces values of type {@link Option}.
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  }