(.module: [library [lux "*" ["_" test {"+" [Test]}] [abstract [monad {"+" [do]}]] [control ["." maybe] ["." try] ["." exception {"+" [exception:]}] [concurrency ["." async {"+" [Async]}]]] [data ["." text ("#\." equivalence) ["%" format {"+" [format]}]]] [math ["." random]] [tool [compiler ["." version] ["." language "_" ["#/." lux "_" ["#" version]]]]] [world ["." console {"+" [Console Mock]}]]]] [/// ["@." profile]] [\\program ["." /]]) (exception: .public console_is_closed!) (implementation: mock (Mock [Bit Text]) (def: (on_read [open? state]) (if open? (try.of_maybe (do maybe.monad [head (text.char 0 state) [_ tail] (text.split_at 1 state)] (in [[open? tail] head]))) (exception.except ..console_is_closed! []))) (def: (on_read_line [open? state]) (if open? (try.of_maybe (do maybe.monad [[output state] (text.split_by text.new_line state)] (in [[open? state] output]))) (exception.except ..console_is_closed! []))) (def: (on_write input [open? state]) (if open? (#try.Success [open? (format state input)]) (exception.except ..console_is_closed! []))) (def: (on_close [open? buffer]) (if open? (#try.Success [false buffer]) (exception.except ..console_is_closed! [])))) (def: .public echo (-> Text (Console Async)) (|>> [true] (console.mock ..mock) console.async)) (def: .public test Test (<| (_.covering /._) (do random.monad [profile @profile.random] (in (do async.monad [.let [console (..echo "")] verdict (do (try.with async.monad) [_ (/.do! console profile) logging (\ console read_line [])] (in (text\= (version.format language/lux.version) logging)))] (_.cover' [/.do!] (try.else false verdict)))))))