View Javadoc

1   package io.atlassian.fugue.quickcheck;
2   
3   import com.pholser.junit.quickcheck.Property;
4   import com.pholser.junit.quickcheck.runner.JUnitQuickcheck;
5   import io.atlassian.fugue.Option;
6   import org.junit.runner.RunWith;
7   
8   import java.util.function.Function;
9   
10  import static org.hamcrest.Matchers.equalTo;
11  import static org.hamcrest.Matchers.notNullValue;
12  import static org.junit.Assert.assertThat;
13  import static org.junit.Assume.assumeThat;
14  
15  @RunWith(JUnitQuickcheck.class) public class OptionPropertiesTest {
16  
17    @Property public <A> void satisfiesFunctorIdentityLaw(Option<A> fa) {
18      assertThat(fa.map(Function.identity()), equalTo(fa));
19    }
20  
21    @Property public <A, B, C> void satisfiesFunctorCompositeLaw(Option<A> fa, Function<A, B> f, Function<B, C> g) {
22      assertThat(fa.map(f).map(g), equalTo(fa.map(g.compose(f))));
23    }
24  
25    @Property public <A> void satisfiesMonadRightIdentityLaw(Option<A> fa) {
26      assertThat(fa.flatMap(Option::some), equalTo(fa));
27    }
28  
29    @Property public <A, B> void satisfiesMonadLeftIdentityLaw(A a, Function<A, Option<B>> f) {
30      assumeThat("Option does not support leftIdentity for null values", a, notNullValue());
31      assertThat(Option.some(a).flatMap(f), equalTo(f.apply(a)));
32    }
33  
34    @Property public <A, B, C> void satisfiesMonadAssociativeLaw(Option<A> fa, Function<A, Option<B>> f, Function<B, Option<C>> g) {
35      assertThat(fa.flatMap(f).flatMap(g), equalTo(fa.flatMap(a -> f.apply(a).flatMap(g))));
36    }
37  
38  }