packages feed

instana-haskell-trace-sdk-0.8.0.0: test/integration/Instana/SDK/IntegrationTest/HUnitExtra.hs

module Instana.SDK.IntegrationTest.HUnitExtra
  ( SuiteResult
  , applyLabel
  , assertAllIO
  , failIO
  , mergeTestResults
  , passIO
  , skip
  ) where


import qualified Data.List                           as List
import           System.Log.Logger                   (infoM)
import           Test.HUnit                          (Assertion, Counts (..),
                                                      Test (..), assertBool,
                                                      assertFailure)

import           Instana.SDK.IntegrationTest.Logging (testLogger)


failIO :: String -> IO Test
failIO message =
  return $ TestCase $ assertFailure message


passIO :: IO Test
passIO =
  return $ TestCase $ assertBool "" True


assertAllIO :: [Assertion] -> IO Test
assertAllIO assertions =
  return $ TestList $ List.map TestCase assertions


applyLabel :: String -> IO Test -> IO Test
applyLabel label testIO = do
  infoM testLogger $ "Running: " ++ label
  t <- testIO
  return $ TestLabel label t


skip :: String -> IO Test -> IO Test
skip label _ = do
  infoM testLogger $ "Skipped: " ++ label
  return $ TestLabel label $ TestList []


type SuiteResult = (Counts, [String])


mergeTestResults :: [SuiteResult] -> SuiteResult
mergeTestResults allResults =
  let
    (counts_, fullReport) =
      List.foldl
        merge
        ( (Counts
            { cases = 0
            , tried = 0
            , errors = 0
            , failures = 0
            }
          )
        , []
        )
        allResults
  in
  (counts_, fullReport)


merge :: SuiteResult -> SuiteResult -> SuiteResult
merge (counts1, report1) (counts2, report2) =
  ( Counts
      { cases = cases counts1 + cases counts2
      , tried = tried counts1 + tried counts2
      , errors = errors counts1 + errors counts2
      , failures = failures counts1 + failures counts2
      }
  , report1 ++ report2
  )