{-# LANGUAGE FlexibleContexts, RankNTypes #-} module Error ( tests , gen0 , genN , test ) where import qualified Control.Carrier.Error.Either as ErrorC import Control.Effect.Error import qualified Control.Monad.Trans.Except as ExceptT import qualified Catch import Data.Semigroup as S ((<>)) import Gen import qualified Monad import qualified MonadFix import Test.Tasty import qualified Throw tests :: TestTree tests = testGroup "Error" $ [ testGroup "ErrorC" $ [ testMonad , testMonadFix , testError ] >>= ($ runL ErrorC.runError) , testGroup "Either" $ testError (runL pure) , testGroup "ExceptT" $ testError (runL ExceptT.runExceptT) ] where testMonad run = Monad.test (m (gen0 e) (genN e)) a b c initial run testMonadFix run = MonadFix.test (m (gen0 e) (genN e)) a b initial run testError run = Error.test e (m (gen0 e) (genN e)) a b initial run initial = identity <*> unit gen0 :: Has (Error e) sig m => GenTerm e -> GenTerm a -> [GenTerm (m a)] gen0 = Throw.gen0 genN :: (Has (Error e) sig m, Arg e, Show e, Vary e) => GenTerm e -> GenM m -> GenTerm a -> [GenTerm (m a)] genN = Catch.genN test :: (Has (Error e) sig m, Arg a, Arg e, Eq a, Eq b, Eq e, Show a, Show b, Show e, Vary a, Vary e, Functor f) => GenTerm e -> GenM m -> GenTerm a -> GenTerm b -> GenTerm (f ()) -> Run f (Either e) m -> [TestTree] test e m = Throw.test e m S.<> Catch.test e m