(.using [library [lux (.full) ["_" test (.only Test)] [abstract [monad (.only do)] [hash (.only Hash)]] [control ["[0]" pipe] ["[0]" try] [parser ["<[0]>" code]]] [data ["[0]" text] [collection ["[0]" set (.only Set)] ["[0]" dictionary (.only Dictionary)] ["[0]" list ("[1]#[0]" functor)]]] [math ["[0]" random (.only Random)] [number ["n" nat]]] [macro ["[0]" code]]]] [// ["@[0]" profile]] [\\program ["[0]" / (.only) ["/[1]" // ["[1]" profile] ["[1][0]" project (.only Project)] ["[1][0]" artifact (.only Artifact)] ["[1][0]" dependency (.only Dependency)] ["[1][0]" format]]]]) (def: name (Random //.Name) (random.alphabetic 1)) (def: (list_of random) (All (_ a) (-> (Random a) (Random (List a)))) (do [! random.monad] [size (# ! each (n.% 5) random.nat)] (random.list size random))) (def: (dictionary_of key_hash key_random value_random) (All (_ k v) (-> (Hash k) (Random k) (Random v) (Random (Dictionary k v)))) (# random.functor each (dictionary.of_list key_hash) (..list_of (random.and key_random value_random)))) (def: random (Random Project) (..dictionary_of text.hash ..name @profile.random)) (def: with_default_sources (-> //.Profile //.Profile) (revised //.#sources (is (-> (Set //.Source) (Set //.Source)) (function (_ sources) (if (set.empty? sources) (set.of_list text.hash (list //.default_source)) sources))))) (def: with_default_repository (-> //.Profile //.Profile) (revised //.#repositories (set.has //.default_repository))) (def: (with_empty_profile project) (-> Project Project) (if (dictionary.empty? project) (//project.project //.default (# //.monoid identity)) project)) (def: .public test Test (<| (_.covering /._) (_.covering //format._) (do random.monad [expected ..random] (_.coverage [/.project //format.Format //format.project] (|> expected //format.project list (.result /.project) (pipe.case {try.#Success actual} (|> expected ..with_empty_profile dictionary.entries (list#each (function (_ [name profile]) [name (|> profile ..with_default_sources ..with_default_repository)])) (dictionary.of_list text.hash) (# //project.equivalence = actual)) {try.#Failure error} false))))))