{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Feedback.Test where

import Control.Monad
import qualified Data.Map as M
import Data.Time
import Feedback.Common.OptParse
import Feedback.Common.Output
import Feedback.Common.Process
import Feedback.Test.OptParse
import GHC.Clock (getMonotonicTimeNSec)
import Text.Colour.Capabilities (TerminalCapabilities (..))

#ifdef MIN_VERSION_safe_coloured_text_terminfo
import Text.Colour.Capabilities.FromEnv (getTerminalCapabilitiesFromEnv)
#endif

runFeedbackTest :: IO ()
runFeedbackTest :: IO ()
runFeedbackTest = do
  TestSettings {Map String LoopSettings
testSettingLoops :: TestSettings -> Map String LoopSettings
testSettingLoops :: Map String LoopSettings
..} <- IO TestSettings
getSettings
  TerminalCapabilities
terminalCapabilities <- IO TerminalCapabilities
getTermCaps
  ZonedTime
begin <- IO ZonedTime
getZonedTime
  let put :: [Chunk] -> IO ()
put = TerminalCapabilities -> ZonedTime -> [Chunk] -> IO ()
putTimedChunks TerminalCapabilities
terminalCapabilities ZonedTime
begin
  forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (forall k a. Map k a -> [(k, a)]
M.toList Map String LoopSettings
testSettingLoops) forall a b. (a -> b) -> a -> b
$ \(String
loopName, LoopSettings {FilterSettings
OutputSettings
RunSettings
loopSettingOutputSettings :: LoopSettings -> OutputSettings
loopSettingFilterSettings :: LoopSettings -> FilterSettings
loopSettingRunSettings :: LoopSettings -> RunSettings
loopSettingOutputSettings :: OutputSettings
loopSettingFilterSettings :: FilterSettings
loopSettingRunSettings :: RunSettings
..}) -> do
    [Chunk] -> IO ()
put [String -> Chunk
indicatorChunk String
"testing ", Chunk
" ", String -> Chunk
loopNameChunk String
loopName]
    forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Chunk] -> IO ()
put forall a b. (a -> b) -> a -> b
$ RunSettings -> [[Chunk]]
startingLines RunSettings
loopSettingRunSettings
    Word64
start <- IO Word64
getMonotonicTimeNSec
    ExitCode
ec <- RunSettings -> IO ExitCode
startProcessAndWait RunSettings
loopSettingRunSettings
    Word64
end <- IO Word64
getMonotonicTimeNSec
    [Chunk] -> IO ()
put forall a b. (a -> b) -> a -> b
$ ExitCode -> [Chunk]
exitCodeChunks ExitCode
ec
    let duration :: Word64
duration = Word64
end forall a. Num a => a -> a -> a
- Word64
start
    [Chunk] -> IO ()
put forall a b. (a -> b) -> a -> b
$ Word64 -> [Chunk]
durationChunks Word64
duration

#ifdef MIN_VERSION_safe_coloured_text_terminfo
getTermCaps :: IO TerminalCapabilities
getTermCaps :: IO TerminalCapabilities
getTermCaps = IO TerminalCapabilities
getTerminalCapabilitiesFromEnv
#else
getTermCaps :: IO TerminalCapabilities
getTermCaps = pure WithoutColours
#endif