module Test.Torch.Build (
addTest
, getTests
, ok, notOk
, is, isn't
, isBottom, isn'tBottom
, Builder, runBuilder
) where
import Control.Monad.Writer
import Control.Monad.Trans (MonadIO)
import Control.Parallel.Strategies (NFData)
import Test.Torch.Types
import Test.Torch.Types.Instances
newtype Builder a = Builder { runBuilder :: WriterT Tests IO a }
deriving (Monad, MonadIO, MonadWriter Tests)
getTests :: Builder a -> IO Tests
getTests = execWriterT . runBuilder
addTest :: (Test t) => t -> Builder ()
addTest = tell . (:[]) . SomeTest
ok :: Bool -> String -> Builder ()
notOk :: Bool -> String -> Builder ()
ok b n = addTest $ mk_named n $ mk_ok b
notOk b = ok (not b)
is :: (Eq a, Show a) => a -> a -> String -> Builder ()
isn't :: (Eq a, Show a) => a -> a -> String -> Builder ()
is a b n = addTest $ mk_named n $ mk_is True a b
isn't a b n = addTest $ mk_named n $ mk_is False a b
isBottom :: (NFData a) => a -> String -> Builder ()
isn'tBottom :: (NFData a) => a -> String -> Builder ()
isBottom a n = addTest $ mk_named n $ mk_isBottom True a
isn'tBottom a n = addTest $ mk_named n $ mk_isBottom False a
mk_named :: (Test t) => String -> t -> Named
mk_named = Named
mk_ok :: Bool -> Ok
mk_ok = Ok
mk_is :: (Eq a, Show a) => Bool -> a -> a -> Is
mk_is = Is
mk_isBottom :: (NFData a) => Bool -> a -> IsBottom
mk_isBottom = IsBottom