{-# LANGUAGE Safe #-}
module Test.Parser (tests) where
import Control.Monad (when)
import Base.CompileError
import Base.CompileInfo
import Parser.Common
import Test.Common
tests :: [IO (CompileInfo ())]
tests :: [IO (CompileInfo ())]
tests = [
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\'" Char
'\'',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\\"" Char
'"',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\?" Char
'?',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\\\" Char
'\\',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\a" Char
'\a',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\b" Char
'\b',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\f" Char
'\f',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\n" Char
'\n',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\r" Char
'\r',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\t" Char
'\t',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\v" Char
'\v',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\n" Char
'\n',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\x0A" Char
'\n',
ParserE CompileInfo Char -> [Char] -> Char -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\012" Char
'\n',
ParserE CompileInfo Char -> [Char] -> IO (CompileInfo ())
forall a.
Show a =>
ParserE CompileInfo a -> [Char] -> IO (CompileInfo ())
checkParseFail ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\"",
ParserE CompileInfo Char -> [Char] -> IO (CompileInfo ())
forall a.
Show a =>
ParserE CompileInfo a -> [Char] -> IO (CompileInfo ())
checkParseFail ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\q",
ParserE CompileInfo Char -> [Char] -> IO (CompileInfo ())
forall a.
Show a =>
ParserE CompileInfo a -> [Char] -> IO (CompileInfo ())
checkParseFail ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\00",
ParserE CompileInfo Char -> [Char] -> IO (CompileInfo ())
forall a.
Show a =>
ParserE CompileInfo a -> [Char] -> IO (CompileInfo ())
checkParseFail ParserE CompileInfo Char
forall (m :: * -> *). Monad m => ParserE m Char
stringChar [Char]
"\\x0",
ParserE CompileInfo [Char]
-> [Char] -> [Char] -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo [Char]
forall (m :: * -> *). Monad m => ParserE m [Char]
regexChar [Char]
"\\\\" [Char]
"\\\\",
ParserE CompileInfo [Char]
-> [Char] -> [Char] -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo [Char]
forall (m :: * -> *). Monad m => ParserE m [Char]
regexChar [Char]
"\\n" [Char]
"\\n",
ParserE CompileInfo [Char]
-> [Char] -> [Char] -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo [Char]
forall (m :: * -> *). Monad m => ParserE m [Char]
regexChar [Char]
"\n" [Char]
"\n",
ParserE CompileInfo [Char]
-> [Char] -> [Char] -> IO (CompileInfo ())
forall a.
(Eq a, Show a) =>
ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo [Char]
forall (m :: * -> *). Monad m => ParserE m [Char]
regexChar [Char]
"\\\"" [Char]
"\"",
ParserE CompileInfo [Char] -> [Char] -> IO (CompileInfo ())
forall a.
Show a =>
ParserE CompileInfo a -> [Char] -> IO (CompileInfo ())
checkParseFail ParserE CompileInfo [Char]
forall (m :: * -> *). Monad m => ParserE m [Char]
regexChar [Char]
"\""
]
checkParsesAs :: (Eq a, Show a) => ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs :: ParserE CompileInfo a -> [Char] -> a -> IO (CompileInfo ())
checkParsesAs ParserE CompileInfo a
p [Char]
s a
m = CompileInfo () -> IO (CompileInfo ())
forall (m :: * -> *) a. Monad m => a -> m a
return (CompileInfo () -> IO (CompileInfo ()))
-> CompileInfo () -> IO (CompileInfo ())
forall a b. (a -> b) -> a -> b
$ do
let parsed :: CompileInfo a
parsed = ParserE CompileInfo a -> [Char] -> [Char] -> CompileInfo a
forall a.
ParserE CompileInfo a -> [Char] -> [Char] -> CompileInfo a
readSingleWith ParserE CompileInfo a
p [Char]
"(string)" [Char]
s
CompileInfo a -> CompileInfo ()
forall (m :: * -> *) a. CompileErrorM m => CompileInfo a -> m ()
check CompileInfo a
parsed
a
e <- CompileInfo a
parsed
Bool -> CompileInfo () -> CompileInfo ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (a
e a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
m) (CompileInfo () -> CompileInfo ())
-> CompileInfo () -> CompileInfo ()
forall a b. (a -> b) -> a -> b
$
[Char] -> CompileInfo ()
forall (m :: * -> *) a. CompileErrorM m => [Char] -> m a
compileErrorM ([Char] -> CompileInfo ()) -> [Char] -> CompileInfo ()
forall a b. (a -> b) -> a -> b
$ [Char] -> [Char]
forall a. Show a => a -> [Char]
show [Char]
s [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" does not parse as " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ a -> [Char]
forall a. Show a => a -> [Char]
show a
m [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
":\n" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ a -> [Char]
forall a. Show a => a -> [Char]
show a
e
where
check :: CompileInfo a -> m ()
check CompileInfo a
c
| CompileInfo a -> Bool
forall a. CompileInfo a -> Bool
isCompileError CompileInfo a
c = [Char] -> m ()
forall (m :: * -> *) a. CompileErrorM m => [Char] -> m a
compileErrorM ([Char] -> m ()) -> [Char] -> m ()
forall a b. (a -> b) -> a -> b
$ [Char]
"Parse '" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
s [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"':\n" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ CompileMessage -> [Char]
forall a. Show a => a -> [Char]
show (CompileInfo a -> CompileMessage
forall a. CompileInfo a -> CompileMessage
getCompileError CompileInfo a
c)
| Bool
otherwise = () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
checkParseFail :: Show a => ParserE CompileInfo a -> [Char] -> IO (CompileInfo ())
checkParseFail :: ParserE CompileInfo a -> [Char] -> IO (CompileInfo ())
checkParseFail ParserE CompileInfo a
p [Char]
s = do
let parsed :: CompileInfo a
parsed = ParserE CompileInfo a -> [Char] -> [Char] -> CompileInfo a
forall a.
ParserE CompileInfo a -> [Char] -> [Char] -> CompileInfo a
readSingleWith ParserE CompileInfo a
p [Char]
"(string)" [Char]
s
CompileInfo () -> IO (CompileInfo ())
forall (m :: * -> *) a. Monad m => a -> m a
return (CompileInfo () -> IO (CompileInfo ()))
-> CompileInfo () -> IO (CompileInfo ())
forall a b. (a -> b) -> a -> b
$ CompileInfo a -> CompileInfo ()
forall (m :: * -> *) a.
(CompileErrorM m, Show a) =>
CompileInfo a -> m ()
check CompileInfo a
parsed
where
check :: CompileInfo a -> m ()
check CompileInfo a
c
| CompileInfo a -> Bool
forall a. CompileInfo a -> Bool
isCompileError CompileInfo a
c = () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = [Char] -> m ()
forall (m :: * -> *) a. CompileErrorM m => [Char] -> m a
compileErrorM ([Char] -> m ()) -> [Char] -> m ()
forall a b. (a -> b) -> a -> b
$ [Char]
"Parse '" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
s [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"': Expected failure but got\n" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
a -> [Char]
forall a. Show a => a -> [Char]
show (CompileInfo a -> a
forall a. CompileInfo a -> a
getCompileSuccess CompileInfo a
c) [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"\n"