aboutsummaryrefslogtreecommitdiff
path: root/stdlib/test/test/lux/data/coll/queue.lux
blob: fac5cef12ea47d551ac32bcc713a10b2d5768bdd (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
(;module:
  lux
  (lux [io]
       (control monad)
       (data (coll ["&" queue])
             [number])
       ["R" math/random]
       pipe)
  lux/test)

(test: "Queues"
  [size (:: @ map (n.% +100) R;nat)
   sample (R;queue size R;nat)
   non-member (|> R;nat
                  (R;filter (. not (&;member? number;Eq<Nat> sample))))]
  ($_ seq
      (assert "I can query the size of a queue (and empty queues have size 0)."
              (if (n.= +0 size)
                (&;empty? sample)
                (n.= size (&;size sample))))

      (assert "Enqueueing and dequeing affects the size of queues."
              (and (n.= (n.inc size) (&;size (&;push non-member sample)))
                   (or (&;empty? sample)
                       (n.= (n.dec size) (&;size (&;pop sample))))
                   (n.= size (&;size (&;pop (&;push non-member sample))))))

      (assert "Transforming to/from list can't change the queue."
              (let [(^open "&/") (&;Eq<Queue> number;Eq<Nat>)]
                (|> sample
                    &;to-list &;from-list
                    (&/= sample))))

      (assert "I can always peek at a non-empty queue."
              (case (&;peek sample)
                #;None     (&;empty? sample)
                (#;Some _) true))

      (assert "I can query whether an element belongs to a queue."
              (and (not (&;member? number;Eq<Nat> sample non-member))
                   (&;member? number;Eq<Nat> (&;push non-member sample)
                              non-member)
                   (case (&;peek sample)
                     #;None
                     (&;empty? sample)
                     
                     (#;Some first)
                     (and (&;member? number;Eq<Nat> sample first)
                          (not (&;member? number;Eq<Nat> (&;pop sample) first))))))
      ))