annotate src/test/java/fj/data/ReaderTest.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.F;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
4 import fj.data.test.PropertyAssert;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
5 import fj.test.*;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
6 import org.junit.Test;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
7
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
8 import static fj.F1Functions.bind;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
9 import static fj.F1Functions.map;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
10 import static fj.test.Arbitrary.*;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
11 import static fj.test.Coarbitrary.coarbInteger;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
12 import static fj.test.Property.prop;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
13 import static fj.test.Property.property;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
14 import static org.junit.Assert.assertTrue;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
15
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
16 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
17 * Created by MarkPerry on 4/12/2014.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
18 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
19 public class ReaderTest {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
20
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
21 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
22 public void testMap() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
23 // (3 + 8) * 11
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
24 // example taken from http://learnyouahaskell.com/for-a-few-monads-more
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
25 int x = Reader.unit((Integer i) -> i + 3).map(i -> i * 5).f(8);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
26 assertTrue(x == 55);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
27 // System.out.println(x); // 55
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
28 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
29
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
30 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
31 public void testFlatMap() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
32 // (3 * 2) + (3 + 10)
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
33 // example taken from http://learnyouahaskell.com/for-a-few-monads-more
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
34 int y = (int) Reader.unit((Integer i) -> i * 2).flatMap(a -> Reader.unit((Integer i) -> i + 10).map(b -> a + b)).f(3);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
35 // System.out.println(y); // 19
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
36 assertTrue(y == 19);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
37 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
38
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
39 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
40 public void testMapProp() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
41 Property p = property(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
42 arbF(coarbInteger, arbInteger),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
43 arbF(coarbInteger, arbInteger),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
44 arbInteger,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
45 (f, g, i) -> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
46 int expected = map(f, g).f(i);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
47 // System.out.println(String.format("input: %d, result: %d", i, expected));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
48 return prop(expected == Reader.unit(f).map(g).f(i));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
49 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
50 PropertyAssert.assertResult(p);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
51 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
52
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
53 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
54 public void testFlatMapProp() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
55 Arbitrary<F<Integer, Reader<Integer, Integer>>> a = arbF(coarbInteger, arbReader());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
56 Property p = property(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
57 arbF(coarbInteger, arbInteger),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
58 a,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
59 arbInteger,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
60 (f, g, i) -> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
61 int expected = bind(f, j -> g.f(j).getFunction()).f(i);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
62 // System.out.println(String.format("input: %d, result: %d", i, expected));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
63 return prop(expected == Reader.unit(f).flatMap(g).f(i));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
64 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
65 );
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
66 PropertyAssert.assertResult(p);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
67 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
68
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
69 // Left identity: return a >>= f == f a
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
70 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
71 public void testLeftIdentity() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
72 Property p = Property.property(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
73 arbInteger,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
74 arbInteger,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
75 arbF(coarbInteger, arbReader()),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
76 (i, j, f) -> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
77 int a = Reader.<Integer, Integer>constant(i).flatMap(f).f(j);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
78 int b = f.f(i).f(j);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
79 return prop(a == b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
80 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
81 PropertyAssert.assertResult(p);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
82 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
83
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
84 // Right identity: m >>= return == m
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
85 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
86 public void testRightIdentity() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
87 Property p = Property.property(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
88 arbInteger,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
89 arbReader(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
90 (i, r2) -> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
91 return prop(r2.flatMap(a -> Reader.constant(a)).f(i) == r2.f(i));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
92 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
93 PropertyAssert.assertResult(p);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
94 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
95
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
96 // Associativity: (m >>= f) >>= g == m >>= (\x -> f x >>= g)
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
97 @Test
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
98 public void testAssociativity() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
99 Property p = Property.property(
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
100 arbInteger,
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
101 arbReader(),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
102 arbF(coarbInteger, arbReader()),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
103 arbF(coarbInteger, arbReader()),
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
104 (i, r, f, g) -> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
105 boolean b2 = r.flatMap(f).flatMap(g).f(i) == r.flatMap(x -> f.f(x).flatMap(g)).f(i);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
106 return prop(b2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
107 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
108 PropertyAssert.assertResult(p);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
109 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
110
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
111 public Arbitrary<Reader<Integer, Integer>> arbReader() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
112 return Arbitrary.arbReader(coarbInteger, arbInteger);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
113 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
114
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
115
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
116 }