(.require [library [lux (.except) ["[0]" debug] [abstract [monad (.only do)]] [data ["[0]" identity] ["[0]" text (.use "[1]#[0]" equivalence) ["%" \\format (.only format)]]] [math ["[0]" random] [number ["n" nat]]] [test ["_" property (.only Test)]]]] [\\library ["[0]" /]]) (def .public test Test (<| (_.covering /._) (do [! random.monad] [sample random.nat] (all _.and (do ! [another random.nat] (_.coverage [/.new] (n.= (++ another) (|> sample (n.* 3) (n.+ 4) (/.new another [++]))))) (_.coverage [/.let] (n.= (n.+ sample sample) (|> sample (/.let x [(n.+ x x)])))) (_.coverage [/.cond] (text#= (cond (n.= 0 sample) "zero" (n.even? sample) "even" "odd") (|> sample (/.cond [(n.= 0)] [(/.new "zero" [])] [n.even?] [(/.new "even" [])] [(/.new "odd" [])])))) (_.coverage [/.if] (text#= (if (n.even? sample) "even" "odd") (|> sample (/.if [n.even?] [(/.new "even" [])] [(/.new "odd" [])])))) (_.coverage [/.while] (n.= (n.* 10 sample) (|> sample (/.while [(n.= (n.* 10 sample)) not] [(n.+ sample)])))) (_.coverage [/.do] (n.= (++ (n.+ 4 (n.* 3 sample))) (|> sample (/.do identity.monad [(n.* 3)] [(n.+ 4)] [++])))) (_.coverage [/.exec] (n.= (n.* 10 sample) (|> sample (/.exec [%.nat (format "sample = ") debug.log!]) (n.* 10)))) (_.coverage [/.tuple] (let [[left middle right] (|> sample (/.tuple [++] [--] [%.nat]))] (and (n.= (++ sample) left) (n.= (-- sample) middle) (text#= (%.nat sample) right)))) (_.coverage [/.when] (text#= (when (n.% 10 sample) 0 "zero" 1 "one" 2 "two" 3 "three" 4 "four" 5 "five" 6 "six" 7 "seven" 8 "eight" 9 "nine" _ "???") (|> sample (n.% 10) (/.when 0 "zero" 1 "one" 2 "two" 3 "three" 4 "four" 5 "five" 6 "six" 7 "seven" 8 "eight" 9 "nine" _ "???")))) ))))