module Test.Tasty.Silver.Interactive.Run
( wrapRunTest
)
where
import Test.Tasty hiding (defaultMain)
import Test.Tasty.Runners
import Test.Tasty.Options
import Data.Typeable
import Data.Tagged
import Test.Tasty.Providers
data CustomTestExec t = IsTest t => CustomTestExec t (OptionSet -> t -> (Progress -> IO ()) -> IO Result)
deriving (Typeable)
instance IsTest t => IsTest (CustomTestExec t) where
run opts (CustomTestExec t r) cb = r opts t cb
testOptions = retag $ (testOptions :: Tagged t [OptionDescription])
type TestPath = String
wrapRunTest :: (forall t . IsTest t => TestPath -> TestName -> OptionSet -> t -> (Progress -> IO ()) -> IO Result)
-> TestTree
-> TestTree
wrapRunTest = wrapRunTest' "/"
wrapRunTest' :: TestPath
-> (forall t . IsTest t => TestPath -> TestName -> OptionSet -> t -> (Progress -> IO ()) -> IO Result)
-> TestTree
-> TestTree
wrapRunTest' tp f (SingleTest n t) = SingleTest n (CustomTestExec t (f (tp <//> n) n))
wrapRunTest' tp f (TestGroup n ts) = TestGroup n (fmap (wrapRunTest' (tp <//> n) f) ts)
wrapRunTest' tp f (PlusTestOptions o t) = PlusTestOptions o (wrapRunTest' tp f t)
wrapRunTest' tp f (WithResource r t) = WithResource r (\x -> wrapRunTest' tp f (t x))
wrapRunTest' tp f (AskOptions t) = AskOptions (\o -> wrapRunTest' tp f (t o))
(<//>) :: TestPath -> TestPath -> TestPath
a <//> b = a ++ "/" ++ b