Mercurial > hg > Members > tatsuki > functionaljava-master > core
diff src/test/java/fj/data/TestRngState.java @ 0:fe80c1edf1be
add getLoop
author | tatsuki |
---|---|
date | Fri, 20 Mar 2015 21:04:03 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/fj/data/TestRngState.java Fri Mar 20 21:04:03 2015 +0900 @@ -0,0 +1,149 @@ +package fj.data; + +import fj.*; +import fj.test.Arbitrary; +import fj.test.Coarbitrary; +import fj.test.Gen; +import fj.test.Property; +import org.junit.Assert; +import org.junit.Test; + +import static fj.data.Option.some; +import static fj.data.Stream.unfold; +import static fj.data.test.PropertyAssert.assertResult; +import static fj.test.Arbitrary.*; +import static fj.test.Coarbitrary.coarbInteger; +import static fj.test.Property.prop; +import static fj.test.Property.property; +import static fj.test.Variant.variant; + +/** + * Created by mperry on 4/08/2014. + */ +public class TestRngState { + + static String expected1 = "<4,4,2,2,2,5,3,3,1,5>"; + static int size = 10; + + static Rng defaultRng() { + return new LcgRng(1); + } + + static P2<Rng, Integer> num(Rng r) { + return r.range(1, 5); + } + + static State<Rng, Integer> defaultState() { + return State.unit(s -> num(s)); + } + + static F<State<Rng, Integer>, State<Rng, Integer>> nextState() { + return s -> s.mapState(p2 -> num(p2._1())); + } + + static P2<Rng, Integer> num(Rng r, int x) { + return r.range(x, x + 1); + } + + @Test + public void testUnfold() { + Stream<Integer> s = unfold(r -> some(num(r).swap()), defaultRng()); + Assert.assertTrue(s.take(size).toList().toString().equals(expected1)); + } + + @Test + public void testTransitions() { + P2<List<State<Rng, Integer>>, State<Rng, Integer>> p = List.replicate(size, nextState()).foldLeft( + (P2<List<State<Rng, Integer>>, State<Rng, Integer>> p2, F<State<Rng, Integer>, State<Rng, Integer>> f) -> { + State<Rng, Integer> s = f.f(p2._2()); + return P.p(p2._1().snoc(p2._2()), s); + } + , P.p(List.nil(), defaultState()) + ); + List<Integer> ints = p._1().map(s -> s.eval(defaultRng())); + Assert.assertTrue(ints.toString().equals(expected1)); + } + + @Test + public void testSequence() { + List<Integer> list = State.sequence(List.replicate(size, defaultState())).eval(defaultRng()); + Assert.assertTrue(list.toString().equals(expected1)); + } + + @Test + public void testTraverse() { + List<Integer> list = State.traverse(List.range(1, 10), a -> (State.unit((Rng s) -> num(s, a)))).eval(defaultRng()); +// System.out.println(list.toString()); + String expected = "<1,2,3,5,6,7,7,9,10>"; + Assert.assertTrue(list.toString().equals(expected)); + } + + public static Arbitrary<State<LcgRng, Integer>> arbState() { + return Arbitrary.arbState(Arbitrary.arbLcgRng(), Coarbitrary.coarbLcgRng(), arbInteger); + } + + public static Arbitrary<F<LcgRng, P2<LcgRng, Integer>>> arbStateF() { + return arbF(Coarbitrary.coarbLcgRng(), arbP2(arbLcgRng(), arbInteger)); + } + + public static Coarbitrary<State<LcgRng, Integer>> coarbState() { + return Coarbitrary.coarbState(Arbitrary.arbLcgRng(), (LcgRng s, Integer j) -> (long) (j >= 0 ? 2 * j : -2 * j + 1)); + } + + public static Arbitrary<F<Integer, State<LcgRng, Integer>>> arbBindable() { + return arbF(coarbInteger, arbState()); + } + + // Left identity: return i >>= f == f i + @Test + public void testLeftIdentity() { + Property p = property( + arbBindable(), + arbInteger, + arbLcgRng(), + (f, i, r) -> { + int a = State.<LcgRng, Integer>constant(i).flatMap(f).eval(r); + int b = f.f(i).eval(r); +// System.out.println(String.format("a=%d, b=%d", a, b)); + return prop(a == b); + } + ); + assertResult(p); + } + + + // Right identity: m >>= return == m + @Test + public void testRightIdentity() { + Property p = Property.property( + arbState(), + arbLcgRng(), + (s, r) -> { + int x = s.flatMap(a -> State.constant(a)).eval(r); + int y = s.eval(r); +// System.out.println(String.format("x=%d, y=%d", x, y)); + return prop(x == y); + } + ); + assertResult(p); + } + + // Associativity: (m >>= f) >>= g == m >>= (\x -> f x >>= g) + @Test + public void testAssociativity() { + Property p = Property.property( + arbState(), + arbBindable(), + arbBindable(), + arbLcgRng(), + (s, f, g, r) -> { + int t = s.flatMap(f).flatMap(g).eval(r); + int u = s.flatMap(x -> f.f(x).flatMap(g)).eval(r); +// System.out.println(String.format("x=%d, y=%d", t, u)); + return prop(t == u); + }); + assertResult(p); + } + + +}