{-# LANGUAGE StandaloneDeriving, DeriveDataTypeable, TypeSynonymInstances, FlexibleInstances #-}
-- | Module for using quickcheck properties
module Test.MuCheck.TestAdapter.SmallCheck where
import qualified Test.SmallCheck.Drivers as Sc
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)

type SmallCheckSummary = Maybe Sc.PropertyFailure
deriving instance Typeable Sc.PropertyFailure

-- | Summarizable instance of `SmallCheckSummary`
instance Summarizable SmallCheckSummary where
  testSummary mutantFiles results = Summary logMsg
    where (errorCases, executedCases) = partitionEithers results
          [successCases, failureCases] = map (\c -> filter (c . snd) executedCases) [isSuccess, isFailure]
          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]
  isSuccess Nothing = True
  isSuccess _       = False