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)))
))
))))
|