{-# LANGUAGE StandaloneDeriving, DeriveDataTypeable #-}
module MuCheck.Run.Hspec where
import qualified Test.Hspec.Core.Runner as Hspec
import MuCheck.Run.Common
import MuCheck.Utils.Print (showA, showAS)

import Data.Typeable
import Data.Either (partitionEithers)
import Data.List((\\))

deriving instance Typeable Hspec.Summary

instance Summarizable Hspec.Summary where
  testSummary mutantFiles results = TSum {
    tsum_numMutants = r,
    tsum_loadError = e,
    tsum_notKilled = s,
    tsum_killed = f,
    tsum_others = 0,
    tsum_log = logMsg}
      where (errorCases, executedCases) = partitionEithers results
            r = length results
            e = length errorCases
            [successCases, failureCases] = map (\c -> filter (c . snd) executedCases) [isSuccess, isFailure]
            [s,f] = map length [successCases, failureCases]
            errorFiles = mutantFiles \\ map fst executedCases
            logMsg = showAS ["Details:",
                             "Loading error files:", showA errorFiles,
                             "Loading error messages:", showA errorCases,
                             "Successes:", showA successCases,
                             "Failure:", showA failureCases]
            isFailure = not . isSuccess
  isSuccess (Hspec.Summary { Hspec.summaryExamples = se, Hspec.summaryFailures = sf } ) = sf == 0