th-test-utils
This package contains utility functions for testing Template Haskell code.
Currently, this package only exposes a single function, tryQ
(and derivatives),
that allows testing whether a given Template Haskell expression fails.
Usage
-- e.g. $(qConcat ["hello", "world"]) generates "helloworld" at compile time
qConcat :: [String] -> Q Exp
qConcat [] = fail "Cannot concat empty list"
qConcat xs = ...
-- e.g. [numberify| one |] generates `1` at compile time
numberify :: QuasiQuoter
numberify = ...
-- example using tasty-hunit
main :: IO ()
main = defaultMain $ testGroup "my-project"
[ testCase "qConcat 1" $
$(tryQ $ qConcat ["hello", "world"]) @?= (Right "helloworld" :: Either String String)
, testCase "qConcat 2" $
$(tryQ $ qConcat []) @?= (Left "Cannot concat empty list" :: Either String String)
, testCase "numberify 1" $
$(tryQ $ quoteExp numberify "one") @?= (Right 1 :: Either String Int)
, testCase "numberify 2" $
$(tryQ $ quoteExp numberify "foo") @?= (Left "not a number" :: Either String Int)
-- can also return error message as `Maybe String` or `String` (which errors
-- if the function doesn't error)
, testCase "numberify 3" $
$(tryQErr $ quoteExp numberify "foo") @?= Just "not a number"
, testCase "numberify 4" $
$(tryQErr' $ quoteExp numberify "foo") @?= "not a number"
]