(.module: [library [lux {"-" Name} [abstract [monad {"+" do}]] [control [concurrency ["[0]" async {"+" Async} ("[1]#[0]" monad)]]] [math [number ["i" int]]] [world ["[0]" program {"+" Program}] ["[0]" file] ["[0]" shell {"+" Exit Shell}] ["[0]" console {"+" Console}]]]] ["[0]" // "_" ["[1][0]" build] ["/[1]" // "_" ["[1]" profile] ["[1][0]" action] ["[1][0]" command {"+" Command}] ["[1][0]" runtime] [dependency [resolution {"+" Resolution}]]]]) (def: .public start "[TEST STARTED]") (def: .public success "[TEST ENDED]") (def: .public failure "[TEST FAILED]") (def: .public (do! console program fs shell resolution profile) (-> (Console Async) (Program Async) (file.System Async) (Shell Async) Resolution (Command [Exit Any])) (do async.monad [environment (program.environment async.monad program) .let [working_directory (# program directory)]] (do [! ///action.monad] [.let [home (# program home)] [build_exit compiler program] (//build.do! console program fs shell resolution (with@ ///.#program (value@ ///.#test profile) profile))] (if (i.= shell.normal build_exit) (do ! [_ (console.write_line ..start console) .let [host_dependencies (//build.host_dependencies fs home resolution) [test_command test_parameters] (case compiler {//build.#JVM dependency} (|> program (///runtime.for (value@ ///.#java profile)) (//build.with_jvm_class_path host_dependencies)) (^template [ ] [{ artifact} (///runtime.for (value@ profile) program)]) ([//build.#JS ///.#js] [//build.#Python ///.#python] [//build.#Lua ///.#lua] [//build.#Ruby ///.#ruby]))] process (# shell execute [environment working_directory test_command test_parameters]) _ (//build.log_output! console process) _ (//build.log_error! console process) exit (# process await []) _ (console.write_line (if (i.= shell.normal exit) ..success ..failure) console)] (in [exit []])) (in [build_exit []])))))