(.module: [library [lux "*" ["_" test {"+" [Test]}] [abstract [monad {"+" [do]}]] [control ["[0]" try {"+" [Try]}] [concurrency ["[0]" async {"+" [Async]}]]] [data [text ["%" format] [encoding ["[0]" utf8]]] [collection ["[0]" set {"+" [Set]}]]] [math ["[0]" random]] [world ["[0]" file]]]] [// ["$[0]" profile]] [\\program ["[0]" / ["/[1]" // "_" ["[1]" profile {"+" [Profile]}] ["[1][0]" project] ["[1][0]" action] ["[1][0]" format] [repository [remote {"+" [Address]}]]]]]) (def: (with_default_source sources) (-> (Set //.Source) (Set //.Source)) (if (set.empty? sources) (set.has //.default_source sources) sources)) (def: with_default_repository (-> (Set Address) (Set Address)) (set.has //.default_repository)) (def: .public test Test (<| (_.covering /._) (do [! random.monad] [expected (# ! each (with@ //.#parents (list)) $profile.random) .let [fs (: (file.System Async) (file.mock (# file.default separator)))]] (in (do async.monad [verdict (do //action.monad [.let [profile (|> expected (//project.project //.default) //format.project %.code (# utf8.codec encoded))] _ (# fs write profile //project.file) actual (: (Async (Try Profile)) (/.read async.monad fs (list //.default)))] (in (# //.equivalence = (|> expected (revised@ //.#sources ..with_default_source) (revised@ //.#repositories ..with_default_repository)) actual)))] (_.cover' [/.read] (try.else false verdict)))))))