{-# LANGUAGE StandaloneDeriving, DeriveDataTypeable, TypeSynonymInstances #-}
-- | Module for using quickcheck properties
module Test.MuCheck.TestAdapter.QuickCheck where
import qualified Test.QuickCheck.Test as Qc
import Test.MuCheck.TestAdapter
import Test.MuCheck.Utils.Print (showA, showAS)
import Data.Hash.MD5 (md5s, Str(..))

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

deriving instance Typeable Qc.Result
type QuickCheckSummary = Qc.Result

-- | Summarizable instance of `QuickCheck.Result`
instance Summarizable QuickCheckSummary where
  testSummary mutantFiles results = Summary logMsg
    where (errorCases, executedCases) = partitionEithers results
          [successCases, failureCases, gaveUpCases] = map (\c -> filter (c . snd) executedCases) [isSuccess, isFailure, isOther]
          errorFiles = map (\l -> ".mutants/" ++ (md5s $ Str l) ++ ".hs") 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]
  isSuccess = Qc.isSuccess
  isFailure Qc.Failure{} = True
  isFailure _            = False
  isOther   Qc.GaveUp{}  = True
  isOther   _            = False