Safe Haskell | None |
---|---|
Language | Haskell2010 |
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
:: 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
.
:: 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.
:: (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
.
:: (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
.
:: (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.
:: 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.
:: ((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_
.
:: (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" 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.
:: 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_
.