{-# LANGUAGE StandaloneDeriving, DeriveDataTypeable, TypeSynonymInstances #-}
-- | Module for using Hspec tests
module Test.MuCheck.TestAdapter.Hspec where
import qualified Test.Hspec.Core.Runner as Hspec
import Test.MuCheck.TestAdapter
import Test.MuCheck.Utils.Print (showA, showAS)

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

deriving instance Typeable Hspec.Summary
type HspecSummary = Hspec.Summary

-- | Summarizable instance of `Hspec.Summary`
instance Summarizable HspecSummary 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 (Hspec.Summary { Hspec.summaryExamples = se, Hspec.summaryFailures = sf } ) = sf == 0