blob: b522b3c67166e62a2c00080df85ba24911d2fe9e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
(.module:
[library
[lux "*"
["_" test {"+" [Test]}]
[abstract
[equivalence {"+" [Equivalence]}]
[monad {"+" [do]}]
[\\specification
["$." monoid]]]
[data
["." text ("#!." equivalence)]]
[math
["." random {"+" [Random]}]
[number
["n" nat]]]]]
[\\library
["." /]]
["." / "_"
["#." contract]
["#." memo]
["#." mixin]
["#." mutual]])
(def: .public test
Test
(do {! random.monad}
[expected random.nat
f0 (\ ! each n.+ random.nat)
f1 (\ ! each n.* random.nat)
dummy random.nat
extra (|> random.nat (random.only (|>> (n.= expected) not)))]
(<| (_.covering /._)
($_ _.and
(let [equivalence (: (Equivalence (-> Nat Nat))
(implementation
(def: (= left right)
(n.= (left extra)
(right extra)))))
generator (: (Random (-> Nat Nat))
(\ ! each n.- random.nat))]
(_.for [/.monoid]
($monoid.spec equivalence /.monoid generator)))
(_.cover [/.identity]
(n.= expected
(/.identity expected)))
(_.cover [/.composite]
(n.= (f0 (f1 expected))
((/.composite f0 f1) expected)))
(_.cover [/.constant]
(n.= expected
((/.constant expected) dummy)))
(_.cover [/.flipped]
(let [outcome ((/.flipped n.-) expected extra)]
(and (n.= (n.- extra expected)
outcome)
(not (n.= (n.- expected extra)
outcome)))))
(_.cover [/.on]
(n.= (f0 extra)
(/.on extra f0)))
/contract.test
/memo.test
/mixin.test
/mutual.test
))))
|