sydtest-0.20.0.0: A modern testing framework for Haskell with good defaults and advanced testing features.
Safe HaskellNone
LanguageHaskell2010

Test.Syd.Def.AroundAll

Description

This module defines all the functions you will use to define your test suite.

Synopsis

Documentation

beforeAll_ Source #

Arguments

:: forall (outers :: [Type]) inner result. IO ()

The function to run (once), beforehand.

-> TestDefM outers inner result 
-> TestDefM outers inner result 

Run a custom action before all spec items in a group without setting up any outer resources.

beforeAll Source #

Arguments

:: forall outer (otherOuters :: [Type]) inner result. IO outer

The function to run (once), beforehand, to produce the outer resource.

-> TestDefM (outer ': otherOuters) inner result 
-> TestDefM otherOuters inner result 

Run a custom action before all spec items in a group, to set up an outer resource a.

beforeAllWith Source #

Arguments

:: forall previousOuter newOuter (otherOuters :: [Type]) inner result. (previousOuter -> IO newOuter)

The function to run (once), beforehand, to produce a new outer resource while using a previous outer resource

-> TestDefM (newOuter ': (previousOuter ': otherOuters)) inner result 
-> TestDefM (previousOuter ': otherOuters) inner result 

Run a custom action before all spec items in a group, to set up an outer resource b by using the outer resource a.

afterAll_ Source #

Arguments

:: forall (outers :: [Type]) inner result. IO ()

The function to run (once), afterwards.

-> TestDefM outers inner result 
-> TestDefM outers inner result 

Run a custom action after all spec items without using any outer resources.

afterAll Source #

Arguments

:: forall outer (otherOuters :: [Type]) inner result. (outer -> IO ())

The function to run (once), afterwards, using the outer resource.

-> TestDefM (outer ': otherOuters) inner result 
-> TestDefM (outer ': otherOuters) inner result 

Run a custom action after all spec items, using the outer resource a.

afterAll' Source #

Arguments

:: forall (outers :: [Type]) inner result. (HList outers -> IO ())

The function to run (once), afterwards, using all outer resources.

-> TestDefM outers inner result 
-> TestDefM outers inner result 

Run a custom action after all spec items, using all the outer resources.

aroundAll_ Source #

Arguments

:: forall (outers :: [Type]) inner result. (IO () -> IO ())

The function that wraps running the tests.

-> TestDefM outers inner result 
-> TestDefM outers inner result 

Run a custom action before and/or after all spec items in a group without accessing any resources.

FOOTGUN

Expand

This combinator gives the programmer a lot of power. In fact, it gives the programmer enough power to break the test framework. Indeed, you can provide a wrapper function that just _doesn't_ run the function like this:

spec :: Spec
spec = do
   let don'tDo :: IO () -> IO ()
       don'tDo _ = pure ()
   aroundAll_ don'tDo $ do
     it "should pass" True

During execution, you'll then get an error like this:

thread blocked indefinitely in an MVar operation

The same problem exists when using around_.

Something even more pernicious goes wrong when you run the given action more than once like this:

spec :: Spec
spec = do
   let doTwice :: IO () -> IO ()
       doTwice f = f >> f
   aroundAll_ doTwice $ do
     it "should pass" True

In this case, the test will "just work", but it will be executed twice even if the output reports that it only passed once.

Note: If you're interested in fixing this, talk to me, but only after GHC has gotten impredicative types because that will likely be a requirement.

aroundAll Source #

Arguments

:: forall outer (otherOuters :: [Type]) inner result. ((outer -> IO ()) -> IO ())

The function that provides the outer resource (once), around the tests.

-> TestDefM (outer ': otherOuters) inner result 
-> TestDefM otherOuters inner result 

Run a custom action before and/or after all spec items in group, to provide access to a resource a.

See the FOOTGUN note in the docs for around_.

aroundAllWith Source #

Arguments

:: forall newOuter oldOuter (otherOuters :: [Type]) inner result. ((newOuter -> IO ()) -> oldOuter -> IO ())

The function that provides the new outer resource (once), using the old outer resource.

-> TestDefM (newOuter ': (oldOuter ': otherOuters)) inner result 
-> TestDefM (oldOuter ': otherOuters) inner result 

Run a custom action before and/or after all spec items in a group to provide access to a resource a while using a resource b

See the FOOTGUN note in the docs for around_.

wrapForest Source #

Arguments

:: forall (outers1 :: [Type]) inner1 (outers2 :: [Type]) inner2 result. (TestForest outers1 inner1 -> TestTree outers2 inner2)

The wrapper node

-> TestDefM outers1 inner1 result 
-> TestDefM outers2 inner2 result 

Declare a node in the spec def forest