{-# 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 :: Map String LoopSettings
testSettingLoops :: TestSettings -> 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
  [(String, LoopSettings)]
-> ((String, LoopSettings) -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (Map String LoopSettings -> [(String, LoopSettings)]
forall k a. Map k a -> [(k, a)]
M.toList Map String LoopSettings
testSettingLoops) (((String, LoopSettings) -> IO ()) -> IO ())
-> ((String, LoopSettings) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \(String
loopName, LoopSettings {HooksSettings
OutputSettings
FilterSettings
RunSettings
loopSettingRunSettings :: RunSettings
loopSettingFilterSettings :: FilterSettings
loopSettingOutputSettings :: OutputSettings
loopSettingHooksSettings :: HooksSettings
loopSettingRunSettings :: LoopSettings -> RunSettings
loopSettingFilterSettings :: LoopSettings -> FilterSettings
loopSettingOutputSettings :: LoopSettings -> OutputSettings
loopSettingHooksSettings :: LoopSettings -> HooksSettings
..}) -> do
    [Chunk] -> IO ()
put [String -> Chunk
indicatorChunk String
"testing ", Chunk
" ", String -> Chunk
loopNameChunk String
loopName]
    ([Chunk] -> IO ()) -> [[Chunk]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ [Chunk] -> IO ()
put ([[Chunk]] -> IO ()) -> [[Chunk]] -> IO ()
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 ([Chunk] -> IO ()) -> [Chunk] -> IO ()
forall a b. (a -> b) -> a -> b
$ ExitCode -> [Chunk]
exitCodeChunks ExitCode
ec
    let duration :: Word64
duration = Word64
end Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word64
start
    [Chunk] -> IO ()
put ([Chunk] -> IO ()) -> [Chunk] -> IO ()
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