{-# LANGUAGE CPP #-}

module Test.Sandwich.Options (
  Options
  , defaultOptions

  -- * Artifacts
  , optionsTestArtifactsDirectory
  , TestArtifactsDirectory(..)
  , defaultTestArtifactsDirectory

  -- * Logging
  , optionsSavedLogLevel
  , optionsMemoryLogLevel
  , optionsLogFormatter
  , LogEntryFormatter

  -- * Formatting
  , optionsFormatters
  , SomeFormatter(..)
  , Formatter(..)

  -- * Filtering
  , optionsFilterTree
  , optionsPruneTree
  , TreeFilter(..)

  -- * Timing
  , optionsTestTimerType

  -- * Dry run
  , optionsDryRun

  -- * Misc
  , optionsProjectRoot
  ) where

import Control.Monad.Logger
import Data.Time.Clock
import Test.Sandwich.Formatters.Print
import Test.Sandwich.Types.RunTree

#ifdef mingw32_HOST_OS
import Data.Function ((&))
#endif


-- | A reasonable default set of options.
defaultOptions :: Options
defaultOptions :: Options
defaultOptions = Options {
  optionsTestArtifactsDirectory :: TestArtifactsDirectory
optionsTestArtifactsDirectory = TestArtifactsDirectory
TestArtifactsNone
  , optionsSavedLogLevel :: Maybe LogLevel
optionsSavedLogLevel = LogLevel -> Maybe LogLevel
forall a. a -> Maybe a
Just LogLevel
LevelDebug
  , optionsMemoryLogLevel :: Maybe LogLevel
optionsMemoryLogLevel = LogLevel -> Maybe LogLevel
forall a. a -> Maybe a
Just LogLevel
LevelDebug
  , optionsLogFormatter :: LogEntryFormatter
optionsLogFormatter = LogEntryFormatter
defaultLogEntryFormatter
  , optionsPruneTree :: Maybe TreeFilter
optionsPruneTree = Maybe TreeFilter
forall a. Maybe a
Nothing
  , optionsFilterTree :: Maybe TreeFilter
optionsFilterTree = Maybe TreeFilter
forall a. Maybe a
Nothing
  , optionsDryRun :: Bool
optionsDryRun = Bool
False
  , optionsFormatters :: [SomeFormatter]
optionsFormatters = [PrintFormatter -> SomeFormatter
forall f. (Formatter f, Show f, Typeable f) => f -> SomeFormatter
SomeFormatter PrintFormatter
defaultPrintFormatter]
  , optionsProjectRoot :: Maybe FilePath
optionsProjectRoot = Maybe FilePath
forall a. Maybe a
Nothing
  , optionsTestTimerType :: TestTimerType
optionsTestTimerType = SpeedScopeTestTimerType { speedScopeTestTimerWriteRawTimings :: Bool
speedScopeTestTimerWriteRawTimings = Bool
False }
  }

defaultTestArtifactsDirectory :: TestArtifactsDirectory
defaultTestArtifactsDirectory :: TestArtifactsDirectory
defaultTestArtifactsDirectory = FilePath -> IO FilePath -> TestArtifactsDirectory
TestArtifactsGeneratedDirectory FilePath
"test_runs" IO FilePath
getFolderName
  where
#ifndef mingw32_HOST_OS
    getFolderName :: IO FilePath
getFolderName = UTCTime -> FilePath
forall a. Show a => a -> FilePath
show (UTCTime -> FilePath) -> IO UTCTime -> IO FilePath
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO UTCTime
getCurrentTime
#else
    getFolderName = do
      ts <- show <$> getCurrentTime
      return $ ts
        & replace ':' '_'

    replace :: Eq a => a -> a -> [a] -> [a]
    replace a b = map $ \c -> if c == a then b else c
#endif