module Test.Hspec.JUnit.Config
  ( JUnitConfig

    -- * Construction
  , defaultJUnitConfig
  , setJUnitConfigOutputDirectory
  , setJUnitConfigOutputName
  , setJUnitConfigOutputFile
  , setJUnitConfigSuiteName
  , setJUnitConfigSourcePathPrefix
  , setJUnitConfigDropConsoleFormatting

    -- * Use
  , getJUnitConfigOutputFile
  , getJUnitConfigSuiteName
  , getJUnitPrefixSourcePath
  , getJUnitConfigDropConsoleFormatting
  ) where

import Prelude

import Data.Maybe (fromMaybe)
import Data.Text (Text)
import System.FilePath ((</>))

data JUnitConfig = JUnitConfig
  { JUnitConfig -> FilePath
junitConfigOutputDirectory :: FilePath
  , JUnitConfig -> FilePath
junitConfigOutputName :: FilePath
  , JUnitConfig -> Maybe FilePath
junitConfigOutputFile :: Maybe FilePath
  , JUnitConfig -> Text
junitConfigSuiteName :: Text
  , JUnitConfig -> Maybe FilePath
junitConfigSourcePathPrefix :: Maybe FilePath
  , JUnitConfig -> Bool
junitConfigDropConsoleFormatting :: Bool
  }

-- | Construct a 'JUnitConfig' given a suite name
--
-- See individual set functions for defaults.
defaultJUnitConfig :: Text -> JUnitConfig
defaultJUnitConfig :: Text -> JUnitConfig
defaultJUnitConfig Text
name =
  JUnitConfig
    { junitConfigOutputDirectory :: FilePath
junitConfigOutputDirectory = FilePath
"."
    , junitConfigOutputName :: FilePath
junitConfigOutputName = FilePath
"junit.xml"
    , junitConfigOutputFile :: Maybe FilePath
junitConfigOutputFile = Maybe FilePath
forall a. Maybe a
Nothing
    , junitConfigSuiteName :: Text
junitConfigSuiteName = Text
name
    , junitConfigSourcePathPrefix :: Maybe FilePath
junitConfigSourcePathPrefix = Maybe FilePath
forall a. Maybe a
Nothing
    , junitConfigDropConsoleFormatting :: Bool
junitConfigDropConsoleFormatting = Bool
False
    }

-- | Set the directory within which to generate the report
--
-- Default is current working directory.
setJUnitConfigOutputDirectory :: FilePath -> JUnitConfig -> JUnitConfig
setJUnitConfigOutputDirectory :: FilePath -> JUnitConfig -> JUnitConfig
setJUnitConfigOutputDirectory FilePath
x JUnitConfig
config =
  JUnitConfig
config {junitConfigOutputDirectory = x}

-- | Set the name for the generated report
--
-- Default is @junit.xml@.
setJUnitConfigOutputName :: FilePath -> JUnitConfig -> JUnitConfig
setJUnitConfigOutputName :: FilePath -> JUnitConfig -> JUnitConfig
setJUnitConfigOutputName FilePath
x JUnitConfig
config = JUnitConfig
config {junitConfigOutputName = x}

-- | Set the full path to the generated report
--
-- If given, the directory and name configurations are ignored.
setJUnitConfigOutputFile :: FilePath -> JUnitConfig -> JUnitConfig
setJUnitConfigOutputFile :: FilePath -> JUnitConfig -> JUnitConfig
setJUnitConfigOutputFile FilePath
x JUnitConfig
config = JUnitConfig
config {junitConfigOutputFile = Just x}

setJUnitConfigSuiteName :: Text -> JUnitConfig -> JUnitConfig
setJUnitConfigSuiteName :: Text -> JUnitConfig -> JUnitConfig
setJUnitConfigSuiteName Text
x JUnitConfig
config = JUnitConfig
config {junitConfigSuiteName = x}

-- | Set a prefix to apply to source paths in the report
--
-- Default is none. This can be required if you run specs from a sub-directory
-- in a monorepository, and you need reported paths to be from the repository
-- root.
setJUnitConfigSourcePathPrefix :: FilePath -> JUnitConfig -> JUnitConfig
setJUnitConfigSourcePathPrefix :: FilePath -> JUnitConfig -> JUnitConfig
setJUnitConfigSourcePathPrefix FilePath
x JUnitConfig
config =
  JUnitConfig
config {junitConfigSourcePathPrefix = Just x}

