module Test.Torch.Types where -- export ALL!

import Control.Monad.Trans (MonadIO)

-- Test and its Result.
-- Result may be a Failure.

class Test t where
    run :: (MonadIO io) => t -> io Result

class Failure f where
    describe :: f -> FailReason

data Result where
    Pass :: Result
    Fail :: (Failure f) => f -> Result

type FailReason = String


-- some-wrappers

data SomeTest where
    SomeTest :: (Test t) => t -> SomeTest

type Tests = [SomeTest]

data SomeFailure where
    SomeFailure :: (Failure f) => f -> SomeFailure

type Failures = [SomeFailure]

data Report = Report { planed,passed,failed :: Int, failures :: Failures }


-- hook

data Hook = Hook { hook_Pass ::                IO ()
                 , hook_Fail :: SomeFailure -> IO ()
                 , hook_Pre  :: Tests       -> IO ()
                 , hook_Post :: Report      -> IO ()
                 }