{- -----------------------------------------------------------------------------
Copyright 2020,2023 Kevin P. Barry

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
----------------------------------------------------------------------------- -}

-- Author: Kevin P. Barry [ta0kira@gmail.com]

{-# 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