aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data/collection/queue.lux
blob: fbe71b45f36bf00bfadf5217b7c37b8c5472a867 (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
... This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
... If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.

(.require
 [library
  [lux (.except)
   [abstract
    [monad (.only do)]
    ["[0]" functor
     ["[1]T" \\test (.only Injection)]]
    ["[0]" equivalence
     ["[1]T" \\test]]]
   [data
    ["[0]" bit (.use "[1]#[0]" equivalence)]
    [collection
     ["[0]" set]
     ["[0]" list (.use "[1]#[0]" monoid)]]]
   [math
    ["[0]" random]
    [number
     ["n" nat]]]
   [test
    ["_" property (.only Test)]]]]
 [\\library
  ["[0]" /]])

(def injection
  (Injection /.Queue)
  (|>> list /.of_list))

(def .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Queue
              /.#front /.#rear])
      (do [! random.monad]
        [size (of ! each (n.% 100) random.nat)
         members (random.set n.hash size random.nat)
         non_member (random.only (|>> (set.member? members) not)
                                 random.nat)
         .let [members (set.list members)
               sample (/.of_list members)]]
        (all _.and
             (_.for [/.equivalence]
                    (equivalenceT.spec (/.equivalence n.equivalence) (random.queue size random.nat)))
             (_.for [/.functor]
                    (functorT.spec ..injection /.equivalence /.functor))

             (_.coverage [/.of_list /.list]
               (|> members /.of_list /.list
                   (of (list.equivalence n.equivalence) = members)))
             (_.coverage [/.size]
               (n.= size (/.size sample)))
             (_.coverage [/.empty?]
               (bit#= (n.= 0 size) (/.empty? sample)))
             (_.coverage [/.empty]
               (let [empty_is_empty!
                     (/.empty? /.empty)

                     all_empty_queues_look_the_same!
                     (bit#= (/.empty? sample)
                            (of (/.equivalence n.equivalence) =
                                sample
                                /.empty))]
                 (and empty_is_empty!
                      all_empty_queues_look_the_same!)))
             (_.coverage [/.front]
               (when [members (/.front sample)]
                 [{.#Item head tail} {.#Some first}]
                 (n.= head first)
                 
                 [{.#End} {.#None}]
                 true

                 _
                 false))
             (_.coverage [/.member?]
               (let [every_member_is_identified!
                     (list.every? (/.member? n.equivalence sample)
                                  (/.list sample))

                     non_member_is_not_identified!
                     (not (/.member? n.equivalence sample non_member))]
                 (and every_member_is_identified!
                      non_member_is_not_identified!)))
             (_.coverage [/.end]
               (let [pushed (/.end non_member sample)

                     size_increases!
                     (n.= (++ (/.size sample)) (/.size pushed))

                     new_member_is_identified!
                     (/.member? n.equivalence pushed non_member)

                     has_expected_order!
                     (of (list.equivalence n.equivalence) =
                         (list#composite (/.list sample) (list non_member))
                         (/.list pushed))]
                 (and size_increases!
                      new_member_is_identified!
                      has_expected_order!)))
             (_.coverage [/.next]
               (when members
                 {.#Item target expected}
                 (let [popped (/.next sample)

                       size_decreases!
                       (n.= (-- (/.size sample))
                            (/.size popped))

                       popped_member_is_not_identified!
                       (not (/.member? n.equivalence popped target))

                       has_expected_order!
                       (of (list.equivalence n.equivalence) =
                           expected
                           (/.list popped))]
                   (and size_decreases!
                        popped_member_is_not_identified!
                        has_expected_order!))
                 
                 {.#End}
                 (and (/.empty? sample)
                      (/.empty? (/.next sample)))))
             ))))