(.module: [lux #* [control ["M" monad (#+ Monad do)] pipe ["p" parser]] [data ["." error] [number ["." nat ("nat/." decimal)]] [text ("text/." equivalence) format] [collection ["." list]]] [math ["r" random]] ["_" test (#+ Test)]] {1 ["." /]}) (def: #export test Test (do r.monad [num-args (|> r.nat (:: @ map (n/% 10))) #let [gen-arg (:: @ map nat/encode r.nat)] yes gen-arg #let [gen-ignore (r.filter (|>> (text/= yes) not) (r.unicode 5))] no gen-ignore pre-ignore (r.list 5 gen-ignore) post-ignore (r.list 5 gen-ignore)] ($_ _.and (_.test "Can read any argument." (|> (/.run (list yes) /.any) (case> (#error.Failure _) #0 (#error.Success arg) (text/= arg yes)))) (_.test "Can test tokens." (and (|> (/.run (list yes) (/.this yes)) (case> (#error.Failure _) #0 (#error.Success _) #1)) (|> (/.run (list no) (/.this yes)) (case> (#error.Failure _) #1 (#error.Success _) #0)))) (_.test "Can use custom token parsers." (|> (/.run (list yes) (/.parse nat/decode)) (case> (#error.Failure _) #0 (#error.Success parsed) (text/= (nat/encode parsed) yes)))) (_.test "Can query if there are any more inputs." (and (|> (/.run (list) /.end) (case> (#error.Success []) #1 _ #0)) (|> (/.run (list yes) (p.not /.end)) (case> (#error.Success []) #0 _ #1)))) (_.test "Can parse CLI input anywhere." (|> (/.run (list.concat (list pre-ignore (list yes) post-ignore)) (|> (/.somewhere (/.this yes)) (p.before (p.some /.any)))) (case> (#error.Failure _) #0 (#error.Success _) #1))) )))