(.require [library [lux (.except) [abstract [monad (.only do)]] [control [io (.only IO)] ["[0]" try] [concurrency ["[0]" async (.only Async)]]] [data ["[0]" text (.only) ["%" \\format (.only format)]]] [math ["[0]" random]] ["_" test (.only Test) ["[0]" unit]]]] [\\library ["[0]" /]]) (def .public (spec console) (-> (IO (/.Console Async)) Test) (do random.monad [message (random.alphabetic 10)] (in (do async.monad [console (async.future console) ?write (at console write (format message text.new_line)) ?read (at console read []) ?read_line (at console read_line []) ?close/good (at console close []) ?close/bad (at console close []) .let [can_write! (case ?write {try.#Success _} true _ false) can_read! (case [?read ?read_line] [{try.#Success _} {try.#Success _}] true _ false) can_close! (case [?close/good ?close/bad] [{try.#Success _} {try.#Failure _}] true _ false)]] (unit.coverage [/.Console] (and can_write! can_read! can_close!))))))