{-# options_haddock prune #-}
module Polysemy.Test.Hedgehog where
import Control.Monad.Trans.Except (runExceptT)
import qualified Control.Monad.Trans.Writer.Lazy as MTL
import GHC.Stack (withFrozenCallStack)
import qualified Hedgehog as Native
import Hedgehog.Internal.Property (Failure, Journal, TestT (TestT), failWith)
import qualified Polysemy.Test.Data.Hedgehog as Hedgehog
import Polysemy.Test.Data.Hedgehog (Hedgehog, liftH)
interpretHedgehog ::
Member (Embed (TestT m)) r =>
InterpreterFor (Hedgehog m) r
interpretHedgehog :: forall (m :: * -> *) (r :: [(* -> *) -> * -> *]).
Member (Embed (TestT m)) r =>
InterpreterFor (Hedgehog m) r
interpretHedgehog =
(forall (rInitial :: [(* -> *) -> * -> *]) x.
Hedgehog m (Sem rInitial) x -> Sem r x)
-> Sem (Hedgehog m : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
Hedgehog.LiftH TestT m x
t ->
TestT m x -> Sem r x
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
embed TestT m x
t
rewriteHedgehog ::
Members [Error Failure, Writer Journal, Embed m] r =>
InterpreterFor (Hedgehog m) r
rewriteHedgehog :: forall (m :: * -> *) (r :: [(* -> *) -> * -> *]).
Members '[Error Failure, Writer Journal, Embed m] r =>
InterpreterFor (Hedgehog m) r
rewriteHedgehog =
(forall (rInitial :: [(* -> *) -> * -> *]) x.
Hedgehog m (Sem rInitial) x -> Sem r x)
-> Sem (Hedgehog m : r) a -> Sem r a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]) a.
FirstOrder e "interpret" =>
(forall (rInitial :: [(* -> *) -> * -> *]) x.
e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
Hedgehog.LiftH (TestT ExceptT Failure (WriterT Journal m) x
t) -> do
(Either Failure x
result, Journal
journal) <- m (Either Failure x, Journal) -> Sem r (Either Failure x, Journal)
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]) a.
Member (Embed m) r =>
m a -> Sem r a
embed (WriterT Journal m (Either Failure x)
-> m (Either Failure x, Journal)
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
MTL.runWriterT (ExceptT Failure (WriterT Journal m) x
-> WriterT Journal m (Either Failure x)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT ExceptT Failure (WriterT Journal m) x
t))
Journal -> Sem r ()
forall o (r :: [(* -> *) -> * -> *]).
MemberWithError (Writer o) r =>
o -> Sem r ()
tell Journal
journal
Either Failure x -> Sem r x
forall e (r :: [(* -> *) -> * -> *]) a.
Member (Error e) r =>
Either e a -> Sem r a
fromEither Either Failure x
result
assert ::
∀ m r .
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
Bool ->
Sem r ()
assert :: forall (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Monad m, HasCallStack, Member (Hedgehog m) r) =>
Bool -> Sem r ()
assert Bool
a =
(HasCallStack => Sem r ()) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall (m :: * -> *) a (r :: [(* -> *) -> * -> *]).
Member (Hedgehog m) r =>
TestT m a -> Sem r a
liftH @m (Bool -> TestT m ()
forall (m :: * -> *). (MonadTest m, HasCallStack) => Bool -> m ()
Native.assert Bool
a)
infix 4 ===
(===) ::
∀ a m r .
Monad m =>
Eq a =>
Show a =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
a ->
Sem r ()
a
a === :: forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Monad m, Eq a, Show a, HasCallStack, Member (Hedgehog m) r) =>
a -> a -> Sem r ()
=== a
b =
(HasCallStack => Sem r ()) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall (m :: * -> *) a (r :: [(* -> *) -> * -> *]).
Member (Hedgehog m) r =>
TestT m a -> Sem r a
liftH @m (a
a a -> a -> TestT m ()
forall (m :: * -> *) a.
(MonadTest m, Eq a, Show a, HasCallStack) =>
a -> a -> m ()
Native.=== a
b)
infix 4 /==
assertEq ::
∀ a m r .
Monad m =>
Eq a =>
Show a =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
a ->
Sem r ()
assertEq :: forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Monad m, Eq a, Show a, HasCallStack, Member (Hedgehog m) r) =>
a -> a -> Sem r ()
assertEq a
a a
b =
(HasCallStack => Sem r ()) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall (m :: * -> *) a (r :: [(* -> *) -> * -> *]).
Member (Hedgehog m) r =>
TestT m a -> Sem r a
liftH @m (a
a a -> a -> TestT m ()
forall (m :: * -> *) a.
(MonadTest m, Eq a, Show a, HasCallStack) =>
a -> a -> m ()
Native.=== a
b)
(/==) ::
∀ a m r .
Monad m =>
Eq a =>
Show a =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
a ->
Sem r ()
a
a /== :: forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Monad m, Eq a, Show a, HasCallStack, Member (Hedgehog m) r) =>
a -> a -> Sem r ()
/== a
b =
(HasCallStack => Sem r ()) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall (m :: * -> *) a (r :: [(* -> *) -> * -> *]).
Member (Hedgehog m) r =>
TestT m a -> Sem r a
liftH @m (a
a a -> a -> TestT m ()
forall (m :: * -> *) a.
(MonadTest m, Eq a, Show a, HasCallStack) =>
a -> a -> m ()
Native./== a
b)
assertNeq ::
∀ a m r .
Monad m =>
Eq a =>
Show a =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
a ->
Sem r ()
assertNeq :: forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Monad m, Eq a, Show a, HasCallStack, Member (Hedgehog m) r) =>
a -> a -> Sem r ()
assertNeq a
a a
b =
(HasCallStack => Sem r ()) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall (m :: * -> *) a (r :: [(* -> *) -> * -> *]).
Member (Hedgehog m) r =>
TestT m a -> Sem r a
liftH @m (a
a a -> a -> TestT m ()
forall (m :: * -> *) a.
(MonadTest m, Eq a, Show a, HasCallStack) =>
a -> a -> m ()
Native./== a
b)
evalEither ::
∀ a m e r .
Show e =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
Either e a ->
Sem r a
evalEither :: forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Show e, Monad m, HasCallStack, Member (Hedgehog m) r) =>
Either e a -> Sem r a
evalEither Either e a
e =
(HasCallStack => Sem r a) -> Sem r a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall (m :: * -> *) a (r :: [(* -> *) -> * -> *]).
Member (Hedgehog m) r =>
TestT m a -> Sem r a
liftH @m (Either e a -> TestT m a
forall (m :: * -> *) x a.
(MonadTest m, Show x, HasCallStack) =>
Either x a -> m a
Native.evalEither Either e a
e)
assertRight ::
∀ a m e r .
Eq a =>
Show e =>
Show a =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
Either e a ->
Sem r ()
assertRight :: forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Eq a, Show e, Show a, Monad m, HasCallStack,
Member (Hedgehog m) r) =>
a -> Either e a -> Sem r ()
assertRight a
a =
(HasCallStack => Either e a -> Sem r ()) -> Either e a -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Monad m, Eq a, Show a, HasCallStack, Member (Hedgehog m) r) =>
a -> a -> Sem r ()
assertEq @_ @m a
a (a -> Sem r ())
-> (Either e a -> Sem r a) -> Either e a -> Sem r ()
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Show e, Monad m, HasCallStack, Member (Hedgehog m) r) =>
Either e a -> Sem r a
evalEither @_ @m
assertRight2 ::
∀ a m e1 e2 r .
Eq a =>
Show e1 =>
Show e2 =>
Show a =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
Either e1 (Either e2 a) ->
Sem r ()
assertRight2 :: forall a (m :: * -> *) e1 e2 (r :: [(* -> *) -> * -> *]).
(Eq a, Show e1, Show e2, Show a, Monad m, HasCallStack,
Member (Hedgehog m) r) =>
a -> Either e1 (Either e2 a) -> Sem r ()
assertRight2 a
a =
(HasCallStack => Either e1 (Either e2 a) -> Sem r ())
-> Either e1 (Either e2 a) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Eq a, Show e, Show a, Monad m, HasCallStack,
Member (Hedgehog m) r) =>
a -> Either e a -> Sem r ()
assertRight @_ @m a
a (Either e2 a -> Sem r ())
-> (Either e1 (Either e2 a) -> Sem r (Either e2 a))
-> Either e1 (Either e2 a)
-> Sem r ()
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Show e, Monad m, HasCallStack, Member (Hedgehog m) r) =>
Either e a -> Sem r a
evalEither @_ @m
assertRight3 ::
∀ a m e1 e2 e3 r .
Eq a =>
Show e1 =>
Show e2 =>
Show e3 =>
Show a =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
Either e1 (Either e2 (Either e3 a)) ->
Sem r ()
assertRight3 :: forall a (m :: * -> *) e1 e2 e3 (r :: [(* -> *) -> * -> *]).
(Eq a, Show e1, Show e2, Show e3, Show a, Monad m, HasCallStack,
Member (Hedgehog m) r) =>
a -> Either e1 (Either e2 (Either e3 a)) -> Sem r ()
assertRight3 a
a =
(HasCallStack => Either e1 (Either e2 (Either e3 a)) -> Sem r ())
-> Either e1 (Either e2 (Either e3 a)) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall a (m :: * -> *) e1 e2 (r :: [(* -> *) -> * -> *]).
(Eq a, Show e1, Show e2, Show a, Monad m, HasCallStack,
Member (Hedgehog m) r) =>
a -> Either e1 (Either e2 a) -> Sem r ()
assertRight2 @_ @m a
a (Either e2 (Either e3 a) -> Sem r ())
-> (Either e1 (Either e2 (Either e3 a))
-> Sem r (Either e2 (Either e3 a)))
-> Either e1 (Either e2 (Either e3 a))
-> Sem r ()
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Show e, Monad m, HasCallStack, Member (Hedgehog m) r) =>
Either e a -> Sem r a
evalEither @_ @m
evalLeft ::
∀ a m e r .
Show a =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
Either e a ->
Sem r e
evalLeft :: forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Show a, Monad m, HasCallStack, Member (Hedgehog m) r) =>
Either e a -> Sem r e
evalLeft = \case
Right a
a ->
(HasCallStack => Sem r e) -> Sem r e
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall (m :: * -> *) a (r :: [(* -> *) -> * -> *]).
Member (Hedgehog m) r =>
TestT m a -> Sem r a
liftH @m (Maybe Diff -> String -> TestT m e
forall (m :: * -> *) a.
(MonadTest m, HasCallStack) =>
Maybe Diff -> String -> m a
failWith Maybe Diff
forall a. Maybe a
Nothing (a -> String
forall b a. (Show a, IsString b) => a -> b
show a
a))
Left e
e ->
e -> Sem r e
forall (f :: * -> *) a. Applicative f => a -> f a
pure e
e
assertLeft ::
∀ a m e r .
Eq e =>
Show e =>
Show a =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
e ->
Either e a ->
Sem r ()
assertLeft :: forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Eq e, Show e, Show a, Monad m, HasCallStack,
Member (Hedgehog m) r) =>
e -> Either e a -> Sem r ()
assertLeft e
e =
(HasCallStack => Either e a -> Sem r ()) -> Either e a -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Monad m, Eq a, Show a, HasCallStack, Member (Hedgehog m) r) =>
a -> a -> Sem r ()
assertEq @_ @m e
e (e -> Sem r ())
-> (Either e a -> Sem r e) -> Either e a -> Sem r ()
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Show a, Monad m, HasCallStack, Member (Hedgehog m) r) =>
Either e a -> Sem r e
evalLeft @_ @m
data ValueIsNothing =
ValueIsNothing
deriving Int -> ValueIsNothing -> ShowS
[ValueIsNothing] -> ShowS
ValueIsNothing -> String
(Int -> ValueIsNothing -> ShowS)
-> (ValueIsNothing -> String)
-> ([ValueIsNothing] -> ShowS)
-> Show ValueIsNothing
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ValueIsNothing] -> ShowS
$cshowList :: [ValueIsNothing] -> ShowS
show :: ValueIsNothing -> String
$cshow :: ValueIsNothing -> String
showsPrec :: Int -> ValueIsNothing -> ShowS
$cshowsPrec :: Int -> ValueIsNothing -> ShowS
Show
evalMaybe ::
∀ a m r .
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
Maybe a ->
Sem r a
evalMaybe :: forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Monad m, HasCallStack, Member (Hedgehog m) r) =>
Maybe a -> Sem r a
evalMaybe Maybe a
ma =
(HasCallStack => Sem r a) -> Sem r a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Show e, Monad m, HasCallStack, Member (Hedgehog m) r) =>
Either e a -> Sem r a
evalEither @_ @m (ValueIsNothing -> Maybe a -> Either ValueIsNothing a
forall l r. l -> Maybe r -> Either l r
maybeToRight ValueIsNothing
ValueIsNothing Maybe a
ma)
assertJust ::
∀ a m r .
Eq a =>
Show a =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
Maybe a ->
Sem r ()
assertJust :: forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Eq a, Show a, Monad m, HasCallStack, Member (Hedgehog m) r) =>
a -> Maybe a -> Sem r ()
assertJust a
target Maybe a
ma =
(HasCallStack => Sem r ()) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Eq a, Show e, Show a, Monad m, HasCallStack,
Member (Hedgehog m) r) =>
a -> Either e a -> Sem r ()
assertRight @_ @m a
target (ValueIsNothing -> Maybe a -> Either ValueIsNothing a
forall l r. l -> Maybe r -> Either l r
maybeToRight ValueIsNothing
ValueIsNothing Maybe a
ma)
evalError ::
∀ e a m r .
Show e =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
Sem (Error e : r) a ->
Sem r a
evalError :: forall e a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Show e, Monad m, HasCallStack, Member (Hedgehog m) r) =>
Sem (Error e : r) a -> Sem r a
evalError Sem (Error e : r) a
sem =
(HasCallStack => Sem r a) -> Sem r a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall a (m :: * -> *) e (r :: [(* -> *) -> * -> *]).
(Show e, Monad m, HasCallStack, Member (Hedgehog m) r) =>
Either e a -> Sem r a
evalEither @_ @m (Either e a -> Sem r a) -> Sem r (Either e a) -> Sem r a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sem (Error e : r) a -> Sem r (Either e a)
forall e (r :: [(* -> *) -> * -> *]) a.
Sem (Error e : r) a -> Sem r (Either e a)
runError Sem (Error e : r) a
sem
assertCloseBy ::
∀ a m r .
Num a =>
Ord a =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
a ->
a ->
Sem r ()
assertCloseBy :: forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Num a, Ord a, Monad m, HasCallStack, Member (Hedgehog m) r) =>
a -> a -> a -> Sem r ()
assertCloseBy a
delta a
target a
scrutinee =
(HasCallStack => Sem r ()) -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Monad m, HasCallStack, Member (Hedgehog m) r) =>
Bool -> Sem r ()
assert @m (a -> a
forall a. Num a => a -> a
abs (a
scrutinee a -> a -> a
forall a. Num a => a -> a -> a
- a
target) a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
delta)
assertClose ::
∀ a m r .
Ord a =>
Fractional a =>
Monad m =>
HasCallStack =>
Member (Hedgehog m) r =>
a ->
a ->
Sem r ()
assertClose :: forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Ord a, Fractional a, Monad m, HasCallStack,
Member (Hedgehog m) r) =>
a -> a -> Sem r ()
assertClose =
(HasCallStack => a -> a -> Sem r ()) -> a -> a -> Sem r ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack do
forall a (m :: * -> *) (r :: [(* -> *) -> * -> *]).
(Num a, Ord a, Monad m, HasCallStack, Member (Hedgehog m) r) =>
a -> a -> a -> Sem r ()
assertCloseBy @_ @m a
0.001