nri-prelude-0.1.0.0: src/Expect/Task.hs
-- | A library to create @Expecation@s for @Task@s.
module Expect.Task
( check,
andCheck,
succeeds,
fails,
TestFailure,
)
where
import qualified Debug
import qualified Expect
import qualified Internal.Expectation
import qualified Internal.TestResult
import Internal.TestResult (TestFailure)
import NriPrelude
import qualified Platform
import qualified Platform.DoAnything as DoAnything
import qualified Task
-- | Check a task returns an expected value, than pass that value on.
--
-- > task "Greetings are friendly" <| do
-- > getGreeting
-- > |> andCheck (Expect.equal "Hi!")
andCheck :: (a -> Expect.Expectation) -> Task TestFailure a -> Task TestFailure a
andCheck expectation t = do
x <- t
expectation x
|> Internal.Expectation.toResult
|> map Ok
|> Platform.doAnything DoAnything.Handler
|> Task.andThen
( \res -> case res of
Internal.TestResult.Passed -> Task.succeed ()
Internal.TestResult.Skipped -> Task.succeed ()
Internal.TestResult.Failed message -> Task.fail message
)
Task.succeed x
-- | Check an expectation in the middle of a @do@ block.
--
-- > task "Laundry gets done" <| do
-- > weightInKgs <- clothesInWasher
-- > check (weightInKgs |> Expect.atMost 8)
-- > soapInWasher
-- > startMachine
check :: Expect.Expectation -> Task TestFailure ()
check expectation =
Task.succeed ()
|> andCheck (\() -> expectation)
-- | Check a task succeeds.
--
-- > task "solve rubicskube" <| do
-- > solveRubicsKube
-- > |> succeeds
succeeds :: Show err => Task err a -> Task TestFailure a
succeeds =
Task.mapError
( \message ->
Internal.TestResult.TestFailure (Debug.toString message)
)
-- | Check a task fails.
--
-- > task "chemistry experiment" <| do
-- > mixRedAndGreenLiquids
-- > |> fails
fails :: Text -> Task TestFailure a
fails =
Task.fail << Internal.TestResult.TestFailure << Debug.toString