{-# 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.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 = 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