sandwich-0.2.0.0: src/Test/Sandwich/Formatters/TerminalUI/Draw/RunTimes.hs
module Test.Sandwich.Formatters.TerminalUI.Draw.RunTimes (getRunTimes) where
import Brick
import Data.Maybe
import Data.String.Interpolate
import Data.Time.Clock
import qualified Graphics.Vty as V
import Lens.Micro
import Test.Sandwich.Formatters.Common.Util
import Test.Sandwich.Formatters.TerminalUI.AttrMap
import Test.Sandwich.Formatters.TerminalUI.Types
minGray :: Int = 50
maxGray :: Int = 255
getRunTimes app startTime endTime statusSetupTime statusTeardownTime showEllipses = raw setupWork <+> raw actualWork <+> raw teardownWork
where
totalElapsed = diffUTCTime (app ^. appCurrentTime) (app ^. appStartTime)
actualWorkTime = (diffUTCTime endTime startTime) - (fromMaybe 0 statusSetupTime) - (fromMaybe 0 statusTeardownTime)
setupWork = maybe mempty (\dt -> V.string (getAttr totalElapsed dt) [i|(#{formatNominalDiffTime dt}) + |]) statusSetupTime
actualWork = V.string (getAttr totalElapsed actualWorkTime) (formatNominalDiffTime actualWorkTime <> (if showEllipses then "..." else ""))
teardownWork = maybe mempty (\dt -> V.string (getAttr totalElapsed dt) [i| + (#{formatNominalDiffTime dt})|]) statusTeardownTime
getAttr :: NominalDiffTime -> NominalDiffTime -> V.Attr
getAttr totalElapsed dt = V.Attr {
V.attrStyle = V.Default
, V.attrForeColor = V.SetTo $ grayAt $ getLevel (realToFrac totalElapsed) (realToFrac dt)
, V.attrBackColor = V.Default
, V.attrURL = V.Default
}
getLevel :: Double -> Double -> Int
getLevel totalElapsed duration = min maxGray $ max minGray $ round (fromIntegral minGray + (intensity * (fromIntegral (maxGray - minGray))))
where
intensity :: Double = logBase (totalElapsed + 1) (duration + 1)