{-# LANGUAGE NoImplicitPrelude #-}

module Stack.Options.TestParser
  ( testOptsParser
  ) where

import           Options.Applicative
                   ( Parser, auto, flag', help, long, metavar, option )
import           Options.Applicative.Args ( argsOption )
import           Options.Applicative.Builder.Extra
                   ( firstBoolFlagsTrue, optionalFirst, optionalFirstFalse )
import           Stack.Options.Utils ( hideMods )
import           Stack.Prelude
import           Stack.Types.BuildOptsMonoid ( TestOptsMonoid (..) )

-- | Parser for test arguments.
-- FIXME hide args
testOptsParser :: Bool -> Parser TestOptsMonoid
testOptsParser hide0 = TestOptsMonoid
  <$> firstBoolFlagsTrue
        "rerun-tests"
        "running already successful test suites."
        hide
  <*> fmap concat (many (argsOption
        (  long "test-arguments"
        <> long "ta"
        <> metavar "TEST_ARGS"
        <> help "Arguments passed to the test suites."
        <> hide
        )))
  <*> optionalFirstFalse (flag' True
        (  long "coverage"
        <> help "Generate a code coverage report."
        <> hide
        ))
  <*> firstBoolFlagsTrue
        "run-tests"
        "running of targeted test suites."
        hide
  <*> optionalFirst (option (fmap Just auto)
        (  long "test-suite-timeout"
        <> help "Maximum test suite run time in seconds."
        <> hide
        ))
  <*> firstBoolFlagsTrue
        "tests-allow-stdin"
        "allow standard input in test suites."
        hide
 where
  hide = hideMods hide0
