{-# LANGUAGE FlexibleInstances #-}
module Parser.IntegrationTest (
) where
import Control.Applicative.Permutations
import Parser.Common
import Parser.DefinedCategory ()
import Parser.Procedure ()
import Parser.TextParser
import Parser.TypeCategory ()
import Parser.TypeInstance ()
import Types.IntegrationTest
instance ParseFromSource (IntegrationTestHeader SourceContext) where
sourceParser :: TextParser (IntegrationTestHeader SourceContext)
sourceParser = String
-> TextParser (IntegrationTestHeader SourceContext)
-> TextParser (IntegrationTestHeader SourceContext)
forall a. String -> TextParser a -> TextParser a
labeled String
"testcase" (TextParser (IntegrationTestHeader SourceContext)
-> TextParser (IntegrationTestHeader SourceContext))
-> TextParser (IntegrationTestHeader SourceContext)
-> TextParser (IntegrationTestHeader SourceContext)
forall a b. (a -> b) -> a -> b
$ do
SourceContext
c <- TextParser SourceContext
getSourceContext
TextParser () -> TextParser ()
forall a. TextParser a -> TextParser a
sepAfter TextParser ()
kwTestcase
String -> TextParser ()
string_ String
"\""
String
name <- ParsecT CompilerMessage String Identity Char
-> TextParser () -> ParsecT CompilerMessage String Identity String
forall (m :: * -> *) a end. MonadPlus m => m a -> m end -> m [a]
manyTill ParsecT CompilerMessage String Identity Char
stringChar (String -> TextParser ()
string_ String
"\"")
TextParser ()
optionalSpace
TextParser () -> TextParser ()
forall a. TextParser a -> TextParser a
sepAfter (String -> TextParser ()
string_ String
"{")
[OutputPattern] -> [OutputPattern] -> ExpectedResult SourceContext
result <- TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
resultCompiles TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
resultError TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
resultCrash TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
resultSuccess
IntegrationTestHeader SourceContext
header <- Permutation
(ParsecT CompilerMessage String Identity)
(IntegrationTestHeader SourceContext)
-> TextParser (IntegrationTestHeader SourceContext)
forall (m :: * -> *) a. Alternative m => Permutation m a -> m a
runPermutation (Permutation
(ParsecT CompilerMessage String Identity)
(IntegrationTestHeader SourceContext)
-> TextParser (IntegrationTestHeader SourceContext))
-> Permutation
(ParsecT CompilerMessage String Identity)
(IntegrationTestHeader SourceContext)
-> TextParser (IntegrationTestHeader SourceContext)
forall a b. (a -> b) -> a -> b
$ SourceContext
-> String
-> ([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> [String]
-> Maybe Integer
-> ([OutputPattern], [OutputPattern])
-> IntegrationTestHeader SourceContext
forall {c} {t} {t}.
c
-> String
-> (t -> t -> ExpectedResult c)
-> [String]
-> Maybe Integer
-> (t, t)
-> IntegrationTestHeader c
build SourceContext
c String
name [OutputPattern] -> [OutputPattern] -> ExpectedResult SourceContext
result
([String]
-> Maybe Integer
-> ([OutputPattern], [OutputPattern])
-> IntegrationTestHeader SourceContext)
-> Permutation (ParsecT CompilerMessage String Identity) [String]
-> Permutation
(ParsecT CompilerMessage String Identity)
(Maybe Integer
-> ([OutputPattern], [OutputPattern])
-> IntegrationTestHeader SourceContext)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String]
-> ParsecT CompilerMessage String Identity [String]
-> Permutation (ParsecT CompilerMessage String Identity) [String]
forall (m :: * -> *) a.
Alternative m =>
a -> m a -> Permutation m a
toPermutationWithDefault [] ParsecT CompilerMessage String Identity [String]
parseArgs
Permutation
(ParsecT CompilerMessage String Identity)
(Maybe Integer
-> ([OutputPattern], [OutputPattern])
-> IntegrationTestHeader SourceContext)
-> Permutation
(ParsecT CompilerMessage String Identity) (Maybe Integer)
-> Permutation
(ParsecT CompilerMessage String Identity)
(([OutputPattern], [OutputPattern])
-> IntegrationTestHeader SourceContext)
forall a b.
Permutation (ParsecT CompilerMessage String Identity) (a -> b)
-> Permutation (ParsecT CompilerMessage String Identity) a
-> Permutation (ParsecT CompilerMessage String Identity) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe Integer
-> ParsecT CompilerMessage String Identity (Maybe Integer)
-> Permutation
(ParsecT CompilerMessage String Identity) (Maybe Integer)
forall (m :: * -> *) a.
Alternative m =>
a -> m a -> Permutation m a
toPermutationWithDefault Maybe Integer
forall a. Maybe a
Nothing ParsecT CompilerMessage String Identity (Maybe Integer)
parseTimeout
Permutation
(ParsecT CompilerMessage String Identity)
(([OutputPattern], [OutputPattern])
-> IntegrationTestHeader SourceContext)
-> Permutation
(ParsecT CompilerMessage String Identity)
([OutputPattern], [OutputPattern])
-> Permutation
(ParsecT CompilerMessage String Identity)
(IntegrationTestHeader SourceContext)
forall a b.
Permutation (ParsecT CompilerMessage String Identity) (a -> b)
-> Permutation (ParsecT CompilerMessage String Identity) a
-> Permutation (ParsecT CompilerMessage String Identity) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT
CompilerMessage String Identity ([OutputPattern], [OutputPattern])
-> Permutation
(ParsecT CompilerMessage String Identity)
([OutputPattern], [OutputPattern])
forall (m :: * -> *) a. Alternative m => m a -> Permutation m a
toPermutation ParsecT
CompilerMessage String Identity ([OutputPattern], [OutputPattern])
requireOrExclude
TextParser () -> TextParser ()
forall a. TextParser a -> TextParser a
sepAfter (String -> TextParser ()
string_ String
"}")
IntegrationTestHeader SourceContext
-> TextParser (IntegrationTestHeader SourceContext)
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return IntegrationTestHeader SourceContext
header where
build :: c
-> String
-> (t -> t -> ExpectedResult c)
-> [String]
-> Maybe Integer
-> (t, t)
-> IntegrationTestHeader c
build c
c String
name t -> t -> ExpectedResult c
result [String]
args Maybe Integer
timeout (t
req,t
exc) =
[c]
-> String
-> [String]
-> Maybe Integer
-> ExpectedResult c
-> IntegrationTestHeader c
forall c.
[c]
-> String
-> [String]
-> Maybe Integer
-> ExpectedResult c
-> IntegrationTestHeader c
IntegrationTestHeader [c
c] String
name [String]
args Maybe Integer
timeout (t -> t -> ExpectedResult c
result t
req t
exc)
resultCompiles :: TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
resultCompiles = String
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a. String -> TextParser a -> TextParser a
labeled String
"compiles expectation" (TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext))
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a b. (a -> b) -> a -> b
$ do
SourceContext
c <- TextParser SourceContext
getSourceContext
String -> TextParser ()
keyword String
"compiles"
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext))
-> ([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a b. (a -> b) -> a -> b
$ [SourceContext]
-> [OutputPattern]
-> [OutputPattern]
-> ExpectedResult SourceContext
forall c.
[c] -> [OutputPattern] -> [OutputPattern] -> ExpectedResult c
ExpectCompiles [SourceContext
c]
resultError :: TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
resultError = String
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a. String -> TextParser a -> TextParser a
labeled String
"error expectation" (TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext))
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a b. (a -> b) -> a -> b
$ do
SourceContext
c <- TextParser SourceContext
getSourceContext
String -> TextParser ()
keyword String
"error"
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext))
-> ([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a b. (a -> b) -> a -> b
$ [SourceContext]
-> [OutputPattern]
-> [OutputPattern]
-> ExpectedResult SourceContext
forall c.
[c] -> [OutputPattern] -> [OutputPattern] -> ExpectedResult c
ExpectCompilerError [SourceContext
c]
resultCrash :: TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
resultCrash = String
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a. String -> TextParser a -> TextParser a
labeled String
"failure expectation" (TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext))
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a b. (a -> b) -> a -> b
$ do
SourceContext
c <- TextParser SourceContext
getSourceContext
String -> TextParser ()
keyword String
"failure"
Maybe ([SourceContext], TypeInstance)
t <- (([SourceContext], TypeInstance)
-> Maybe ([SourceContext], TypeInstance))
-> ParsecT
CompilerMessage String Identity ([SourceContext], TypeInstance)
-> ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
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 ([SourceContext], TypeInstance)
-> Maybe ([SourceContext], TypeInstance)
forall a. a -> Maybe a
Just ParsecT
CompilerMessage String Identity ([SourceContext], TypeInstance)
parseTestcaseType ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
-> ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
-> ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
forall a.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe ([SourceContext], TypeInstance)
-> ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe ([SourceContext], TypeInstance)
forall a. Maybe a
Nothing
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext))
-> ([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a b. (a -> b) -> a -> b
$ [SourceContext]
-> Maybe ([SourceContext], TypeInstance)
-> [OutputPattern]
-> [OutputPattern]
-> ExpectedResult SourceContext
forall c.
[c]
-> Maybe ([c], TypeInstance)
-> [OutputPattern]
-> [OutputPattern]
-> ExpectedResult c
ExpectRuntimeError [SourceContext
c] Maybe ([SourceContext], TypeInstance)
t
resultSuccess :: TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
resultSuccess = String
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a. String -> TextParser a -> TextParser a
labeled String
"success expectation" (TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext))
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a b. (a -> b) -> a -> b
$ do
SourceContext
c <- TextParser SourceContext
getSourceContext
String -> TextParser ()
keyword String
"success"
Maybe ([SourceContext], TypeInstance)
t <- (([SourceContext], TypeInstance)
-> Maybe ([SourceContext], TypeInstance))
-> ParsecT
CompilerMessage String Identity ([SourceContext], TypeInstance)
-> ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
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 ([SourceContext], TypeInstance)
-> Maybe ([SourceContext], TypeInstance)
forall a. a -> Maybe a
Just ParsecT
CompilerMessage String Identity ([SourceContext], TypeInstance)
parseTestcaseType ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
-> ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
-> ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
forall a.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe ([SourceContext], TypeInstance)
-> ParsecT
CompilerMessage
String
Identity
(Maybe ([SourceContext], TypeInstance))
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe ([SourceContext], TypeInstance)
forall a. Maybe a
Nothing
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext))
-> ([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
-> TextParser
([OutputPattern]
-> [OutputPattern] -> ExpectedResult SourceContext)
forall a b. (a -> b) -> a -> b
$ [SourceContext]
-> Maybe ([SourceContext], TypeInstance)
-> [OutputPattern]
-> [OutputPattern]
-> ExpectedResult SourceContext
forall c.
[c]
-> Maybe ([c], TypeInstance)
-> [OutputPattern]
-> [OutputPattern]
-> ExpectedResult c
ExpectRuntimeSuccess [SourceContext
c] Maybe ([SourceContext], TypeInstance)
t
parseTestcaseType :: ParsecT
CompilerMessage String Identity ([SourceContext], TypeInstance)
parseTestcaseType = do
SourceContext
c <- TextParser SourceContext
getSourceContext
TypeInstance
t <- TextParser TypeInstance
forall a. ParseFromSource a => TextParser a
sourceParser
([SourceContext], TypeInstance)
-> ParsecT
CompilerMessage String Identity ([SourceContext], TypeInstance)
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ([SourceContext
c],TypeInstance
t)
parseArgs :: ParsecT CompilerMessage String Identity [String]
parseArgs = String
-> ParsecT CompilerMessage String Identity [String]
-> ParsecT CompilerMessage String Identity [String]
forall a. String -> TextParser a -> TextParser a
labeled String
"testcase args" (ParsecT CompilerMessage String Identity [String]
-> ParsecT CompilerMessage String Identity [String])
-> ParsecT CompilerMessage String Identity [String]
-> ParsecT CompilerMessage String Identity [String]
forall a b. (a -> b) -> a -> b
$ do
String -> TextParser ()
keyword String
"args"
ParsecT CompilerMessage String Identity String
-> ParsecT CompilerMessage String Identity [String]
forall (m :: * -> *) a. MonadPlus m => m a -> m [a]
many (ParsecT CompilerMessage String Identity String
-> ParsecT CompilerMessage String Identity String
forall a. TextParser a -> TextParser a
sepAfter ParsecT CompilerMessage String Identity String
quotedString)
parseTimeout :: ParsecT CompilerMessage String Identity (Maybe Integer)
parseTimeout = String
-> ParsecT CompilerMessage String Identity (Maybe Integer)
-> ParsecT CompilerMessage String Identity (Maybe Integer)
forall a. String -> TextParser a -> TextParser a
labeled String
"testcase timeout" (ParsecT CompilerMessage String Identity (Maybe Integer)
-> ParsecT CompilerMessage String Identity (Maybe Integer))
-> ParsecT CompilerMessage String Identity (Maybe Integer)
-> ParsecT CompilerMessage String Identity (Maybe Integer)
forall a b. (a -> b) -> a -> b
$ do
String -> TextParser ()
keyword String
"timeout"
((Integer, Integer) -> Maybe Integer)
-> ParsecT CompilerMessage String Identity (Integer, Integer)
-> ParsecT CompilerMessage String Identity (Maybe Integer)
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 (Integer -> Maybe Integer
forall a. a -> Maybe a
Just (Integer -> Maybe Integer)
-> ((Integer, Integer) -> Integer)
-> (Integer, Integer)
-> Maybe Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer, Integer) -> Integer
forall a b. (a, b) -> b
snd) (ParsecT CompilerMessage String Identity (Integer, Integer)
-> ParsecT CompilerMessage String Identity (Integer, Integer)
forall a. TextParser a -> TextParser a
sepAfter ParsecT CompilerMessage String Identity (Integer, Integer)
parseDec)
requireOrExclude :: ParsecT
CompilerMessage String Identity ([OutputPattern], [OutputPattern])
requireOrExclude = TextParser OutputPattern
-> TextParser OutputPattern
-> ParsecT
CompilerMessage String Identity ([OutputPattern], [OutputPattern])
forall a b. TextParser a -> TextParser b -> TextParser ([a], [b])
parseAny2 TextParser OutputPattern
require TextParser OutputPattern
exclude where
require :: TextParser OutputPattern
require = do
String -> TextParser ()
keyword String
"require"
OutputScope
s <- ParsecT CompilerMessage String Identity OutputScope
outputScope
String -> TextParser ()
string_ String
"\""
String
r <- ([String] -> String)
-> ParsecT CompilerMessage String Identity [String]
-> ParsecT CompilerMessage String Identity String
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 [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (ParsecT CompilerMessage String Identity [String]
-> ParsecT CompilerMessage String Identity String)
-> ParsecT CompilerMessage String Identity [String]
-> ParsecT CompilerMessage String Identity String
forall a b. (a -> b) -> a -> b
$ ParsecT CompilerMessage String Identity String
-> TextParser ()
-> ParsecT CompilerMessage String Identity [String]
forall (m :: * -> *) a end. MonadPlus m => m a -> m end -> m [a]
manyTill ParsecT CompilerMessage String Identity String
regexChar (String -> TextParser ()
string_ String
"\"")
TextParser ()
optionalSpace
OutputPattern -> TextParser OutputPattern
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputPattern -> TextParser OutputPattern)
-> OutputPattern -> TextParser OutputPattern
forall a b. (a -> b) -> a -> b
$ OutputScope -> String -> OutputPattern
OutputPattern OutputScope
s String
r
exclude :: TextParser OutputPattern
exclude = do
String -> TextParser ()
keyword String
"exclude"
OutputScope
s <- ParsecT CompilerMessage String Identity OutputScope
outputScope
String -> TextParser ()
string_ String
"\""
String
e <- ([String] -> String)
-> ParsecT CompilerMessage String Identity [String]
-> ParsecT CompilerMessage String Identity String
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 [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (ParsecT CompilerMessage String Identity [String]
-> ParsecT CompilerMessage String Identity String)
-> ParsecT CompilerMessage String Identity [String]
-> ParsecT CompilerMessage String Identity String
forall a b. (a -> b) -> a -> b
$ ParsecT CompilerMessage String Identity String
-> TextParser ()
-> ParsecT CompilerMessage String Identity [String]
forall (m :: * -> *) a end. MonadPlus m => m a -> m end -> m [a]
manyTill ParsecT CompilerMessage String Identity String
regexChar (String -> TextParser ()
string_ String
"\"")
TextParser ()
optionalSpace
OutputPattern -> TextParser OutputPattern
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (OutputPattern -> TextParser OutputPattern)
-> OutputPattern -> TextParser OutputPattern
forall a b. (a -> b) -> a -> b
$ OutputScope -> String -> OutputPattern
OutputPattern OutputScope
s String
e
outputScope :: ParsecT CompilerMessage String Identity OutputScope
outputScope = ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a. TextParser a -> TextParser a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try ParsecT CompilerMessage String Identity OutputScope
anyScope ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a. TextParser a -> TextParser a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try ParsecT CompilerMessage String Identity OutputScope
compilerScope ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a. TextParser a -> TextParser a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try ParsecT CompilerMessage String Identity OutputScope
stderrScope ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a. TextParser a -> TextParser a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try ParsecT CompilerMessage String Identity OutputScope
stdoutScope ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
OutputScope -> ParsecT CompilerMessage String Identity OutputScope
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return OutputScope
OutputAny
anyScope :: ParsecT CompilerMessage String Identity OutputScope
anyScope = String -> TextParser ()
keyword String
"any" TextParser ()
-> ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a b.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity b
-> ParsecT CompilerMessage String Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> OutputScope -> ParsecT CompilerMessage String Identity OutputScope
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return OutputScope
OutputAny
compilerScope :: ParsecT CompilerMessage String Identity OutputScope
compilerScope = String -> TextParser ()
keyword String
"compiler" TextParser ()
-> ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a b.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity b
-> ParsecT CompilerMessage String Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> OutputScope -> ParsecT CompilerMessage String Identity OutputScope
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return OutputScope
OutputCompiler
stderrScope :: ParsecT CompilerMessage String Identity OutputScope
stderrScope = String -> TextParser ()
keyword String
"stderr" TextParser ()
-> ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a b.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity b
-> ParsecT CompilerMessage String Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> OutputScope -> ParsecT CompilerMessage String Identity OutputScope
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return OutputScope
OutputStderr
stdoutScope :: ParsecT CompilerMessage String Identity OutputScope
stdoutScope = String -> TextParser ()
keyword String
"stdout" TextParser ()
-> ParsecT CompilerMessage String Identity OutputScope
-> ParsecT CompilerMessage String Identity OutputScope
forall a b.
ParsecT CompilerMessage String Identity a
-> ParsecT CompilerMessage String Identity b
-> ParsecT CompilerMessage String Identity b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> OutputScope -> ParsecT CompilerMessage String Identity OutputScope
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return OutputScope
OutputStdout
instance ParseFromSource (IntegrationTest SourceContext) where
sourceParser :: TextParser (IntegrationTest SourceContext)
sourceParser = String
-> TextParser (IntegrationTest SourceContext)
-> TextParser (IntegrationTest SourceContext)
forall a. String -> TextParser a -> TextParser a
labeled String
"integration test" (TextParser (IntegrationTest SourceContext)
-> TextParser (IntegrationTest SourceContext))
-> TextParser (IntegrationTest SourceContext)
-> TextParser (IntegrationTest SourceContext)
forall a b. (a -> b) -> a -> b
$ do
IntegrationTestHeader SourceContext
h <- TextParser (IntegrationTestHeader SourceContext)
forall a. ParseFromSource a => TextParser a
sourceParser
([AnyCategory SourceContext]
cs,[DefinedCategory SourceContext]
ds,[TestProcedure SourceContext]
ts) <- TextParser (AnyCategory SourceContext)
-> TextParser (DefinedCategory SourceContext)
-> TextParser (TestProcedure SourceContext)
-> TextParser
([AnyCategory SourceContext], [DefinedCategory SourceContext],
[TestProcedure SourceContext])
forall a b c.
TextParser a
-> TextParser b -> TextParser c -> TextParser ([a], [b], [c])
parseAny3 TextParser (AnyCategory SourceContext)
forall a. ParseFromSource a => TextParser a
sourceParser TextParser (DefinedCategory SourceContext)
forall a. ParseFromSource a => TextParser a
sourceParser TextParser (TestProcedure SourceContext)
forall a. ParseFromSource a => TextParser a
sourceParser
IntegrationTest SourceContext
-> TextParser (IntegrationTest SourceContext)
forall a. a -> ParsecT CompilerMessage String Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (IntegrationTest SourceContext
-> TextParser (IntegrationTest SourceContext))
-> IntegrationTest SourceContext
-> TextParser (IntegrationTest SourceContext)
forall a b. (a -> b) -> a -> b
$ IntegrationTestHeader SourceContext
-> [AnyCategory SourceContext]
-> [DefinedCategory SourceContext]
-> [TestProcedure SourceContext]
-> IntegrationTest SourceContext
forall c.
IntegrationTestHeader c
-> [AnyCategory c]
-> [DefinedCategory c]
-> [TestProcedure c]
-> IntegrationTest c
IntegrationTest IntegrationTestHeader SourceContext
h [AnyCategory SourceContext]
cs [DefinedCategory SourceContext]
ds [TestProcedure SourceContext]
ts