aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data/collection/dictionary/ordered.lux
blob: 6b1f131cb391e631ca0e73209f5de4ff18176e95 (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
(.module:
  [lux #*
   [control
    [monad (#+ do Monad)]
    [equivalence (#+ Equivalence)]]
   [data
    ["." product]
    ["." number]
    [collection
     ["s" set]
     ["dict" dictionary
      ["&" ordered]]
     ["." list ("list/." functor)]]]
   [math
    ["r" random]]]
  lux/test)

(context: "Dictionary"
  (<| (times 100)
      (do @
        [size (|> r.nat (:: @ map (n/% 100)))
         keys (r.set number.nat-hash size r.nat)
         values (r.set number.nat-hash size r.nat)
         extra-key (|> r.nat (r.filter (|>> (s.member? keys) not)))
         extra-value r.nat
         #let [pairs (list.zip2 (s.to-list keys)
                                (s.to-list values))
               sample (&.from-list number.nat-order pairs)
               sorted-pairs (list.sort (function (_ [left _] [right _])
                                         (n/< left right))
                                       pairs)
               sorted-values (list/map product.right sorted-pairs)
               (^open "&/.") (&.equivalence number.nat-equivalence)]]
        ($_ seq
            (test "Can query the size of a dictionary."
                  (n/= size (&.size sample)))

            (test "Can query value for minimum key."
                  (case [(&.min sample) (list.head sorted-values)]
                    [#.None #.None]
                    #1

                    [(#.Some reference) (#.Some sample)]
                    (n/= reference sample)

                    _
                    #0))

            (test "Can query value for maximum key."
                  (case [(&.max sample) (list.last sorted-values)]
                    [#.None #.None]
                    #1

                    [(#.Some reference) (#.Some sample)]
                    (n/= reference sample)

                    _
                    #0))

            (test "Converting dictionaries to/from lists cannot change their values."
                  (|> sample
                      &.entries (&.from-list number.nat-order)
                      (&/= sample)))

            (test "Order is preserved."
                  (let [(^open "list/.") (list.equivalence (: (Equivalence [Nat Nat])
                                                              (function (_ [kr vr] [ks vs])
                                                                (and (n/= kr ks)
                                                                     (n/= vr vs)))))]
                    (list/= (&.entries sample)
                            sorted-pairs)))

            (test "Every key in a dictionary must be identifiable."
                  (list.every? (function (_ key) (&.contains? key sample))
                               (&.keys sample)))

            (test "Can add and remove elements in a dictionary."
                  (and (not (&.contains? extra-key sample))
                       (let [sample' (&.put extra-key extra-value sample)
                             sample'' (&.remove extra-key sample')]
                         (and (&.contains? extra-key sample')
                              (not (&.contains? extra-key sample''))
                              (case [(&.get extra-key sample')
                                     (&.get extra-key sample'')]
                                [(#.Some found) #.None]
                                (n/= extra-value found)

                                _
                                #0)))
                       ))
            ))))