-- | Set whether console formatting characters should be dropped from failure
-- reports.
--
-- Default is False. Most XML processors will fail to parse the XML if it
-- contains the ANSI control characters used by console formatting.
setJUnitConfigDropConsoleFormatting :: Bool -> JUnitConfig -> JUnitConfig
setJUnitConfigDropConsoleFormatting :: Bool -> JUnitConfig -> JUnitConfig
setJUnitConfigDropConsoleFormatting Bool
x JUnitConfig
config = JUnitConfig
config {junitConfigDropConsoleFormatting = x}

-- | Retrieve the full path to the generated report
getJUnitConfigOutputFile :: JUnitConfig -> FilePath
getJUnitConfigOutputFile :: JUnitConfig -> FilePath
getJUnitConfigOutputFile JUnitConfig {Bool
FilePath
Maybe FilePath
Text
junitConfigOutputDirectory :: JUnitConfig -> FilePath
junitConfigOutputName :: JUnitConfig -> FilePath
junitConfigOutputFile :: JUnitConfig -> Maybe FilePath
junitConfigSuiteName :: JUnitConfig -> Text
junitConfigSourcePathPrefix :: JUnitConfig -> Maybe FilePath
junitConfigDropConsoleFormatting :: JUnitConfig -> Bool
junitConfigOutputDirectory :: FilePath
junitConfigOutputName :: FilePath
junitConfigOutputFile :: Maybe FilePath
junitConfigSuiteName :: Text
junitConfigSourcePathPrefix :: Maybe FilePath
junitConfigDropConsoleFormatting :: Bool
..} =
  FilePath -> Maybe FilePath -> FilePath
forall a. a -> Maybe a -> a
fromMaybe
    (FilePath
junitConfigOutputDirectory FilePath -> FilePath -> FilePath
</> FilePath
junitConfigOutputName)
    Maybe FilePath
junitConfigOutputFile

-- | Retrieve the suite name given on construction
getJUnitConfigSuiteName :: JUnitConfig -> Text
getJUnitConfigSuiteName :: JUnitConfig -> Text
getJUnitConfigSuiteName = JUnitConfig -> Text
junitConfigSuiteName

-- | Retrieve the function to apply to reported source paths
--
-- Will be 'id' if no prefix configured.
getJUnitPrefixSourcePath :: JUnitConfig -> FilePath -> FilePath
getJUnitPrefixSourcePath :: JUnitConfig -> FilePath -> FilePath
getJUnitPrefixSourcePath JUnitConfig {Bool
FilePath
Maybe FilePath
Text
junitConfigOutputDirectory :: JUnitConfig -> FilePath
junitConfigOutputName :: JUnitConfig -> FilePath
junitConfigOutputFile :: JUnitConfig -> Maybe FilePath
junitConfigSuiteName :: JUnitConfig -> Text
junitConfigSourcePathPrefix :: JUnitConfig -> Maybe FilePath
junitConfigDropConsoleFormatting :: JUnitConfig -> Bool
junitConfigOutputDirectory :: FilePath
junitConfigOutputName :: FilePath
junitConfigOutputFile :: Maybe FilePath
junitConfigSuiteName :: Text
junitConfigSourcePathPrefix :: Maybe FilePath
junitConfigDropConsoleFormatting :: Bool
..} =
  (FilePath -> FilePath)
-> (FilePath -> FilePath -> FilePath)
-> Maybe FilePath
-> FilePath
-> FilePath
forall b a. b -> (a -> b) -> Maybe a -> b
maybe FilePath -> FilePath
forall a. a -> a
id FilePath -> FilePath -> FilePath
(</>) Maybe FilePath
junitConfigSourcePathPrefix

-- | Retrieve whether console formatting characters should be dropped from
-- failure reports.
getJUnitConfigDropConsoleFormatting :: JUnitConfig -> Bool
getJUnitConfigDropConsoleFormatting :: JUnitConfig -> Bool
getJUnitConfigDropConsoleFormatting JUnitConfig {Bool
FilePath
Maybe FilePath
Text
junitConfigOutputDirectory :: JUnitConfig -> FilePath
junitConfigOutputName :: JUnitConfig -> FilePath
junitConfigOutputFile :: JUnitConfig -> Maybe FilePath
junitConfigSuiteName :: JUnitConfig -> Text
junitConfigSourcePathPrefix :: JUnitConfig -> Maybe FilePath
junitConfigDropConsoleFormatting :: JUnitConfig -> Bool
junitConfigOutputDirectory :: FilePath
junitConfigOutputName :: FilePath
junitConfigOutputFile :: Maybe FilePath
junitConfigSuiteName :: Text
junitConfigSourcePathPrefix :: Maybe FilePath
junitConfigDropConsoleFormatting :: Bool
..} = Bool
junitConfigDropConsoleFormatting