annotate src/test/java/fj/data/TestRngState.java @ 0:fe80c1edf1be

add getLoop
author tatsuki
date Fri, 20 Mar 2015 21:04:03 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1 package fj.data;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
2
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
3 import fj.*;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
4 import fj.test.Arbitrary;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
5 import fj.test.Coarbitrary;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
6 import fj.test.Gen;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
7 import fj.test.Property;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
8 import org.junit.Assert;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
9 import org.junit.Test;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
10
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
11 import static fj.data.Option.some;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
12 import static fj.data.Stream.unfold;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
13 import static fj.data.test.PropertyAssert.assertResult;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
14 import static fj.test.Arbitrary.*;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
15 import static fj.test.Coarbitrary.coarbInteger;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
16 import static fj.test.Property.prop;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
17 import static fj.test.Property.property;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
18 import static fj.test.Variant.variant;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
19
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
20 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
21 * Created by mperry on 4/08/2014.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
22 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
23 public class TestRngState {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
24
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
25 static String expected1 = "<4,4,2,2,2,5,3,3,1,5>";
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
26 static int size = 10;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
27
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
28 static Rng defaultRng() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
29 return new LcgRng(1);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
30 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
31
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
32 static P2<Rng, Integer> num(Rng r) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
33 return r.range(1, 5);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
34 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
35
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
36 static State<Rng, Integer> defaultState() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
37 return State.unit(s -> num(s));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
38 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
39
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
40 static F<State<Rng, Integer>, State<Rng, Integer>> nextState() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
41 return s -> s.mapState(p2 -> num(p2._1()));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
42 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
43
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
44 static P2<Rng, Integer> num(Rng r, int x) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
45 return r.range(x, x + 1);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
46 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
47
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
48 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
49 public void testUnfold() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
50 Stream<Integer> s = unfold(r -> some(num(r).swap()), defaultRng());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
51 Assert.assertTrue(s.take(size).toList().toString().equals(expected1));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
52 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
53
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
54 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
55 public void testTransitions() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
56 P2<List<State<Rng, Integer>>, State<Rng, Integer>> p = List.replicate(size, nextState()).foldLeft(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
57 (P2<List<State<Rng, Integer>>, State<Rng, Integer>> p2, F<State<Rng, Integer>, State<Rng, Integer>> f) -> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
58 State<Rng, Integer> s = f.f(p2._2());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
59 return P.p(p2._1().snoc(p2._2()), s);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
60 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
61 , P.p(List.nil(), defaultState())
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
62 );
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
63 List<Integer> ints = p._1().map(s -> s.eval(defaultRng()));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
64 Assert.assertTrue(ints.toString().equals(expected1));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
65 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
66
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
67 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
68 public void testSequence() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
69 List<Integer> list = State.sequence(List.replicate(size, defaultState())).eval(defaultRng());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
70 Assert.assertTrue(list.toString().equals(expected1));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
71 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
72
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
73 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
74 public void testTraverse() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
75 List<Integer> list = State.traverse(List.range(1, 10), a -> (State.unit((Rng s) -> num(s, a)))).eval(defaultRng());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
76 // System.out.println(list.toString());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
77 String expected = "<1,2,3,5,6,7,7,9,10>";
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
78 Assert.assertTrue(list.toString().equals(expected));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
79 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
80
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
81 public static Arbitrary<State<LcgRng, Integer>> arbState() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
82 return Arbitrary.arbState(Arbitrary.arbLcgRng(), Coarbitrary.coarbLcgRng(), arbInteger);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
83 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
84
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
85 public static Arbitrary<F<LcgRng, P2<LcgRng, Integer>>> arbStateF() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
86 return arbF(Coarbitrary.coarbLcgRng(), arbP2(arbLcgRng(), arbInteger));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
87 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
88
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
89 public static Coarbitrary<State<LcgRng, Integer>> coarbState() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
90 return Coarbitrary.coarbState(Arbitrary.arbLcgRng(), (LcgRng s, Integer j) -> (long) (j >= 0 ? 2 * j : -2 * j + 1));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
91 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
92
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
93 public static Arbitrary<F<Integer, State<LcgRng, Integer>>> arbBindable() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
94 return arbF(coarbInteger, arbState());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
95 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
96
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
97 // Left identity: return i >>= f == f i
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
98 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
99 public void testLeftIdentity() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
100 Property p = property(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
101 arbBindable(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
102 arbInteger,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
103 arbLcgRng(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
104 (f, i, r) -> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
105 int a = State.<LcgRng, Integer>constant(i).flatMap(f).eval(r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
106 int b = f.f(i).eval(r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
107 // System.out.println(String.format("a=%d, b=%d", a, b));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
108 return prop(a == b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
109 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
110 );
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
111 assertResult(p);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
112 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
113
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
114
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
115 // Right identity: m >>= return == m
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
116 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
117 public void testRightIdentity() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
118 Property p = Property.property(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
119 arbState(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
120 arbLcgRng(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
121 (s, r) -> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
122 int x = s.flatMap(a -> State.constant(a)).eval(r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
123 int y = s.eval(r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
124 // System.out.println(String.format("x=%d, y=%d", x, y));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
125 return prop(x == y);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
126 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
127 );
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
128 assertResult(p);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
129 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
130
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
131 // Associativity: (m >>= f) >>= g == m >>= (\x -> f x >>= g)
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
132 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
133 public void testAssociativity() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
134 Property p = Property.property(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
135 arbState(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
136 arbBindable(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
137 arbBindable(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
138 arbLcgRng(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
139 (s, f, g, r) -> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
140 int t = s.flatMap(f).flatMap(g).eval(r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
141 int u = s.flatMap(x -> f.f(x).flatMap(g)).eval(r);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
142 // System.out.println(String.format("x=%d, y=%d", t, u));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
143 return prop(t == u);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
144 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
145 assertResult(p);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
146 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
147
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
148
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
149 }