hspec-parsec-0: src/Test/Hspec/Parsec.hs
-- | Utility functions for testing Parsec parsers with Hspec.
module Test.Hspec.Parsec
( shouldParse
, shouldFailOn
) where
import GHC.Stack (HasCallStack)
import Text.Parsec
import Test.Hspec.Expectations
-- | Create an expectation by saying what the result should be.
--
-- @
-- 'parse' 'letter' "" "x" ``shouldParse`` \'x\'
-- @
shouldParse
:: (HasCallStack, Show a, Eq a)
=> Either ParseError a -- ^ Result of parsing as returned by function like 'parse'
-> a -- ^ Desired result
-> Expectation
r `shouldParse` v = case r of
Left e -> expectationFailure $ "expected: " ++ show v ++
"\nbut parsing failed with error:\n" ++ show e
Right x -> x `shouldBe` v
-- | Check that a parser fails on a given input.
--
-- @
-- 'parse' ('char' \'x\') "" ``shouldFailOn`` "a"
-- @
shouldFailOn
:: (HasCallStack, Show a)
=> (s -> Either ParseError a)
-- ^ Parser that takes stream and produces result or error message
-> s -- ^ Input that the parser should fail on
-> Expectation
p `shouldFailOn` s = case p s of
Left _ -> return ()
Right v -> expectationFailure $
"the parser is expected to fail, but it parsed: " ++ show v