import System import System.Environment import System.Console.GetOpt import Test.Falderal.Common import Test.Falderal.Loader ( loadFile, parseFunctionality, collectFunctionalityDefinitions, stripFunctionalities, assignFunctionalities ) import Test.Falderal.Partitioner ( partitionTests, isHaskellFunctionality, isShellFunctionality ) import Test.Falderal.Formatter (format) import Test.Falderal.Runner (runTests) import Test.Falderal.Reporter (report) -- -- Main module for the `falderal` tool -- a command-line interface to -- `Test.Falderal`. -- -- -- Command-line options -- data Flag = ReportFormat String | HaskellRunCommand String | ShellRunCommand String | Verbosity String | Functionality String | ClearFunctionality String | SkipFunctionality String | Messy deriving (Show, Ord, Eq) determineReportFormat [] = "standard" determineReportFormat (ReportFormat fmt:_) = fmt determineReportFormat (_:rest) = determineReportFormat rest determineVerbosity [] = 0 determineVerbosity (Verbosity v:_) = (read v) :: Int determineVerbosity (_:rest) = determineVerbosity rest determineHaskellRunCommand [] = "runhaskell" determineHaskellRunCommand (HaskellRunCommand s:_) = s determineHaskellRunCommand (_:rest) = determineHaskellRunCommand rest determineShellRunCommand [] = "sh" determineShellRunCommand (ShellRunCommand s:_) = s determineShellRunCommand (_:rest) = determineShellRunCommand rest determineFunctionalityDefinitions [] = [] determineFunctionalityDefinitions (Functionality spec:rest) = (parseFunctionalitySpec spec:determineFunctionalityDefinitions rest) determineFunctionalityDefinitions (_:rest) = determineFunctionalityDefinitions rest parseFunctionalitySpec str = let name = takeWhile (\c -> c /= ':') str rest = tail (dropWhile (\c -> c /= ':') str) in (name, parseFunctionality rest) determineFunctionalitiesToClear [] = [] determineFunctionalitiesToClear (ClearFunctionality name:rest) = (name:determineFunctionalitiesToClear rest) determineFunctionalitiesToClear (_:rest) = determineFunctionalitiesToClear rest determineFunctionalitiesToSkip [] = [] determineFunctionalitiesToSkip (SkipFunctionality name:rest) = ((NamedFunctionality name):determineFunctionalitiesToSkip rest) determineFunctionalitiesToSkip (_:rest) = determineFunctionalitiesToSkip rest -- -- Command-line entry point -- main :: IO () main = do args <- getArgs case getOpt Permute options args of (flags, newArgs, []) -> dispatch newArgs flags (_, _, msgs) -> error $ concat msgs ++ usageInfo header options header = "Usage: falderal [