(.module: [library [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)] [\\specification ["$." equivalence] ["$." monoid]]] [control ["." try ("#\." functor)] ["." exception]] [data ["." product] ["." text ("#\." equivalence)]] [math ["." random (#+ Random) ("#\." monad)] [number ["n" nat]]]]] [// ["@." profile]] [\\program ["." / ["/#" // #_ ["#" profile]]]]) (def: profile (Random [//.Name //.Profile]) (|> @profile.random (random\each (with@ #//.parents (list))) (random.and (random.ascii/alpha 1)))) (def: .public random (Random /.Project) (do random.monad [[name profile] ..profile] (in (/.project name profile)))) (def: .public test Test (<| (_.covering /._) (_.for [/.Project /.project] ($_ _.and (_.for [/.equivalence] ($equivalence.spec /.equivalence ..random)) (_.for [/.monoid] ($monoid.spec /.equivalence /.monoid ..random)) (_.cover [/.file] (|> /.file (text\= "") not)) (do random.monad [[super_name super_profile] ..profile [dummy_name dummy_profile] (random.only (|>> product.left (text\= super_name) not) ..profile) [sub_name sub_profile] (random.only (function (_ [name profile]) (and (not (text\= super_name name)) (not (text\= dummy_name name)))) ..profile) fake_name (random.only (function (_ name) (and (not (text\= super_name name)) (not (text\= dummy_name name)) (not (text\= sub_name name)))) (random.ascii/alpha 1)) .let [project ($_ (\ /.monoid composite) (/.project super_name super_profile) (/.project dummy_name dummy_profile) (/.project sub_name (with@ #//.parents (list super_name) sub_profile))) circular ($_ (\ /.monoid composite) (/.project super_name (with@ #//.parents (list sub_name) super_profile)) (/.project dummy_name dummy_profile) (/.project sub_name (with@ #//.parents (list super_name) sub_profile)))]] ($_ _.and (_.cover [/.profile] (and (|> (/.profile project super_name) (try\each (\ //.equivalence = super_profile)) (try.else false)) (|> (/.profile project dummy_name) (try\each (\ //.equivalence = dummy_profile)) (try.else false)) (|> (/.profile project sub_name) (try\each (\ //.equivalence = (\ //.monoid composite sub_profile super_profile))) (try.else false)))) (_.cover [/.unknown_profile] (case (/.profile project fake_name) (#try.Success _) false (#try.Failure error) (exception.match? /.unknown_profile error))) (_.cover [/.circular_dependency] (case (/.profile circular sub_name) (#try.Success _) false (#try.Failure error) (exception.match? /.circular_dependency error))) )) ))))