(.module: [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)]] [control ["." try ("#\." functor)] [parser ["<.>" text]]] [math ["." random (#+ Random)] [number ["n" nat] ["i" int]]] [time ["." date (#+ Date)] ["." year]]] {#program ["." /]}) (def: #export random (Random Date) (random.one (function (_ raw) (try.to_maybe (do try.monad [year (|> raw date.year year.value i.abs (i.% +10,000) year.year)] (date.date year (date.month raw) (date.day_of_month raw))))) random.date)) (def: #export test Test (<| (_.covering /._) ($_ _.and (do random.monad [expected ..random] (_.cover [/.format /.parser] (|> expected /.format (.run /.parser) (try\map (\ date.equivalence = expected)) (try.default false)))) )))