diff options
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/test/lux/data/collection/stack.lux | 81 |
1 files changed, 52 insertions, 29 deletions
diff --git a/stdlib/source/test/lux/data/collection/stack.lux b/stdlib/source/test/lux/data/collection/stack.lux index d203b4246..0a6fcf698 100644 --- a/stdlib/source/test/lux/data/collection/stack.lux +++ b/stdlib/source/test/lux/data/collection/stack.lux @@ -1,46 +1,69 @@ (.module: [lux #* + data/text/format + ["_" test (#+ Test)] [control - [monad (#+ do)]] + [monad (#+ do)] + {[0 #test] + [/ + ["$." equivalence] + ["$." functor (#+ Injection)]]}] [data ["." maybe] - [collection - ["&" stack]]] + [number + ["." nat]]] [math ["r" random]]] - lux/test) + {1 + ["." /]}) + +(def: (injection value) + (Injection /.Stack) + (/.push value /.empty)) (def: gen-nat (r.Random Nat) (|> r.nat (:: r.monad map (n/% 100)))) -(context: "Stacks" - (<| (times 100) - (do @ +(def: #export test + Test + (<| (_.context (%name (name-of /.Stack))) + (do r.monad [size gen-nat sample (r.stack size gen-nat) new-top gen-nat] - ($_ seq - (test "Can query the size of a stack." - (n/= size (&.size sample))) - - (test "Can peek inside non-empty stacks." - (case (&.peek sample) - #.None (&.empty? sample) - (#.Some _) (not (&.empty? sample)))) - - (test "Popping empty stacks doesn't change anything. - But, if they're non-empty, the top of the stack is removed." - (let [sample' (&.pop sample)] - (or (n/= (&.size sample) (inc (&.size sample'))) - (and (&.empty? sample) (&.empty? sample'))) - )) - - (test "Pushing onto a stack always increases it by 1, adding a new value at the top." - (and (is? sample - (&.pop (&.push new-top sample))) - (n/= (inc (&.size sample)) (&.size (&.push new-top sample))) - (|> (&.push new-top sample) &.peek maybe.assume - (is? new-top)))) + ($_ _.and + ($equivalence.spec (/.equivalence nat.equivalence) (r.stack size r.nat)) + ($functor.spec ..injection /.equivalence /.functor) + + (_.test "Can query the size of a stack." + (n/= size (/.size sample))) + (_.test "Can peek inside non-empty stacks." + (case (/.peek sample) + #.None (/.empty? sample) + (#.Some _) (not (/.empty? sample)))) + (_.test (format "Popping empty stacks doesn't change anything." + "But, if they're non-empty, the top of the stack is removed.") + (case (/.size sample) + 0 (case (/.pop sample) + #.None + (/.empty? sample) + + (#.Some _) + false) + expected (case (/.pop sample) + (#.Some sample') + (and (n/= expected (/.size sample')) + (not (/.empty? sample))) + + #.None + false))) + (_.test "Pushing onto a stack always increases it by 1, adding a new value at the top." + (and (is? sample + (|> sample (/.push new-top) /.pop maybe.assume)) + (n/= (inc (/.size sample)) + (/.size (/.push new-top sample))) + (|> (/.push new-top sample) /.peek maybe.assume + (is? new-top)))) )))) |