blob: b246f8187b103bbbc0ded9ea599c4bbd91416d6e (
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
|
(.module:
[lux #*
["_" test (#+ Test)]
[abstract
[monad (#+ do)]
{[0 #spec]
[/
["$." equivalence]
["$." functor (#+ Injection)]]}]
[data
["." bit ("#\." equivalence)]
[collection
["." set]
["." list ("#\." monoid)]]]
[math
["." random]
[number
["n" nat]]]]
{1
["." /]})
(def: injection
(Injection /.Queue)
(|>> list /.from_list))
(def: #export test
Test
(<| (_.covering /._)
(_.for [/.Queue])
(do {! random.monad}
[size (\ ! map (n.% 100) random.nat)
members (random.set n.hash size random.nat)
non_member (random.filter (|>> (set.member? members) not)
random.nat)
#let [members (set.to_list members)
sample (/.from_list members)]]
($_ _.and
(_.for [/.equivalence]
($equivalence.spec (/.equivalence n.equivalence) (random.queue size random.nat)))
(_.for [/.functor]
($functor.spec ..injection /.equivalence /.functor))
(_.cover [/.from_list /.to_list]
(|> members /.from_list /.to_list
(\ (list.equivalence n.equivalence) = members)))
(_.cover [/.size]
(n.= size (/.size sample)))
(_.cover [/.empty?]
(bit\= (n.= 0 size) (/.empty? sample)))
(_.cover [/.empty]
(let [empty_is_empty!
(/.empty? /.empty)
all_empty_queues_look_the_same!
(bit\= (/.empty? sample)
(\ (/.equivalence n.equivalence) =
sample
/.empty))]
(and empty_is_empty!
all_empty_queues_look_the_same!)))
(_.cover [/.peek]
(case [members (/.peek sample)]
[(#.Cons head tail) (#.Some first)]
(n.= head first)
[#.Nil #.None]
true
_
false))
(_.cover [/.member?]
(let [every_member_is_identified!
(list.every? (/.member? n.equivalence sample)
(/.to_list sample))
non_member_is_not_identified!
(not (/.member? n.equivalence sample non_member))]
(and every_member_is_identified!
non_member_is_not_identified!)))
(_.cover [/.push]
(let [pushed (/.push non_member sample)
size_increases!
(n.= (inc (/.size sample)) (/.size pushed))
new_member_is_identified!
(/.member? n.equivalence pushed non_member)
has_expected_order!
(\ (list.equivalence n.equivalence) =
(list\compose (/.to_list sample) (list non_member))
(/.to_list pushed))]
(and size_increases!
new_member_is_identified!
has_expected_order!)))
(_.cover [/.pop]
(case members
(#.Cons target expected)
(let [popped (/.pop sample)
size_decreases!
(n.= (dec (/.size sample))
(/.size popped))
popped_member_is_not_identified!
(not (/.member? n.equivalence popped target))
has_expected_order!
(\ (list.equivalence n.equivalence) =
expected
(/.to_list popped))]
(and size_decreases!
popped_member_is_not_identified!
has_expected_order!))
#.Nil
(and (/.empty? sample)
(/.empty? (/.pop sample)))))
))))
|