git.iko.soy/rowtype-yoga/purescript-fixed-precision
on main help sign in
Some quickcheck tests (#11)
commitda8ca3bfe35e3a4315139e76bae564a3c1635657 authorPhil Freeman <paf31@cantab.net> dateThu 31 Jan 2019, 10:37 (8 years ago) parent108b076
2 files changed+80−1
bower.json+2−1 test/Main.purs+78
bower.json+2−1
@@ -17,6 +17,7 @@
1717 "purescript-bigints": "^4.0.0"
1818 },
1919 "devDependencies": {
20− "purescript-psci-support": "^4.0.0"
20+ "purescript-psci-support": "^4.0.0",
21+ "purescript-quickcheck": "^5.0.0"
2122 }
2223}
test/Main.pursnew file+78
@@ -0,0 +1,78 @@
1+module Test.Main where
2+
3+import Prelude
4+
5+import Data.Fixed (class KnownPrecision, Fixed, PProxy, fromNumber, reifyPrecision)
6+import Data.Maybe (Maybe, fromJust, isJust)
7+import Effect (Effect)
8+import Effect.Console (log)
9+import Partial.Unsafe (unsafePartial)
10+import Test.QuickCheck (arbitrary, quickCheck', (<?>))
11+import Test.QuickCheck.Gen (Gen, chooseInt, suchThat)
12+
13+-- Just here to package up the safe use of `unsafePartial`.
14+trying :: forall a b. Gen a -> (a -> Maybe b) -> Gen b
15+trying gen f = map (unsafePartial fromJust) (map f gen `suchThat` isJust)
16+
17+genFixedP :: forall p. KnownPrecision p => PProxy p -> Gen (Fixed p)
18+genFixedP _ = map fromNumber arbitrary `trying` identity
19+
20+main :: Effect Unit
21+main = do
22+ log "Commutative monoid under addition:"
23+ log ""
24+
25+ log "Associativity: (a + b) + c = a + (b + c)"
26+ quickCheck' 1000 do
27+ precision <- chooseInt 0 10
28+ unsafePartial fromJust $ reifyPrecision precision \p -> do
29+ a <- genFixedP p
30+ b <- genFixedP p
31+ c <- genFixedP p
32+ pure $ (a + b) + c == a + (b + c) <?> show { a, b, c }
33+
34+ log "Identity: zero + a = a + zero = a"
35+
36+ quickCheck' 1000 do
37+ precision <- chooseInt 0 10
38+ unsafePartial fromJust $ reifyPrecision precision \p -> do
39+ a <- genFixedP p
40+ pure $ zero + a == a <?> show { a }
41+ quickCheck' 1000 do
42+ precision <- chooseInt 0 10
43+ unsafePartial fromJust $ reifyPrecision precision \p -> do
44+ a <- genFixedP p
45+ pure $ a + zero == a <?> show { a }
46+
47+ log "Commutative: a + b = b + a"
48+ quickCheck' 1000 do
49+ precision <- chooseInt 0 10
50+ unsafePartial fromJust $ reifyPrecision precision \p -> do
51+ a <- genFixedP p
52+ b <- genFixedP p
53+ pure $ a + b == b + a <?> show { a, b }
54+
55+ log "Multiplicative unit: one * a = a * one = a"
56+
57+ quickCheck' 1000 do
58+ precision <- chooseInt 0 10
59+ unsafePartial fromJust $ reifyPrecision precision \p -> do
60+ a <- genFixedP p
61+ pure $ one * a == a <?> show { a }
62+ quickCheck' 1000 do
63+ precision <- chooseInt 0 10
64+ unsafePartial fromJust $ reifyPrecision precision \p -> do
65+ a <- genFixedP p
66+ pure $ a * one == a <?> show { a }
67+
68+ log "Multiplicative zero: zero * a = a * zero = zero"
69+ quickCheck' 1000 do
70+ precision <- chooseInt 0 10
71+ unsafePartial fromJust $ reifyPrecision precision \p -> do
72+ a <- genFixedP p
73+ pure $ zero * a == zero <?> show { a }
74+ quickCheck' 1000 do
75+ precision <- chooseInt 0 10
76+ unsafePartial fromJust $ reifyPrecision precision \p -> do
77+ a <- genFixedP p
78+ pure $ a * zero == zero <?> show { a }