diff options
Diffstat (limited to 'stdlib/source/test/lux/data')
-rw-r--r-- | stdlib/source/test/lux/data/collection/list.lux | 61 | ||||
-rw-r--r-- | stdlib/source/test/lux/data/collection/queue.lux | 138 |
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))))) )))) |