| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Test.Syd.Def.Around
Synopsis
- before :: IO c -> TestDefM a c e -> TestDefM a () e
- before_ :: IO () -> TestDefM a c e -> TestDefM a c e
- after :: (c -> IO ()) -> TestDefM a c e -> TestDefM a c e
- after_ :: IO () -> TestDefM a c e -> TestDefM a c e
- around :: ((c -> IO ()) -> IO ()) -> TestDefM a c e -> TestDefM a () e
- around_ :: (IO () -> IO ()) -> TestDefM a c e -> TestDefM a c e
- aroundWith :: forall a c d r. ((c -> IO ()) -> d -> IO ()) -> TestDefM a c r -> TestDefM a d r
- aroundWith' :: forall a c d r (u :: [Type]). HContains u a => ((a -> c -> IO ()) -> a -> d -> IO ()) -> TestDefM u c r -> TestDefM u d r
Documentation
before :: IO c -> TestDefM a c e -> TestDefM a () e Source #
Run a custom action before every spec item, to set up an inner resource c.
before_ :: IO () -> TestDefM a c e -> TestDefM a c e Source #
Run a custom action before every spec item without setting up any inner resources.
after :: (c -> IO ()) -> TestDefM a c e -> TestDefM a c e Source #
Run a custom action after every spec item, using the inner resource c.
after_ :: IO () -> TestDefM a c e -> TestDefM a c e Source #
Run a custom action after every spec item without using any inner resources.
around :: ((c -> IO ()) -> IO ()) -> TestDefM a c e -> TestDefM a () e Source #
Run a custom action before and/or after every spec item, to provide access to an inner resource c.
See the FOOTGUN note in the docs for around_.
around_ :: (IO () -> IO ()) -> TestDefM a c e -> TestDefM a c e Source #
Run a custom action before and/or after every spec item without accessing any inner resources.
It is important that the wrapper function that you provide runs the action that it gets _exactly once_.
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 ()
around_ 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 aroundAll_.
The same thing will go wrong if you run the given action more than once like this:
spec :: Spec
spec = do
let doTwice :: IO () -> IO ()
doTwice f = f >> f
around_ doTwice $ do
it "should pass" TrueNote: 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.
aroundWith :: forall a c d r. ((c -> IO ()) -> d -> IO ()) -> TestDefM a c r -> TestDefM a d r Source #
Run a custom action before and/or after every spec item, to provide access to an inner resource c while using the inner resource d.
See the FOOTGUN note in the docs for around_.
aroundWith' :: forall a c d r (u :: [Type]). HContains u a => ((a -> c -> IO ()) -> a -> d -> IO ()) -> TestDefM u c r -> TestDefM u d r Source #
Run a custom action before and/or after every spec item, to provide access to an inner resource c while using the inner resource d and any outer resource available.