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