module Types where import Import import Utils import Text.Parsec import Data.String (IsString(..)) data ShellTest = ShellTest { comments :: [String] -- # COMMENTS OR BLANK LINES before test ,trailingComments :: [String] -- # COMMENTS OR BLANK LINES after the last test ,command :: TestCommand ,stdin :: Maybe String ,stdoutExpected :: Maybe Matcher ,stderrExpected :: Maybe Matcher ,exitCodeExpected :: Matcher ,testname :: String ,lineNumber :: Int } instance Show ShellTest where show ShellTest{testname=n,command=c,lineNumber=ln,stdin=i,stdoutExpected=o,stderrExpected=e,exitCodeExpected=x} = printf "ShellTest {command = %s, stdin = %s, stdoutExpected = %s, stderrExpected = %s, exitCodeExpected = %s, testname = %s, lineNumber = %s}" (show c) (maybe "Nothing" (show.trim) i) (show $ show <$> o) (show $ show <$> e) (show x) (show $ trim n) (show ln) data TestCommand = ReplaceableCommand String | FixedCommand String deriving Show newtype MatcherRegex = MR String instance IsString MatcherRegex where fromString = MR instance Show MatcherRegex where show (MR r) = "/" ++ escapeMatcherRegex r ++ "/" -- Do some minimal escaping to avoid showing unparseable regex matchers: -- backslash-escape forward slashes. -- XXX not super efficient escapeMatcherRegex (c:r) = (if c == '/' then "\\/" else [c]) ++ escapeMatcherRegex r escapeMatcherRegex r = r data Matcher = Lines Int String -- ^ 0 or more lines of text, also the starting line number ? | Numeric String -- ^ numeric exit code as a string | NegativeNumeric String -- ^ numeric exit code as a string, matched negatively | PositiveRegex MatcherRegex -- ^ regular expression | NegativeRegex MatcherRegex -- ^ regular expression, matched negatively instance Show Matcher where show = showMatcherTrimmed showMatcherTrimmed :: Matcher -> String showMatcherTrimmed (PositiveRegex (MR r)) = show $ MR $ trim r showMatcherTrimmed (NegativeRegex mr) = "!" ++ showMatcherTrimmed (PositiveRegex mr) showMatcherTrimmed (Numeric s) = trim s showMatcherTrimmed (NegativeNumeric s) = "!"++ trim s showMatcherTrimmed (Lines _ s) = trim s showMatcher :: Matcher -> String showMatcher mr@(PositiveRegex _) = show mr showMatcher (NegativeRegex r) = "!" ++ showMatcher (PositiveRegex r) showMatcher (Numeric s) = s showMatcher (NegativeNumeric s) = "!"++ s showMatcher (Lines _ s) = s type Macro = (String, String) data PreProcessor = NoPreprocess | PreProcessor [(String -> Either ParseError String)]