| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Test.Syd.Def.AroundAll
Description
This module defines all the functions you will use to define your test suite.
Synopsis
- beforeAll :: IO outer -> TestDefM (outer ': otherOuters) inner result -> TestDefM otherOuters inner result
- beforeAll_ :: IO () -> TestDefM outers inner result -> TestDefM outers inner result
- beforeAllWith :: (previousOuter -> IO newOuter) -> TestDefM (newOuter ': (previousOuter ': otherOuters)) inner result -> TestDefM (previousOuter ': otherOuters) inner result
- afterAll :: (outer -> IO ()) -> TestDefM (outer ': otherOuters) inner result -> TestDefM (outer ': otherOuters) inner result
- afterAll' :: (HList outers -> IO ()) -> TestDefM outers inner result -> TestDefM outers inner result
- afterAll_ :: IO () -> TestDefM outers inner result -> TestDefM outers inner result
- aroundAll :: ((outer -> IO ()) -> IO ()) -> TestDefM (outer ': otherOuters) inner result -> TestDefM otherOuters inner result
- aroundAll_ :: (IO () -> IO ()) -> TestDefM outers inner result -> TestDefM outers inner result
- aroundAllWith :: forall newOuter oldOuter otherOuters inner result. ((newOuter -> IO ()) -> oldOuter -> IO ()) -> TestDefM (newOuter ': (oldOuter ': otherOuters)) inner result -> TestDefM (oldOuter ': otherOuters) inner result
- wrapRWST :: (TestForest outers1 inner1 -> TestTree outers2 inner2) -> TestDefM outers1 inner1 result -> TestDefM outers2 inner2 result
Documentation
Arguments
| :: 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.
Arguments
| :: 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.
Arguments
| :: (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.
Arguments
| :: (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.
Arguments
| :: (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.
Arguments
| :: 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.
Arguments
| :: ((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_.
Arguments
| :: (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
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" TrueDuring 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" TrueIn 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.
Arguments
| :: forall newOuter oldOuter otherOuters 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_.