module Test.Parser (tests) where
import Control.Monad (when)
import Base.CompilerError
import Base.TrackedErrors
import Parser.Common
import Parser.TextParser
import Test.Common
tests :: [IO (TrackedErrors ())]
tests :: [IO (TrackedErrors ())]
tests = [
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\'" Char
'\'',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\\"" Char
'"',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\?" Char
'?',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\\\" Char
'\\',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\a" Char
'\a',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\b" Char
'\b',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\f" Char
'\f',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\n" Char
'\n',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\r" Char
'\r',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\t" Char
'\t',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\v" Char
'\v',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\n" Char
'\n',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\x0A" Char
'\n',
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser Char
stringChar String
"\\012" Char
'\n',
forall a. Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail TextParser Char
stringChar String
"\"",
forall a. Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail TextParser Char
stringChar String
"\\q",
forall a. Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail TextParser Char
stringChar String
"\\00",
forall a. Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail TextParser Char
stringChar String
"\\x0",
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser String
regexChar String
"\\\\" String
"\\\\",
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser String
regexChar String
"\\n" String
"\\n",
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser String
regexChar String
"\n" String
"\n",
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser String
regexChar String
"\\\"" String
"\"",
forall a. Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail TextParser String
regexChar String
"\"",
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs (String -> TextParser ()
keyword String
"keyword" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
asciiChar) String
"keyword string" String
"string",
forall a. Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail (String -> TextParser ()
keyword String
"keyword" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
asciiChar) String
"keywordstring",
forall a. Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail (String -> TextParser ()
keyword String
"keyword" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
asciiChar) String
"keyword_string",
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs
((forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String -> TextParser ()
keyword String
"keyword" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
asciiChar) forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
some forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
asciiChar))
String
"keywordstring"
(forall a b. b -> Either a b
Right String
"keywordstring"),
forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs (String -> TextParser String
operator String
">>??!" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
asciiChar) String
">>??! !!" String
"!!",
forall a. Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail (String -> TextParser String
operator String
">>??!" forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
asciiChar) String
">>??!!!"
]
checkParsesAs :: (Eq a, Show a) => TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs :: forall a.
(Eq a, Show a) =>
TextParser a -> String -> a -> IO (TrackedErrors ())
checkParsesAs TextParser a
p String
s a
m = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ do
let parsed :: TrackedErrors a
parsed = forall a. TextParser a -> String -> String -> TrackedErrors a
readSingleWith TextParser a
p String
"(string)" String
s
forall {m :: * -> *} {a}.
ErrorContextM m =>
TrackedErrorsT Identity a -> m ()
check TrackedErrors a
parsed
a
e <- TrackedErrors a
parsed
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (a
e forall a. Eq a => a -> a -> Bool
/= a
m) forall a b. (a -> b) -> a -> b
$
forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show String
s forall a. [a] -> [a] -> [a]
++ String
" does not parse as " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show a
m forall a. [a] -> [a] -> [a]
++ String
":\n" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show a
e
where
check :: TrackedErrorsT Identity a -> m ()
check TrackedErrorsT Identity a
c
| forall (t :: (* -> *) -> * -> *) a.
(ErrorContextT t, ErrorContextM (t Identity)) =>
t Identity a -> Bool
isCompilerError TrackedErrorsT Identity a
c = forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM forall a b. (a -> b) -> a -> b
$ String
"Parse '" forall a. [a] -> [a] -> [a]
++ String
s forall a. [a] -> [a] -> [a]
++ String
"':\n" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall a. TrackedErrors a -> CompilerMessage
getCompilerError TrackedErrorsT Identity a
c)
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return ()
checkParseFail :: Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail :: forall a. Show a => TextParser a -> String -> IO (TrackedErrors ())
checkParseFail TextParser a
p String
s = do
let parsed :: TrackedErrors a
parsed = forall a. TextParser a -> String -> String -> TrackedErrors a
readSingleWith TextParser a
p String
"(string)" String
s
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall {m :: * -> *} {a}.
(ErrorContextM m, Show a) =>
TrackedErrorsT Identity a -> m ()
check TrackedErrors a
parsed
where
check :: TrackedErrorsT Identity a -> m ()
check TrackedErrorsT Identity a
c
| forall (t :: (* -> *) -> * -> *) a.
(ErrorContextT t, ErrorContextM (t Identity)) =>
t Identity a -> Bool
isCompilerError TrackedErrorsT Identity a
c = forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM forall a b. (a -> b) -> a -> b
$ String
"Parse '" forall a. [a] -> [a] -> [a]
++ String
s forall a. [a] -> [a] -> [a]
++ String
"': Expected failure but got\n" forall a. [a] -> [a] -> [a]
++
forall a. Show a => a -> String
show (forall a. TrackedErrors a -> a
getCompilerSuccess TrackedErrorsT Identity a
c) forall a. [a] -> [a] -> [a]
++ String
"\n"