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 }