(.require [library [lux (.except) [abstract [monad (.only do)] [hash (.only Hash)]] [control ["[0]" pipe] ["[0]" try]] [data ["[0]" text] [collection ["[0]" set (.only Set)] ["[0]" dictionary (.only Dictionary)] ["[0]" list (.use "[1]#[0]" functor)]]] [math ["[0]" random (.only Random)] [number ["n" nat]]] [meta ["[0]" code (.only) ["<[1]>" \\parser]]] [test ["_" property (.only Test)]]]] [// ["@[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 (at ! 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)))) (at 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 (at //.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) (at //project.equivalence = actual)) {try.#Failure error} false))))))