aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data/collection/dictionary/ordered.lux
blob: 951d6c8911a8d47d05cec9c409f57b03d210c1e4 (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
(.require
 [library
  [lux (.except)
   [abstract
    [monad (.only do)]
    [equivalence (.only Equivalence)]
    [order (.only Order)]
    [\\specification
     ["$[0]" equivalence]]]
   [control
    ["[0]" maybe (.use "[1]#[0]" monad)]]
   [data
    ["[0]" product]
    ["[0]" bit (.use "[1]#[0]" equivalence)]
    [collection
     ["[0]" set]
     ["[0]" list (.use "[1]#[0]" functor)]]]
   [math
    ["[0]" random (.only Random) (.use "[1]#[0]" monad)]
    [number
     ["n" nat]]]
   [test
    ["_" property (.only Test)]]]]
 [\\library
  ["[0]" /]])

(def .public (dictionary order gen_key gen_value size)
  (All (_ k v)
    (-> (Order k) (Random k) (Random v) Nat (Random (/.Dictionary k v))))
  (when size
    0
    (random#in (/.empty order))
    
    _
    (do random.monad
      [partial (dictionary order gen_key gen_value (-- size))
       key (random.only (|>> (/.key? partial) not)
                        gen_key)
       value gen_value]
      (in (/.has key value partial)))))

(def .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Dictionary])
      (do [! random.monad]
        [size (at ! each (n.% 100) random.nat)
         keys (random.set n.hash size random.nat)
         values (random.set n.hash size random.nat)
         extra_key (random.only (|>> (set.member? keys) not)
                                random.nat)
         extra_value random.nat
         shift random.nat
         .let [pairs (list.zipped_2 (set.list keys)
                                    (set.list values))
               sample (/.of_list n.order pairs)
               sorted_pairs (list.sorted (function (_ [left _] [right _])
                                           (n.< left right))
                                         pairs)
               sorted_values (list#each product.right sorted_pairs)
               (open "list#[0]") (list.equivalence (is (Equivalence [Nat Nat])
                                                       (function (_ [kr vr] [ks vs])
                                                         (and (n.= kr ks)
                                                              (n.= vr vs)))))
               (open "/#[0]") (/.equivalence n.equivalence)]]
        (all _.and
             (_.for [/.equivalence]
                    ($equivalence.spec (/.equivalence n.equivalence) (..dictionary n.order random.nat random.nat size)))
             
             (_.coverage [/.size]
               (n.= size (/.size sample)))
             (_.coverage [/.empty?]
               (bit#= (n.= 0 (/.size sample))
                      (/.empty? sample)))
             (_.coverage [/.empty]
               (/.empty? (/.empty n.order)))
             (_.coverage [/.min]
               (when [(/.min sample) (list.head sorted_values)]
                 [{.#None} {.#None}]
                 true

                 [{.#Some reference} {.#Some sample}]
                 (n.= reference sample)

                 _
                 false))
             (_.coverage [/.max]
               (when [(/.max sample) (list.last sorted_values)]
                 [{.#None} {.#None}]
                 true

                 [{.#Some reference} {.#Some sample}]
                 (n.= reference sample)

                 _
                 false))
             (_.coverage [/.entries]
               (list#= (/.entries sample)
                       sorted_pairs))
             (_.coverage [/.keys /.values]
               (list#= (/.entries sample)
                       (list.zipped_2 (/.keys sample) (/.values sample))))
             (_.coverage [/.of_list]
               (|> sample
                   /.entries (/.of_list n.order)
                   (/#= sample)))
             (_.coverage [/.key?]
               (and (list.every? (/.key? sample)
                                 (/.keys sample))
                    (not (/.key? sample extra_key))))
             (_.coverage [/.has]
               (and (not (/.key? sample extra_key))
                    (let [sample+ (/.has extra_key extra_value sample)]
                      (and (/.key? sample+ extra_key)
                           (n.= (++ (/.size sample))
                                (/.size sample+))))))
             (_.coverage [/.value]
               (let [sample+ (/.has extra_key extra_value sample)]
                 (when [(/.value extra_key sample)
                        (/.value extra_key sample+)]
                   [{.#None} {.#Some actual}]
                   (n.= extra_value actual)
                   
                   _
                   false)))
             (_.coverage [/.lacks]
               (|> sample
                   (/.has extra_key extra_value)
                   (/.lacks extra_key)
                   (/#= sample)))
             (_.coverage [/.revised]
               (|> sample
                   (/.has extra_key extra_value)
                   (/.revised extra_key (n.+ shift))
                   (/.value extra_key)
                   (maybe#each (n.= (n.+ shift extra_value)))
                   (maybe.else false)))
             ))))