(.module: [library [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)] [\\specification ["$." equivalence]]] [control ["." try ("#\." functor)] [parser ["<.>" text]]] [data ["." text ("#\." equivalence) ["%" format (#+ format)]]] [math ["." random (#+ Random) ("#\." monad)] [number ["n" nat] ["i" int]]] [time ["." instant]]]] ["$." /// #_ ["#." stamp]] [\\program ["." / ["//#" /// ["#." stamp] ["#." time]]]]) (def: #export random (Random /.Value) ($_ random.and (random.ascii/alpha 5) (random.or (random\in []) $///stamp.random) )) (def: #export test Test (<| (_.covering /._) (_.for [/.Value]) ($_ _.and (_.for [/.equivalence] ($equivalence.spec /.equivalence ..random)) (do random.monad [sample random stamp $///stamp.random] (let [version (get@ #/.version sample) local! (text\= version (/.format (set@ #/.snapshot #///.Local sample))) remote_format (/.format {#/.version (format version /.snapshot) #/.snapshot (#///.Remote stamp)}) remote! (and (text.starts_with? (format version (///time.format (get@ #///stamp.time stamp))) remote_format) (text.ends_with? (%.nat (get@ #///stamp.build stamp)) remote_format))] (_.cover [/.snapshot /.format] (and local! remote!)))) )))