hledger/hledger-lib/Hledger/Utils/Test.hs

49 lines
2.1 KiB
Haskell
Raw Normal View History

2015-08-19 23:47:26 +03:00
module Hledger.Utils.Test where
2018-08-04 18:34:42 +03:00
import Data.Functor.Identity
2015-08-19 23:47:26 +03:00
import Test.HUnit
import Text.Megaparsec
2015-08-19 23:47:26 +03:00
-- | Get a Test's label, or the empty string.
testName :: Test -> String
testName (TestLabel n _) = n
testName _ = ""
-- | Flatten a Test containing TestLists into a list of single tests.
flattenTests :: Test -> [Test]
flattenTests (TestLabel _ t@(TestList _)) = flattenTests t
flattenTests (TestList ts) = concatMap flattenTests ts
flattenTests t = [t]
-- | Filter TestLists in a Test, recursively, preserving the structure.
filterTests :: (Test -> Bool) -> Test -> Test
filterTests p (TestLabel l ts) = TestLabel l (filterTests p ts)
filterTests p (TestList ts) = TestList $ filter (any p . flattenTests) $ map (filterTests p) ts
filterTests _ t = t
-- | Simple way to assert something is some expected value, with no label.
is :: (Eq a, Show a) => a -> a -> Assertion
2018-08-04 18:34:42 +03:00
a `is` e = assertEqual "" e a -- XXX should it have a message ?
2015-08-19 23:47:26 +03:00
-- | Assert a parse result is successful, printing the parse error on failure.
assertParse :: (Show t, Show e) => (Either (ParseError t e) a) -> Assertion
2015-08-19 23:47:26 +03:00
assertParse parse = either (assertFailure.show) (const (return ())) parse
2015-08-19 23:47:26 +03:00
-- | Assert a parse result is successful, printing the parse error on failure.
assertParseFailure :: (Either (ParseError t e) a) -> Assertion
2015-08-19 23:47:26 +03:00
assertParseFailure parse = either (const $ return ()) (const $ assertFailure "parse should not have succeeded") parse
-- | Assert a parse result is some expected value, printing the parse error on failure.
assertParseEqual :: (Show a, Eq a, Show t, Show e) => (Either (ParseError t e) a) -> a -> Assertion
2015-08-19 23:47:26 +03:00
assertParseEqual parse expected = either (assertFailure.show) (`is` expected) parse
2018-08-04 18:34:42 +03:00
-- | Assert that the parse result returned from an identity monad is some expected value,
-- printing the parse error on failure.
assertParseEqual' :: (Show a, Eq a, Show t, Show e) => Identity (Either (ParseError t e) a) -> a -> Assertion
assertParseEqual' parse expected = either (assertFailure.show) (`is` expected) (runIdentity parse)
2015-08-19 23:47:26 +03:00
printParseError :: (Show a) => a -> IO ()
printParseError e = do putStr "parse error at "; print e