diff options
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/test/lux/data/collection/sequence.lux | 170 |
1 files changed, 83 insertions, 87 deletions
diff --git a/stdlib/source/test/lux/data/collection/sequence.lux b/stdlib/source/test/lux/data/collection/sequence.lux index 90971d2e9..edacef996 100644 --- a/stdlib/source/test/lux/data/collection/sequence.lux +++ b/stdlib/source/test/lux/data/collection/sequence.lux @@ -1,104 +1,100 @@ (.module: [lux #* + data/text/format + ["_" test (#+ Test)] [control - [monad (#+ do Monad)] - comonad] + comonad + [monad (#+ do Monad)]] [data ["." maybe] [number - ["." nat ("#;." codec)]] - ["." text ("#;." monoid)] + ["." nat ("#@." decimal)]] + ["." text ("#@." monoid)] [collection - ["." list] - ["&" sequence]]] + ["." list]]] [math ["r" random]]] - lux/test) + {1 + ["." /]}) -(context: "Sequences" - (<| (times 100) - (do @ +(def: #export test + Test + (<| (_.context (%name (name-of /.Sequence))) + (do r.monad [size (|> r.nat (:: @ map (|>> (n/% 100) (n/max 2)))) offset (|> r.nat (:: @ map (n/% 100))) factor (|> r.nat (:: @ map (|>> (n/% 100) (n/max 2)))) elem r.nat cycle-seed (r.list size r.nat) cycle-sample-idx (|> r.nat (:: @ map (n/% 1000))) - #let [(^open "List;.") (list.equivalence number.equivalence) - sample0 (&.iterate inc 0) - sample1 (&.iterate inc offset)]] - ($_ seq - (test "Can move along a sequence and take slices off it." - (and (and (List;= (list.n/range 0 (dec size)) - (&.take size sample0)) - (List;= (list.n/range offset (dec (n/+ offset size))) - (&.take size (&.drop offset sample0))) - (let [[drops takes] (&.split size sample0)] - (and (List;= (list.n/range 0 (dec size)) - drops) - (List;= (list.n/range size (dec (n/* 2 size))) - (&.take size takes))))) - (and (List;= (list.n/range 0 (dec size)) - (&.take-while (n/< size) sample0)) - (List;= (list.n/range offset (dec (n/+ offset size))) - (&.take-while (n/< (n/+ offset size)) - (&.drop-while (n/< offset) sample0))) - (let [[drops takes] (&.split-while (n/< size) sample0)] - (and (List;= (list.n/range 0 (dec size)) - drops) - (List;= (list.n/range size (dec (n/* 2 size))) - (&.take-while (n/< (n/* 2 size)) takes))))) - )) - - (test "Can repeat any element and infinite number of times." - (n/= elem (&.nth offset (&.repeat elem)))) - - (test "Can obtain the head & tail of a sequence." - (and (n/= offset (&.head sample1)) - (List;= (list.n/range (inc offset) (n/+ offset size)) - (&.take size (&.tail sample1))))) - - (test "Can filter sequences." - (and (n/= (n/* 2 offset) - (&.nth offset - (&.filter n/even? sample0))) - (let [[evens odds] (&.partition n/even? (&.iterate inc 0))] - (and (n/= (n/* 2 offset) - (&.nth offset evens)) - (n/= (inc (n/* 2 offset)) - (&.nth offset odds)))))) - - (test "Functor goes over 'all' elements in a sequence." - (let [(^open "&;.") &.functor - there (&;map (n/* factor) sample0) - back-again (&;map (n// factor) there)] - (and (not (List;= (&.take size sample0) - (&.take size there))) - (List;= (&.take size sample0) - (&.take size back-again))))) - - (test "CoMonad produces a value for every element in a sequence." - (let [(^open "&;.") &.functor] - (List;= (&.take size (&;map (n/* factor) sample1)) - (&.take size - (be &.comonad - [inputs sample1] - (n/* factor (&.head inputs))))))) - - (test "'unfold' generalizes 'iterate'." - (let [(^open "&;.") &.functor - (^open "List;.") (list.equivalence text.equivalence)] - (List;= (&.take size - (&;map nat;encode (&.iterate inc offset))) - (&.take size - (&.unfold (function (_ n) [(inc n) (nat;encode n)]) - offset))))) - - (test "Can cycle over the same elements as an infinite sequence." - (|> (&.cycle cycle-seed) - maybe.assume - (&.nth cycle-sample-idx) - (n/= (|> cycle-seed - (list.nth (n/% size cycle-sample-idx)) - maybe.assume)))) + #let [(^open "list@.") (list.equivalence nat.equivalence) + sample0 (/.iterate inc 0) + sample1 (/.iterate inc offset)]] + ($_ _.and + (_.test "Can move along a sequence and take slices off it." + (and (and (list@= (list.n/range 0 (dec size)) + (/.take size sample0)) + (list@= (list.n/range offset (dec (n/+ offset size))) + (/.take size (/.drop offset sample0))) + (let [[drops takes] (/.split size sample0)] + (and (list@= (list.n/range 0 (dec size)) + drops) + (list@= (list.n/range size (dec (n/* 2 size))) + (/.take size takes))))) + (and (list@= (list.n/range 0 (dec size)) + (/.take-while (n/< size) sample0)) + (list@= (list.n/range offset (dec (n/+ offset size))) + (/.take-while (n/< (n/+ offset size)) + (/.drop-while (n/< offset) sample0))) + (let [[drops takes] (/.split-while (n/< size) sample0)] + (and (list@= (list.n/range 0 (dec size)) + drops) + (list@= (list.n/range size (dec (n/* 2 size))) + (/.take-while (n/< (n/* 2 size)) takes))))) + )) + (_.test "Can repeat any element and infinite number of times." + (n/= elem (/.nth offset (/.repeat elem)))) + (_.test "Can obtain the head & tail of a sequence." + (and (n/= offset (/.head sample1)) + (list@= (list.n/range (inc offset) (n/+ offset size)) + (/.take size (/.tail sample1))))) + (_.test "Can filter sequences." + (and (n/= (n/* 2 offset) + (/.nth offset + (/.filter n/even? sample0))) + (let [[evens odds] (/.partition n/even? (/.iterate inc 0))] + (and (n/= (n/* 2 offset) + (/.nth offset evens)) + (n/= (inc (n/* 2 offset)) + (/.nth offset odds)))))) + (_.test "Functor goes over 'all' elements in a sequence." + (let [(^open "/@.") /.functor + there (/@map (n/* factor) sample0) + back-again (/@map (n// factor) there)] + (and (not (list@= (/.take size sample0) + (/.take size there))) + (list@= (/.take size sample0) + (/.take size back-again))))) + (_.test "CoMonad produces a value for every element in a sequence." + (let [(^open "/@.") /.functor] + (list@= (/.take size (/@map (n/* factor) sample1)) + (/.take size + (be /.comonad + [inputs sample1] + (n/* factor (/.head inputs))))))) + (_.test "'unfold' generalizes 'iterate'." + (let [(^open "/@.") /.functor + (^open "list@.") (list.equivalence text.equivalence)] + (list@= (/.take size + (/@map nat@encode (/.iterate inc offset))) + (/.take size + (/.unfold (function (_ n) [(inc n) (nat@encode n)]) + offset))))) + (_.test "Can cycle over the same elements as an infinite sequence." + (|> (/.cycle cycle-seed) + maybe.assume + (/.nth cycle-sample-idx) + (n/= (|> cycle-seed + (list.nth (n/% size cycle-sample-idx)) + maybe.assume)))) )))) |