(.module: [library [lux #* ["_" test (#+ Test)] [abstract [monad (#+ do)] [\\specification ["$." equivalence]]] [control [pipe (#+ case>)] ["." try] [parser ["." cli]]] [data ["." text ("#\." equivalence)]] [math ["." random (#+ Random) ("#\." monad)]]]] [\\program ["." / ["/#" // #_ ["#" profile]]]]) (def: compilation (Random /.Compilation) (random.or (random\in []) (random\in []))) (def: command (Random /.Command) ($_ random.or ## #Version (random\in []) ## #Clean (random\in []) ## #POM (random\in []) ## #Dependencies (random\in []) ## #Install (random\in []) ## #Deploy ($_ random.and (random.ascii/alpha 1) (random.ascii/alpha 1) (random.ascii/alpha 1)) ## #Compilation ..compilation ## #Auto ..compilation)) (def: (compilation_format value) (-> /.Compilation (List Text)) (case value #/.Build (list "build") #/.Test (list "test"))) (def: (format value) (-> /.Command (List Text)) (case value #/.Version (list "version") #/.Clean (list "clean") #/.POM (list "pom") #/.Dependencies (list "deps") #/.Install (list "install") (#/.Deploy repository [user password]) (list "deploy" repository user password) (#/.Compilation compilation) (..compilation_format compilation) (#/.Auto compilation) (list& "auto" (..compilation_format compilation)))) (def: without_profile Test (do random.monad [expected ..command] (_.test "Without profile." (|> expected ..format (cli.run /.command) (case> (#try.Success [name actual]) (and (text\= //.default name) (\ /.equivalence = expected actual)) (#try.Failure error) false))))) (def: with_profile Test (do random.monad [expected_profile (random.ascii/alpha 1) expected_command ..command] (_.test "With profile." (|> expected_command ..format (list& "with" expected_profile) (cli.run /.command) (case> (#try.Success [actual_profile actual_command]) (and (text\= expected_profile actual_profile) (\ /.equivalence = expected_command actual_command)) (#try.Failure error) false))))) (def: #export test Test (<| (_.covering /._) (_.for [/.Compilation /.Command] ($_ _.and (_.for [/.equivalence] ($equivalence.spec /.equivalence ..command)) (_.for [/.command] ($_ _.and ..without_profile ..with_profile ))))))