blob: b0be9c914ff9beabb2aae58cad5c5c3870e4959e (
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
(.module:
[library
[lux #*
["_" test (#+ Test)]
[abstract
[monad (#+ do)]
[\\specification
["$." equivalence]]]
[data
["." product]
["." bit ("#\." equivalence)]
[collection
["." set ("#\." equivalence)]]]
[math
["." random (#+ Random)]
[number
["n" nat]]]]]
["." / #_
["/#" // #_
["#." block]]]
[\\library
["." /
[//
["." block]]]])
(def: .public random
(Random /.Set)
(do {! random.monad}
[left //block.random
right //block.random]
(in (/.set [left (list right)]))))
(def: .public test
Test
(<| (_.covering /._)
(_.for [/.Set])
(do {! random.monad}
[block //block.random
inside (\ ! map
(|>> (n.% (block.size block))
(n.+ (block.start block)))
random.nat)
left //block.random
right //block.random
.let [equivalence (product.equivalence n.equivalence
n.equivalence)]]
(`` ($_ _.and
(_.for [/.equivalence]
($equivalence.spec /.equivalence ..random))
(_.cover [/.set]
(and (n.= (block.start left)
(/.start (/.set [left (list)])))
(n.= (block.end left)
(/.end (/.set [left (list)])))))
(_.cover [/.start]
(n.= (n.min (block.start left)
(block.start right))
(/.start (/.set [left (list right)]))))
(_.cover [/.end]
(n.= (n.max (block.end left)
(block.end right))
(/.end (/.set [left (list right)]))))
(_.cover [/.member?]
(bit\= (block.within? block inside)
(/.member? (/.set [block (list)]) inside)))
(_.cover [/.composite]
(let [composed (/.composite (/.set [left (list)])
(/.set [right (list)]))]
(and (n.= (n.min (block.start left)
(block.start right))
(/.start composed))
(n.= (n.max (block.end left)
(block.end right))
(/.end composed)))))
(~~ (template [<set>]
[(do random.monad
[char (random.char <set>)
.let [start (/.start <set>)
end (/.end <set>)]]
(_.cover [<set>]
(and (/.member? <set> char)
(not (/.member? <set> (-- start)))
(not (/.member? <set> (++ end))))))]
[/.ascii]
[/.ascii/alpha]
[/.ascii/alpha_num]
[/.ascii/lower]
[/.ascii/upper]
[/.ascii/numeric]
[/.character]
[/.non_character]
[/.full]
))
//block.test
)))))
|