aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/test/lux/data')
-rw-r--r--stdlib/source/test/lux/data/collection/list.lux61
-rw-r--r--stdlib/source/test/lux/data/collection/queue.lux138
2 files changed, 133 insertions, 66 deletions
diff --git a/stdlib/source/test/lux/data/collection/list.lux b/stdlib/source/test/lux/data/collection/list.lux
index e6c971ae2..92cec10e8 100644
--- a/stdlib/source/test/lux/data/collection/list.lux
+++ b/stdlib/source/test/lux/data/collection/list.lux
@@ -95,10 +95,16 @@
(_.cover [/.repeat]
(n.= size (/.size (/.repeat size []))))
(_.cover [/.reverse]
- (and (not (/@= sample
- (/.reverse sample)))
- (/@= sample
- (/.reverse (/.reverse sample)))))
+ (or (n.< 2 (/.size sample))
+ (let [not-same!
+ (not (/@= sample
+ (/.reverse sample)))
+
+ self-symmetry!
+ (/@= sample
+ (/.reverse (/.reverse sample)))]
+ (and not-same!
+ self-symmetry!))))
(_.cover [/.every? /.any?]
(if (/.every? n.even? sample)
(not (/.any? (bit.complement n.even?) sample))
@@ -144,11 +150,17 @@
already-sorted!
expected-numbers!)))
(_.cover [/.enumeration]
- (let [enumeration (/.enumeration sample)]
- (and (/@= (/.indices (/.size enumeration))
- (/@map product.left enumeration))
- (/@= sample
- (/@map product.right enumeration)))))
+ (let [enumeration (/.enumeration sample)
+
+ has-correct-indices!
+ (/@= (/.indices (/.size enumeration))
+ (/@map product.left enumeration))
+
+ has-correct-values!
+ (/@= sample
+ (/@map product.right enumeration))]
+ (and has-correct-indices!
+ has-correct-values!)))
(_.cover [/.nth]
(/.every? (function (_ [index expected])
(case (/.nth index sample)
@@ -366,13 +378,10 @@
(_.cover [/.find]
(case (/.find n.even? sample)
(#.Some found)
- (and (n.even? found)
- (/.any? n.even? sample)
- (not (/.every? (bit.complement n.even?) sample)))
+ (n.even? found)
#.None
- (and (not (/.any? n.even? sample))
- (/.every? (bit.complement n.even?) sample))))
+ (not (/.any? n.even? sample))))
))))
(def: #export test
@@ -394,18 +403,20 @@
..search
(_.cover [/.interpose]
- (let [sample+ (/.interpose separator sample)]
- (and (n.= (|> (/.size sample) (n.* 2) dec)
- (/.size sample+))
- (|> sample+ /.as-pairs (/.every? (|>> product.right (n.= separator)))))))
+ (or (/.empty? sample)
+ (let [sample+ (/.interpose separator sample)]
+ (and (n.= (|> (/.size sample) (n.* 2) dec)
+ (/.size sample+))
+ (|> sample+ /.as-pairs (/.every? (|>> product.right (n.= separator))))))))
(_.cover [/.iterate]
- (let [size (/.size sample)]
- (/@= (/.indices size)
- (/.iterate (function (_ index)
- (if (n.< size index)
- (#.Some (inc index))
- #.None))
- 0))))
+ (or (/.empty? sample)
+ (let [size (/.size sample)]
+ (/@= (/.indices size)
+ (/.iterate (function (_ index)
+ (if (n.< size index)
+ (#.Some (inc index))
+ #.None))
+ 0)))))
(_.cover [/.folds]
(/@= (/@map (function (_ index)
(:: /.fold fold n.+ 0 (/.take index sample)))
diff --git a/stdlib/source/test/lux/data/collection/queue.lux b/stdlib/source/test/lux/data/collection/queue.lux
index 9605a50b1..f646fd82a 100644
--- a/stdlib/source/test/lux/data/collection/queue.lux
+++ b/stdlib/source/test/lux/data/collection/queue.lux
@@ -1,6 +1,5 @@
(.module:
[lux #*
- ["%" data/text/format (#+ format)]
["_" test (#+ Test)]
[abstract
[monad (#+ do)]
@@ -9,10 +8,15 @@
["$." equivalence]
["$." functor (#+ Injection)]]}]
[data
+ ["." bit ("#@." equivalence)]
+ ["%" text/format (#+ format)]
[number
- ["n" nat]]]
+ ["n" nat]]
+ [collection
+ ["." set]
+ ["." list ("#@." monoid)]]]
[math
- ["r" random]]]
+ ["." random]]]
{1
["." /]})
@@ -22,43 +26,95 @@
(def: #export test
Test
- (<| (_.context (%.name (name-of /.Queue)))
- (do {@ r.monad}
- [size (:: @ map (n.% 100) r.nat)
- sample (r.queue size r.nat)
- non-member (|> r.nat
- (r.filter (|>> (/.member? n.equivalence sample) not)))]
+ (<| (_.covering /._)
+ (_.with-cover [/.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
- ($equivalence.spec (/.equivalence n.equivalence) (r.queue size r.nat))
- ($functor.spec ..injection /.equivalence /.functor)
-
- (_.test "I can query the size of a queue (and empty queues have size 0)."
- (if (n.= 0 size)
- (/.empty? sample)
- (n.= size (/.size sample))))
- (_.test "Enqueueing and dequeing affects the size of queues."
- (and (n.= (inc size) (/.size (/.push non-member sample)))
- (or (/.empty? sample)
- (n.= (dec size) (/.size (/.pop sample))))
- (n.= size (/.size (/.pop (/.push non-member sample))))))
- (_.test "Transforming to/from list can't change the queue."
- (let [(^open "/;.") (/.equivalence n.equivalence)]
- (|> sample
- /.to-list /.from-list
- (/;= sample))))
- (_.test "I can always peek at a non-empty queue."
- (case (/.peek sample)
- #.None (/.empty? sample)
- (#.Some _) #1))
- (_.test "I can query whether an element belongs to a queue."
- (and (not (/.member? n.equivalence sample non-member))
- (/.member? n.equivalence (/.push non-member sample)
- non-member)
- (case (/.peek sample)
- #.None
- (/.empty? sample)
-
- (#.Some first)
- (and (/.member? n.equivalence sample first)
- (not (/.member? n.equivalence (/.pop sample) first))))))
+ (_.with-cover [/.equivalence]
+ ($equivalence.spec (/.equivalence n.equivalence) (random.queue size random.nat)))
+ (_.with-cover [/.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)))))
))))