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

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

deriving instance Typeable Qc.Result

instance Summarizable Qc.Result where
  testSummary mutantFiles results = TSum {
    tsum_numMutants = r,
    tsum_loadError = e,
    tsum_notKilled = s,
    tsum_killed = f,
    tsum_others = g,
    tsum_log = logMsg}
    where (errorCases, executedCases) = partitionEithers results
          [successCases, failureCases, gaveUpCases] = map (\c -> filter (c . snd) executedCases) [isSuccess, isFailure, isGaveUp]
          r = length results
          e = length errorCases
          [s,f,g] = map length [successCases, failureCases, gaveUpCases]
          errorFiles = mutantFiles \\ map fst executedCases
          logMsg = showAS ["Details:",
                           "Loading error files:", showA errorFiles,
                           "Loading error messages:", showA errorCases,
                           "Successes:", showA successCases,
                           "Failure:", showA failureCases,
                           "Gaveups:", showA gaveUpCases]
          isFailure :: Qc.Result -> Bool
          isFailure Qc.Failure{} = True
          isFailure _         = False
          isGaveUp :: Qc.Result -> Bool
          isGaveUp Qc.GaveUp{} = True
          isGaveUp _        = False
  isSuccess = Qc.isSuccess