content: {-# LANGUAGE CPP #-}
  module Test.Hspec.Core.Runner.Result (
  -- RE-EXPORTED from Test.Hspec.Core.Runner
    SpecResult(SpecResult)
  , specResultItems
  , specResultSuccess
  
  , ResultItem(ResultItem)
  , resultItemPath
  , resultItemStatus
  , resultItemIsFailure
  
  , ResultItemStatus(..)
  
  , Summary(..)
  , toSummary
  , isSuccess
  -- END RE-EXPORTED from Test.Hspec.Core.Runner
  
  , toSpecResult
  ) where
  
  import           Prelude ()
  import           Test.Hspec.Core.Compat
  
  import           Test.Hspec.Core.Util
  import qualified Test.Hspec.Core.Format as Format
  
  -- |
  -- @since 2.10.0
  data SpecResult = SpecResult {
    -- |
    -- @since 2.10.0
    specResultItems :: [ResultItem]
  
    -- |
    -- @since 2.10.0
  , specResultSuccess :: !Bool
  } deriving (Eq, Show)
  
  -- |
  -- @since 2.10.0
  data ResultItem = ResultItem {
    -- |
    -- @since 2.10.0
    resultItemPath :: Path
  
    -- |
    -- @since 2.10.0
  , resultItemStatus :: ResultItemStatus
  } deriving (Eq, Show)
  
  -- |
  -- @since 2.10.0
  resultItemIsFailure :: ResultItem -> Bool
  resultItemIsFailure item = case resultItemStatus item of
    ResultItemSuccess -> False
    ResultItemPending -> False
    ResultItemFailure -> True
  
  data ResultItemStatus =
      ResultItemSuccess
    | ResultItemPending
    | ResultItemFailure
    deriving (Eq, Show)
  
  toSpecResult :: [(Path, Format.Item)] -> SpecResult
  toSpecResult results = SpecResult items success
    where
      items = map toResultItem results
      success = all (not . resultItemIsFailure) items
  
  toResultItem :: (Path, Format.Item) -> ResultItem
  toResultItem (path, item) = ResultItem path status
    where
      status = case Format.itemResult item of
        Format.Success{} -> ResultItemSuccess
        Format.Pending{} -> ResultItemPending
        Format.Failure{} -> ResultItemFailure
  
  -- | Summary of a test run.
  data Summary = Summary {
    summaryExamples :: !Int
  , summaryFailures :: !Int
  } deriving (Eq, Show)
  
  instance Monoid Summary where
    mempty = Summary 0 0
  #if MIN_VERSION_base(4,11,0)
  instance Semigroup Summary where
  #endif
    (Summary x1 x2)
  #if MIN_VERSION_base(4,11,0)
      <>
  #else
      `mappend`
  #endif
      (Summary y1 y2) = Summary (x1 + y1) (x2 + y2)
  
  toSummary :: SpecResult -> Summary
  toSummary result = Summary {
    summaryExamples = length items
  , summaryFailures = length failures
  } where
      items = specResultItems result
      failures = filter resultItemIsFailure items
  
  -- | `True` if the given `Summary` indicates that there were no
  -- failures, `False` otherwise.
  isSuccess :: Summary -> Bool
  isSuccess summary = summaryFailures summary == 0
  