aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/data/collection/stack.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/test/lux/data/collection/stack.lux81
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))))
))))