aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/type/refinement.lux
blob: 26617a2fc46b6359b545c594d928b42fe39128e4 (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
(.using
 [library
  [lux "*"
   ["_" test {"+" Test}]
   [abstract
    [predicate {"+" Predicate}]
    [monad {"+" do}]]
   [control
    ["[0]" maybe ("[1]#[0]" monad)]]
   [data
    [collection
     ["[0]" list ("[1]#[0]" functor)]]]
   [math
    ["[0]" random]
    [number
     ["n" nat]]]]]
 [\\library
  ["[0]" /]])

(def: _refiner
  (/.refiner (n.> 123)))

(def: _type
  (/.type _refiner))

(def: .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Refined])
      (do [! random.monad]
        [raw random.nat
         modulus (# ! each (|>> (n.% 10) (n.+ 2)) random.nat)
         .let [predicate (is (Predicate Nat)
                             (|>> (n.% modulus) (n.= 0)))]
         total_raws (# ! each (|>> (n.% 20) ++) random.nat)
         raws (random.list total_raws random.nat)]
        (all _.and
             (_.for [/.Refiner]
                    (all _.and
                         (_.coverage [/.refiner]
                           (case (/.refiner predicate raw)
                             {.#Some refined}
                             (predicate raw)
                             
                             {.#None}
                             (not (predicate raw))))
                         (_.coverage [/.predicate]
                           (|> (/.refiner predicate modulus)
                               (maybe#each (|>> /.predicate (same? predicate)))
                               (maybe.else false)))
                         ))
             (_.coverage [/.value]
               (|> (/.refiner predicate modulus)
                   (maybe#each (|>> /.value (n.= modulus)))
                   (maybe.else false)))
             (_.coverage [/.lifted]
               (and (|> (/.refiner predicate modulus)
                        (maybe#each (/.lifted (n.+ modulus)))
                        maybe#conjoint
                        (maybe#each (|>> /.value (n.= (n.+ modulus modulus))))
                        (maybe.else false))
                    (|> (/.refiner predicate modulus)
                        (maybe#each (/.lifted (n.+ (++ modulus))))
                        maybe#conjoint
                        (maybe#each (|>> /.value (n.= (n.+ modulus (++ modulus)))))
                        (maybe.else false)
                        not)))
             (_.coverage [/.only]
               (let [expected (list.only predicate raws)
                     actual (/.only (/.refiner predicate) raws)]
                 (and (n.= (list.size expected)
                           (list.size actual))
                      (# (list.equivalence n.equivalence) =
                         expected
                         (list#each /.value actual)))))
             (_.coverage [/.partition]
               (let [expected (list.only predicate raws)
                     [actual alternative] (/.partition (/.refiner predicate) raws)]
                 (and (n.= (list.size expected)
                           (list.size actual))
                      (n.= (n.- (list.size expected) total_raws)
                           (list.size alternative))
                      (# (list.equivalence n.equivalence) =
                         expected
                         (list#each /.value actual)))))
             (_.coverage [/.type]
               (exec (is (Maybe .._type)
                         (.._refiner raw))
                 true))
             ))))