aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data/text/unicode/set.lux
blob: e2bbc663c38e8557abd655db18516b0fb7ab6b89 (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
(.using
 [library
  [lux (.except)
   ["_" test (.only Test)]
   [abstract
    [monad (.only do)]
    [\\specification
     ["$[0]" equivalence]]]
   [data
    ["[0]" product]
    ["[0]" bit (.open: "[1]#[0]" equivalence)]
    [collection
     ["[0]" set (.open: "[1]#[0]" equivalence)]]]
   [math
    ["[0]" random (.only Random)]
    [number
     ["n" nat]]]]]
 ["[0]" /
  ["/[1]" //
   ["[1][0]" block]]]
 [\\library
  ["[0]" / (.only)
   [//
    ["[0]" 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 (at ! each
                    (|>> (n.% (block.size block))
                         (n.+ (block.start block)))
                    random.nat)
         left //block.random
         right //block.random
         .let [equivalence (product.equivalence n.equivalence
                                                n.equivalence)]]
        (`` (all _.and
                 (_.for [/.equivalence]
                        ($equivalence.spec /.equivalence ..random))
                 
                 (_.coverage [/.set]
                   (and (n.= (block.start left)
                             (/.start (/.set [left (list)])))
                        (n.= (block.end left)
                             (/.end (/.set [left (list)])))))
                 (_.coverage [/.start]
                   (n.= (n.min (block.start left)
                               (block.start right))
                        (/.start (/.set [left (list right)]))))
                 (_.coverage [/.end]
                   (n.= (n.max (block.end left)
                               (block.end right))
                        (/.end (/.set [left (list right)]))))
                 (_.coverage [/.member?]
                   (bit#= (block.within? block inside)
                          (/.member? (/.set [block (list)]) inside)))
                 (_.coverage [/.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)))))
                 (~~ (with_template [<set>]
                       [(do random.monad
                          [char (random.char <set>)
                           .let [start (/.start <set>)
                                 end (/.end <set>)]]
                          (_.coverage [<set>]
                            (and (/.member? <set> char)
                                 (not (/.member? <set> (-- start)))
                                 (not (/.member? <set> (++ end))))))]

                       [/.ascii]
                       [/.alphabetic]
                       [/.alpha_numeric]
                       [/.lower_case]
                       [/.upper_case]
                       [/.numeric]
                       [/.character]
                       [/.non_character]
                       [/.full]
                       ))

                 //block.test
                 )))))