package fj; import fj.test.Property; import fj.test.runner.PropertyTestRunner; import org.junit.Test; import org.junit.runner.RunWith; import static fj.test.Arbitrary.arbInteger; import static fj.test.CheckResult.summary; import static fj.test.Property.prop; import static fj.test.Property.property; import static org.junit.Assert.assertTrue; /** * Created by mperry on 14/07/2014. */ @RunWith(PropertyTestRunner.class) public class MemoisationTest { public Property test1() { return property(arbInteger, a -> { P1<Integer> t = P.weakMemo(() -> a); return prop(t._1().equals(t._1())).and(prop(t._1().equals(a))); }); } public Property test1_hardMemo() { return property(arbInteger, a -> { P1<Integer> t = P.hardMemo(() -> new Integer(a)); return prop(t._1() == t._1()).and(prop(t._1().equals(a))); }); } @Test public Property test2() { return property(arbInteger, arbInteger, (a, b) -> { P2<Integer, Integer> t = P.lazy(u -> new Integer(a), u -> new Integer(b)).memo(); return prop(t._1().equals(t._1()) && t._1().equals(a) && t._2().equals(t._2()) && t._2().equals(b) ); }); } @Test public Property test3() { return property(arbInteger, arbInteger, arbInteger, (a, b, c) -> { P3<Integer, Integer, Integer> t = P.p(a, b, c).memo(); return prop(t._1() == t._1() && t._2() == t._2() && t._3() == t._3()); }); } @Test public Property test4() { return property(arbInteger, arbInteger, arbInteger, arbInteger, (a, b, c, d) -> { P4<Integer, Integer, Integer, Integer> t = P.p(a, b, c, d).memo(); return prop(t._1() == t._1() && t._2() == t._2() && t._3() == t._3() && t._4() == t._4()); }); } @Test public Property test5() { return property(arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, (a, b, c, d, e) -> { P5<Integer, Integer, Integer, Integer, Integer> t = P.p(a, b, c, d, e).memo(); return prop(t._1() == t._1() && t._2() == t._2() && t._3() == t._3() && t._4() == t._4() && t._5() == t._5()); }); } @Test public Property test6() { return property(arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, (a, b, c, d, e, f) -> { P6<Integer, Integer, Integer, Integer, Integer, Integer> t = P.p(a, b, c, d, e, f).memo(); return prop(t._1() == t._1() && t._2() == t._2() && t._3() == t._3() && t._4() == t._4() && t._5() == t._5() && t._6() == t._6()); }); } @Test public Property test7() { return property(arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, (a, b, c, d, e, f, g) -> { P7<Integer, Integer, Integer, Integer, Integer, Integer, Integer> t = P.p(a, b, c, d, e, f, g).memo(); return prop(t._1() == t._1() && t._2() == t._2() && t._3() == t._3() && t._4() == t._4() && t._5() == t._5() && t._6() == t._6() && t._7() == t._7()); }); } @Test public Property test8() { return property(arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, arbInteger, (a, b, c, d, e, f, g, h) -> { P8<Integer, Integer, Integer, Integer, Integer, Integer, Integer, Integer> t = P.p(a, b, c, d, e, f, g, h).memo(); return prop(t._1() == t._1() && t._2() == t._2() && t._3() == t._3() && t._4() == t._4() && t._5() == t._5() && t._6() == t._6() && t._7() == t._7() && t._8() == t._8()); }); } }