{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Hledger.Utils.Test (
module Test.Tasty
,module Test.Tasty.HUnit
,assertLeft
,assertRight
,assertParse
,assertParseEq
,assertParseEqOn
,assertParseError
,assertParseE
,assertParseEqE
,assertParseErrorE
,assertParseStateOn
)
where
import Control.Monad.Except (ExceptT(..), liftEither, runExceptT, withExceptT, unless)
import Control.Monad.State.Strict (StateT, evalStateT, execStateT)
import Data.Default (Default(..))
import Data.List (isInfixOf)
import qualified Data.Text as T
import Test.Tasty hiding (defaultMain)
import Test.Tasty.HUnit
import Text.Megaparsec
import Text.Megaparsec.Custom
( HledgerParseErrorData,
FinalParseError,
attachSource,
customErrorBundlePretty,
finalErrorBundlePretty,
)
import Hledger.Utils.Debug (pshow)
assertLeft :: (HasCallStack, Eq b, Show b) => Either a b -> Assertion
assertLeft :: Either a b -> Assertion
assertLeft (Left a
_) = () -> Assertion
forall (m :: * -> *) a. Monad m => a -> m a
return ()
assertLeft (Right b
b) = String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (String -> Assertion) -> String -> Assertion
forall a b. (a -> b) -> a -> b
$ String
"expected Left, got (Right " String -> String -> String
forall a. [a] -> [a] -> [a]
++ b -> String
forall a. Show a => a -> String
show b
b String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
assertRight :: (HasCallStack, Eq a, Show a) => Either a b -> Assertion
assertRight :: Either a b -> Assertion
assertRight (Right b
_) = () -> Assertion
forall (m :: * -> *) a. Monad m => a -> m a
return ()
assertRight (Left a
a) = String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (String -> Assertion) -> String -> Assertion
forall a b. (a -> b) -> a -> b
$ String
"expected Right, got (Left " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")"
parseHelper :: (HasCallStack, Default st, Monad m) =>
StateT st (ParsecT HledgerParseErrorData T.Text m) a -> T.Text -> ExceptT String m a
parseHelper :: StateT st (ParsecT HledgerParseErrorData Text m) a
-> Text -> ExceptT String m a
parseHelper StateT st (ParsecT HledgerParseErrorData Text m) a
parser Text
input =
(HledgerParseErrors -> String)
-> ExceptT HledgerParseErrors m a -> ExceptT String m a
forall (m :: * -> *) e e' a.
Functor m =>
(e -> e') -> ExceptT e m a -> ExceptT e' m a
withExceptT (\HledgerParseErrors
e -> String
"\nparse error at " String -> String -> String
forall a. [a] -> [a] -> [a]
++ HledgerParseErrors -> String
customErrorBundlePretty HledgerParseErrors
e String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n") (ExceptT HledgerParseErrors m a -> ExceptT String m a)
-> (m (Either HledgerParseErrors a)
-> ExceptT HledgerParseErrors m a)
-> m (Either HledgerParseErrors a)
-> ExceptT String m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m (Either HledgerParseErrors a) -> ExceptT HledgerParseErrors m a
forall e (m :: * -> *) a. m (Either e a) -> ExceptT e m a
ExceptT
(m (Either HledgerParseErrors a) -> ExceptT String m a)
-> m (Either HledgerParseErrors a) -> ExceptT String m a
forall a b. (a -> b) -> a -> b
$ ParsecT HledgerParseErrorData Text m a
-> String -> Text -> m (Either HledgerParseErrors a)
forall (m :: * -> *) e s a.
Monad m =>
ParsecT e s m a
-> String -> s -> m (Either (ParseErrorBundle s e) a)
runParserT (StateT st (ParsecT HledgerParseErrorData Text m) a
-> st -> ParsecT HledgerParseErrorData Text m a
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (StateT st (ParsecT HledgerParseErrorData Text m) a
parser StateT st (ParsecT HledgerParseErrorData Text m) a
-> StateT st (ParsecT HledgerParseErrorData Text m) ()
-> StateT st (ParsecT HledgerParseErrorData Text m) a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* StateT st (ParsecT HledgerParseErrorData Text m) ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof) st
forall a. Default a => a
def) String
"" Text
input
assertParseHelper :: (HasCallStack, Default st) =>
(String -> Assertion) -> (a -> Assertion)
-> StateT st (ParsecT HledgerParseErrorData T.Text IO) a -> T.Text
-> Assertion
assertParseHelper :: (String -> Assertion)
-> (a -> Assertion)
-> StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text
-> Assertion
assertParseHelper String -> Assertion
onFailure a -> Assertion
onSuccess StateT st (ParsecT HledgerParseErrorData Text IO) a
parser Text
input =
(String -> Assertion)
-> (a -> Assertion) -> Either String a -> Assertion
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Assertion
onFailure a -> Assertion
onSuccess (Either String a -> Assertion) -> IO (Either String a) -> Assertion
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ExceptT String IO a -> IO (Either String a)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text -> ExceptT String IO a
forall st (m :: * -> *) a.
(HasCallStack, Default st, Monad m) =>
StateT st (ParsecT HledgerParseErrorData Text m) a
-> Text -> ExceptT String m a
parseHelper StateT st (ParsecT HledgerParseErrorData Text IO) a
parser Text
input)
assertParse :: (HasCallStack, Default st) =>
StateT st (ParsecT HledgerParseErrorData T.Text IO) a -> T.Text -> Assertion
assertParse :: StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text -> Assertion
assertParse = (String -> Assertion)
-> (a -> Assertion)
-> StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text
-> Assertion
forall st a.
(HasCallStack, Default st) =>
(String -> Assertion)
-> (a -> Assertion)
-> StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text
-> Assertion
assertParseHelper String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (Assertion -> a -> Assertion
forall a b. a -> b -> a
const (Assertion -> a -> Assertion) -> Assertion -> a -> Assertion
forall a b. (a -> b) -> a -> b
$ () -> Assertion
forall (m :: * -> *) a. Monad m => a -> m a
return ())
assertParseEq :: (HasCallStack, Eq a, Show a, Default st) =>
StateT st (ParsecT HledgerParseErrorData T.Text IO) a -> T.Text -> a -> Assertion
assertParseEq :: StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text -> a -> Assertion
assertParseEq StateT st (ParsecT HledgerParseErrorData Text IO) a
parser Text
input = StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text -> (a -> a) -> a -> Assertion
forall b st a.
(HasCallStack, Eq b, Show b, Default st) =>
StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text -> (a -> b) -> b -> Assertion
assertParseEqOn StateT st (ParsecT HledgerParseErrorData Text IO) a
parser Text
input a -> a
forall a. a -> a
id
assertParseEqOn :: (HasCallStack, Eq b, Show b, Default st) =>
StateT st (ParsecT HledgerParseErrorData T.Text IO) a -> T.Text -> (a -> b) -> b -> Assertion
assertParseEqOn :: StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text -> (a -> b) -> b -> Assertion
assertParseEqOn StateT st (ParsecT HledgerParseErrorData Text IO) a
parser Text
input a -> b
f b
expected =
(String -> Assertion)
-> (a -> Assertion)
-> StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text
-> Assertion
forall st a.
(HasCallStack, Default st) =>
(String -> Assertion)
-> (a -> Assertion)
-> StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text
-> Assertion
assertParseHelper String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (String -> b -> b -> Assertion
forall a.
(Eq a, Show a, HasCallStack) =>
String -> a -> a -> Assertion
assertEqual String
"" b
expected (b -> Assertion) -> (a -> b) -> a -> Assertion
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f) StateT st (ParsecT HledgerParseErrorData Text IO) a
parser Text
input
assertParseError :: (HasCallStack, Eq a, Show a, Default st) =>
StateT st (ParsecT HledgerParseErrorData T.Text IO) a -> T.Text -> String -> Assertion
assertParseError :: StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text -> String -> Assertion
assertParseError StateT st (ParsecT HledgerParseErrorData Text IO) a
parser Text
input String
errstr = (String -> Assertion)
-> (a -> Assertion)
-> StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text
-> Assertion
forall st a.
(HasCallStack, Default st) =>
(String -> Assertion)
-> (a -> Assertion)
-> StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text
-> Assertion
assertParseHelper
(\String
e -> Bool -> Assertion -> Assertion
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (String
errstr String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isInfixOf` String
e) (Assertion -> Assertion) -> Assertion -> Assertion
forall a b. (a -> b) -> a -> b
$ String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (String -> Assertion) -> String -> Assertion
forall a b. (a -> b) -> a -> b
$ String
"\nparse error is not as expected:" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
e)
(\a
v -> String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (String -> Assertion) -> String -> Assertion
forall a b. (a -> b) -> a -> b
$ String
"\nparse succeeded unexpectedly, producing:\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
pshow a
v String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n")
StateT st (ParsecT HledgerParseErrorData Text IO) a
parser Text
input
assertParseStateOn :: (HasCallStack, Eq b, Show b, Default st) =>
StateT st (ParsecT HledgerParseErrorData T.Text IO) a -> T.Text -> (st -> b) -> b -> Assertion
assertParseStateOn :: StateT st (ParsecT HledgerParseErrorData Text IO) a
-> Text -> (st -> b) -> b -> Assertion
assertParseStateOn StateT st (ParsecT HledgerParseErrorData Text IO) a
parser Text
input st -> b
f b
expected = do
Either HledgerParseErrors st
es <- ParsecT HledgerParseErrorData Text IO st
-> String -> Text -> IO (Either HledgerParseErrors st)
forall (m :: * -> *) e s a.
Monad m =>
ParsecT e s m a
-> String -> s -> m (Either (ParseErrorBundle s e) a)
runParserT (StateT st (ParsecT HledgerParseErrorData Text IO) a
-> st -> ParsecT HledgerParseErrorData Text IO st
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m s
execStateT (StateT st (ParsecT HledgerParseErrorData Text IO) a
parser StateT st (ParsecT HledgerParseErrorData Text IO) a
-> StateT st (ParsecT HledgerParseErrorData Text IO) ()
-> StateT st (ParsecT HledgerParseErrorData Text IO) a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* StateT st (ParsecT HledgerParseErrorData Text IO) ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof) st
forall a. Default a => a
def) String
"" Text
input
case Either HledgerParseErrors st
es of
Left HledgerParseErrors
err -> String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (String -> Assertion) -> String -> Assertion
forall a b. (a -> b) -> a -> b
$ (String -> String -> String
forall a. [a] -> [a] -> [a]
++String
"\n") (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String
"\nparse error at "String -> String -> String
forall a. [a] -> [a] -> [a]
++) (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ HledgerParseErrors -> String
customErrorBundlePretty HledgerParseErrors
err
Right st
s -> String -> b -> b -> Assertion
forall a.
(Eq a, Show a, HasCallStack) =>
String -> a -> a -> Assertion
assertEqual String
"" b
expected (b -> Assertion) -> b -> Assertion
forall a b. (a -> b) -> a -> b
$ st -> b
f st
s
parseHelperE :: (HasCallStack, Default st, Monad m) =>
StateT st (ParsecT HledgerParseErrorData T.Text (ExceptT FinalParseError m)) a -> T.Text -> ExceptT String m a
parseHelperE :: StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
-> Text -> ExceptT String m a
parseHelperE StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
parser Text
input = do
(HledgerParseErrors -> String)
-> ExceptT HledgerParseErrors m a -> ExceptT String m a
forall (m :: * -> *) e e' a.
Functor m =>
(e -> e') -> ExceptT e m a -> ExceptT e' m a
withExceptT (\HledgerParseErrors
e -> String
"\nparse error at " String -> String -> String
forall a. [a] -> [a] -> [a]
++ HledgerParseErrors -> String
customErrorBundlePretty HledgerParseErrors
e String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n") (ExceptT HledgerParseErrors m a -> ExceptT String m a)
-> (Either HledgerParseErrors a -> ExceptT HledgerParseErrors m a)
-> Either HledgerParseErrors a
-> ExceptT String m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either HledgerParseErrors a -> ExceptT HledgerParseErrors m a
forall e (m :: * -> *) a. MonadError e m => Either e a -> m a
liftEither
(Either HledgerParseErrors a -> ExceptT String m a)
-> ExceptT String m (Either HledgerParseErrors a)
-> ExceptT String m a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (FinalParseError -> String)
-> ExceptT FinalParseError m (Either HledgerParseErrors a)
-> ExceptT String m (Either HledgerParseErrors a)
forall (m :: * -> *) e e' a.
Functor m =>
(e -> e') -> ExceptT e m a -> ExceptT e' m a
withExceptT (\FinalParseError
e -> String
"parse error at " String -> String -> String
forall a. [a] -> [a] -> [a]
++ FinalParseErrorBundle' HledgerParseErrorData -> String
finalErrorBundlePretty (String
-> Text
-> FinalParseError
-> FinalParseErrorBundle' HledgerParseErrorData
forall e.
String -> Text -> FinalParseError' e -> FinalParseErrorBundle' e
attachSource String
"" Text
input FinalParseError
e))
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m) a
-> String
-> Text
-> ExceptT FinalParseError m (Either HledgerParseErrors a)
forall (m :: * -> *) e s a.
Monad m =>
ParsecT e s m a
-> String -> s -> m (Either (ParseErrorBundle s e) a)
runParserT (StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
-> st
-> ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m) a
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
parser StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
()
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof) st
forall a. Default a => a
def) String
"" Text
input)
assertParseHelperE :: (HasCallStack, Default st) =>
(String -> Assertion) -> (a -> Assertion)
-> StateT st (ParsecT HledgerParseErrorData T.Text (ExceptT FinalParseError IO)) a -> T.Text
-> Assertion
assertParseHelperE :: (String -> Assertion)
-> (a -> Assertion)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text
-> Assertion
assertParseHelperE String -> Assertion
onFailure a -> Assertion
onSuccess StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
parser Text
input =
(String -> Assertion)
-> (a -> Assertion) -> Either String a -> Assertion
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Assertion
onFailure a -> Assertion
onSuccess (Either String a -> Assertion) -> IO (Either String a) -> Assertion
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ExceptT String IO a -> IO (Either String a)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text -> ExceptT String IO a
forall st (m :: * -> *) a.
(HasCallStack, Default st, Monad m) =>
StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
-> Text -> ExceptT String m a
parseHelperE StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
parser Text
input)
assertParseE
:: (HasCallStack, Eq a, Show a, Default st)
=> StateT st (ParsecT HledgerParseErrorData T.Text (ExceptT FinalParseError IO)) a -> T.Text -> Assertion
assertParseE :: StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text -> Assertion
assertParseE = (String -> Assertion)
-> (a -> Assertion)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text
-> Assertion
forall st a.
(HasCallStack, Default st) =>
(String -> Assertion)
-> (a -> Assertion)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text
-> Assertion
assertParseHelperE String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (Assertion -> a -> Assertion
forall a b. a -> b -> a
const (Assertion -> a -> Assertion) -> Assertion -> a -> Assertion
forall a b. (a -> b) -> a -> b
$ () -> Assertion
forall (m :: * -> *) a. Monad m => a -> m a
return ())
assertParseEqE
:: (Default st, Eq a, Show a, HasCallStack)
=> StateT st (ParsecT HledgerParseErrorData T.Text (ExceptT FinalParseError IO)) a -> T.Text -> a -> Assertion
assertParseEqE :: StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text -> a -> Assertion
assertParseEqE StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
parser Text
input = StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text -> (a -> a) -> a -> Assertion
forall b st a.
(HasCallStack, Eq b, Show b, Default st) =>
StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text -> (a -> b) -> b -> Assertion
assertParseEqOnE StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
parser Text
input a -> a
forall a. a -> a
id
assertParseEqOnE
:: (HasCallStack, Eq b, Show b, Default st)
=> StateT st (ParsecT HledgerParseErrorData T.Text (ExceptT FinalParseError IO)) a -> T.Text -> (a -> b) -> b -> Assertion
assertParseEqOnE :: StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text -> (a -> b) -> b -> Assertion
assertParseEqOnE StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
parser Text
input a -> b
f b
expected =
(String -> Assertion)
-> (a -> Assertion)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text
-> Assertion
forall st a.
(HasCallStack, Default st) =>
(String -> Assertion)
-> (a -> Assertion)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text
-> Assertion
assertParseHelperE String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (String -> b -> b -> Assertion
forall a.
(Eq a, Show a, HasCallStack) =>
String -> a -> a -> Assertion
assertEqual String
"" b
expected (b -> Assertion) -> (a -> b) -> a -> Assertion
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f) StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
parser Text
input
assertParseErrorE
:: (Default st, Eq a, Show a, HasCallStack)
=> StateT st (ParsecT HledgerParseErrorData T.Text (ExceptT FinalParseError IO)) a -> T.Text -> String -> Assertion
assertParseErrorE :: StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text -> String -> Assertion
assertParseErrorE StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
parser Text
input String
errstr = (String -> Assertion)
-> (a -> Assertion)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text
-> Assertion
forall st a.
(HasCallStack, Default st) =>
(String -> Assertion)
-> (a -> Assertion)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
-> Text
-> Assertion
assertParseHelperE
(\String
e -> Bool -> Assertion -> Assertion
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (String
errstr String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isInfixOf` String
e) (Assertion -> Assertion) -> Assertion -> Assertion
forall a b. (a -> b) -> a -> b
$ String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (String -> Assertion) -> String -> Assertion
forall a b. (a -> b) -> a -> b
$ String
"\nparse error is not as expected:" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
e)
(\a
v -> String -> Assertion
forall a. HasCallStack => String -> IO a
assertFailure (String -> Assertion) -> String -> Assertion
forall a b. (a -> b) -> a -> b
$ String
"\nparse succeeded unexpectedly, producing:\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
pshow a
v String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n")
StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError IO))
a
parser Text
input