module Test.SourceFile (tests) where
import System.FilePath
import Base.CompilerError
import Base.TrackedErrors
import Parser.Pragma (parsePragmas)
import Parser.SourceFile
import Test.Common
tests :: [IO (TrackedErrors ())]
tests :: [IO (TrackedErrors ())]
tests = [
String
-> TextParser [PragmaSource SourceContext]
-> ([PragmaSource SourceContext] -> Bool)
-> IO (TrackedErrors ())
forall a.
Show a =>
String -> TextParser a -> (a -> Bool) -> IO (TrackedErrors ())
checkParseMatch String
"$ModuleOnly$" ((PragmaSource SourceContext -> [PragmaSource SourceContext])
-> ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
-> TextParser [PragmaSource SourceContext]
forall a b.
(a -> b)
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (PragmaSource SourceContext
-> [PragmaSource SourceContext] -> [PragmaSource SourceContext]
forall a. a -> [a] -> [a]
:[]) ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaModuleOnly)
(\[PragmaSource SourceContext]
e -> case [PragmaSource SourceContext]
e of
[PragmaVisibility [SourceContext]
_ CodeVisibility
ModuleOnly] -> Bool
True
[PragmaSource SourceContext]
_ -> Bool
False),
String
-> TextParser [PragmaSource SourceContext]
-> ([PragmaSource SourceContext] -> Bool)
-> IO (TrackedErrors ())
forall a.
Show a =>
String -> TextParser a -> (a -> Bool) -> IO (TrackedErrors ())
checkParseMatch String
"$TestsOnly$" ((PragmaSource SourceContext -> [PragmaSource SourceContext])
-> ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
-> TextParser [PragmaSource SourceContext]
forall a b.
(a -> b)
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (PragmaSource SourceContext
-> [PragmaSource SourceContext] -> [PragmaSource SourceContext]
forall a. a -> [a] -> [a]
:[]) ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaTestsOnly)
(\[PragmaSource SourceContext]
e -> case [PragmaSource SourceContext]
e of
[PragmaVisibility [SourceContext]
_ CodeVisibility
TestsOnly] -> Bool
True
[PragmaSource SourceContext]
_ -> Bool
False),
String
-> TextParser [PragmaSource SourceContext]
-> ([PragmaSource SourceContext] -> Bool)
-> IO (TrackedErrors ())
forall a.
Show a =>
String -> TextParser a -> (a -> Bool) -> IO (TrackedErrors ())
checkParseMatch String
"/*only comments*/" ([ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)]
-> TextParser [PragmaSource SourceContext]
forall a. [TextParser a] -> TextParser [a]
parsePragmas [ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaModuleOnly,ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaTestsOnly])
(\[PragmaSource SourceContext]
e -> case [PragmaSource SourceContext]
e of
[] -> Bool
True
[PragmaSource SourceContext]
_ -> Bool
False),
String
-> TextParser [PragmaSource SourceContext]
-> ([PragmaSource SourceContext] -> Bool)
-> IO (TrackedErrors ())
forall a.
Show a =>
String -> TextParser a -> (a -> Bool) -> IO (TrackedErrors ())
checkParseMatch String
"$ModuleOnly$ // comment" ([ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)]
-> TextParser [PragmaSource SourceContext]
forall a. [TextParser a] -> TextParser [a]
parsePragmas [ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaTestsOnly,ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaModuleOnly])
(\[PragmaSource SourceContext]
e -> case [PragmaSource SourceContext]
e of
[PragmaVisibility [SourceContext]
_ CodeVisibility
ModuleOnly] -> Bool
True
[PragmaSource SourceContext]
_ -> Bool
False),
String
-> TextParser [PragmaSource SourceContext]
-> ([PragmaSource SourceContext] -> Bool)
-> IO (TrackedErrors ())
forall a.
Show a =>
String -> TextParser a -> (a -> Bool) -> IO (TrackedErrors ())
checkParseMatch String
"$TestsOnly$ /*comment*/" ([ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)]
-> TextParser [PragmaSource SourceContext]
forall a. [TextParser a] -> TextParser [a]
parsePragmas [ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaModuleOnly,ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaTestsOnly])
(\[PragmaSource SourceContext]
e -> case [PragmaSource SourceContext]
e of
[PragmaVisibility [SourceContext]
_ CodeVisibility
TestsOnly] -> Bool
True
[PragmaSource SourceContext]
_ -> Bool
False),
String
-> TextParser [PragmaSource SourceContext]
-> ([PragmaSource SourceContext] -> Bool)
-> IO (TrackedErrors ())
forall a.
Show a =>
String -> TextParser a -> (a -> Bool) -> IO (TrackedErrors ())
checkParseMatch String
"$TestsOnly$\n$TestsOnly$\n$ModuleOnly$" ([ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)]
-> TextParser [PragmaSource SourceContext]
forall a. [TextParser a] -> TextParser [a]
parsePragmas [ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaModuleOnly,ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaTestsOnly])
(\[PragmaSource SourceContext]
e -> case [PragmaSource SourceContext]
e of
[PragmaVisibility [SourceContext]
_ CodeVisibility
TestsOnly,
PragmaVisibility [SourceContext]
_ CodeVisibility
TestsOnly,
PragmaVisibility [SourceContext]
_ CodeVisibility
ModuleOnly] -> Bool
True
[PragmaSource SourceContext]
_ -> Bool
False),
String
-> String
-> ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
-> IO (TrackedErrors ())
forall a.
Show a =>
String -> String -> TextParser a -> IO (TrackedErrors ())
checkParseError String
"$ModuleOnly[ extra ]$" String
"does not allow arguments" ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaModuleOnly,
String
-> String
-> ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
-> IO (TrackedErrors ())
forall a.
Show a =>
String -> String -> TextParser a -> IO (TrackedErrors ())
checkParseError String
"$TestsOnly[ extra ]$" String
"does not allow arguments" ParsecT
CompilerMessage String Identity (PragmaSource SourceContext)
pragmaTestsOnly,
String
-> ((String, String)
-> TrackedErrors
([PragmaSource SourceContext], [AnyCategory SourceContext]))
-> IO (TrackedErrors ())
forall a.
String
-> ((String, String) -> TrackedErrors a) -> IO (TrackedErrors ())
checkParseSuccess (String
"testfiles" String -> String -> String
</> String
"public.0rp") (String, String)
-> TrackedErrors
([PragmaSource SourceContext], [AnyCategory SourceContext])
forall (m :: * -> *).
ErrorContextM m =>
(String, String)
-> m ([PragmaSource SourceContext], [AnyCategory SourceContext])
parsePublicSource,
String
-> ((String, String)
-> TrackedErrors
([PragmaSource SourceContext], [AnyCategory SourceContext],
[DefinedCategory SourceContext]))
-> IO (TrackedErrors ())
forall a.
String
-> ((String, String) -> TrackedErrors a) -> IO (TrackedErrors ())
checkParseSuccess (String
"testfiles" String -> String -> String
</> String
"internal.0rx") (String, String)
-> TrackedErrors
([PragmaSource SourceContext], [AnyCategory SourceContext],
[DefinedCategory SourceContext])
forall (m :: * -> *).
ErrorContextM m =>
(String, String)
-> m ([PragmaSource SourceContext], [AnyCategory SourceContext],
[DefinedCategory SourceContext])
parseInternalSource,
String
-> ((String, String)
-> TrackedErrors
([PragmaSource SourceContext], [IntegrationTest SourceContext]))
-> IO (TrackedErrors ())
forall a.
String
-> ((String, String) -> TrackedErrors a) -> IO (TrackedErrors ())
checkParseSuccess (String
"testfiles" String -> String -> String
</> String
"test.0rt") (String, String)
-> TrackedErrors
([PragmaSource SourceContext], [IntegrationTest SourceContext])
forall (m :: * -> *).
ErrorContextM m =>
(String, String)
-> m ([PragmaSource SourceContext],
[IntegrationTest SourceContext])
parseTestSource
]
checkParseSuccess :: String -> ((FilePath,String) -> TrackedErrors a) -> IO (TrackedErrors ())
checkParseSuccess :: forall a.
String
-> ((String, String) -> TrackedErrors a) -> IO (TrackedErrors ())
checkParseSuccess String
f (String, String) -> TrackedErrors a
p = do
String
contents <- String -> IO String
loadFile String
f
let parsed :: TrackedErrors a
parsed = (String, String) -> TrackedErrors a
p (String
f,String
contents)
TrackedErrors () -> IO (TrackedErrors ())
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (TrackedErrors () -> IO (TrackedErrors ()))
-> TrackedErrors () -> IO (TrackedErrors ())
forall a b. (a -> b) -> a -> b
$ TrackedErrors a -> TrackedErrors ()
forall {m :: * -> *} {a}.
ErrorContextM m =>
TrackedErrorsT Identity a -> m ()
check TrackedErrors a
parsed
where
check :: TrackedErrorsT Identity a -> m ()
check TrackedErrorsT Identity a
c
| TrackedErrorsT Identity a -> Bool
forall (t :: (* -> *) -> * -> *) a.
(ErrorContextT t, ErrorContextM (t Identity)) =>
t Identity a -> Bool
isCompilerError TrackedErrorsT Identity a
c = String -> m ()
forall a. String -> m a
forall (m :: * -> *) a. ErrorContextM m => String -> m a
compilerErrorM (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String
"Parse " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
f String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ CompilerMessage -> String
forall a. Show a => a -> String
show (TrackedErrorsT Identity a -> CompilerMessage
forall a. TrackedErrors a -> CompilerMessage
getCompilerError TrackedErrorsT Identity a
c)
| Bool
otherwise = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()