(.module: [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)] {[0 #spec] [/ ["$." equivalence]]}] [control ["." try ("#\." functor)] [parser ["<.>" xml]]] [math [number ["n" nat]]] ["." time ["." date] ["." year] ["." month] ["." instant (#+ Instant)] ["." duration]] [math ["." random (#+ Random)]] [macro ["." code]]] ["$." /// #_ ["#." artifact ["#/." type]]] {#program ["." /]}) (def: random_instant (Random Instant) (do {! random.monad} [year (\ ! map (|>> (n.% 10,000) .int) random.nat) month (\ ! map (n.% 13) random.nat) day_of_month (\ ! map (n.% 29) random.nat) hour (\ ! map (n.% 24) random.nat) minute (\ ! map (n.% 60) random.nat) second (\ ! map (n.% 60) random.nat)] (wrap (try.assume (do try.monad [year (year.year year) month (month.by_number month) date (date.date year month day_of_month) time (time.time {#time.hour hour #time.minute minute #time.second second #time.milli_second 0})] (wrap (instant.from_date_time date time))))))) (def: random_versioning (Random /.Versioning) ($_ random.and ..random_instant random.nat (random.list 5 $///artifact/type.random) )) (def: #export random (Random /.Metadata) ($_ random.and $///artifact.random ..random_versioning)) (def: #export test Test (<| (_.covering /._) (_.for [/.Metadata]) ($_ _.and (_.for [/.equivalence] ($equivalence.spec /.equivalence ..random)) (do random.monad [expected ..random] (_.cover [/.format /.parser] (|> expected /.format (.run /.parser) (try\map (\ /.equivalence = expected)) (try.default false)))) )))