module HaskellWorks.Hedgehog where

import Hedgehog
import Hedgehog.Internal.Property (MonadTest(..), failDiff, failWith)
import Hedgehog.Internal.Source (HasCallStack(..), withFrozenCallStack)
import Hedgehog.Internal.Show

reversed :: Group -> Group
reversed :: Group -> Group
reversed (Group GroupName
name [(PropertyName, Property)]
properties) = GroupName -> [(PropertyName, Property)] -> Group
Group GroupName
name ([(PropertyName, Property)] -> [(PropertyName, Property)]
forall a. [a] -> [a]
reverse [(PropertyName, Property)]
properties)

(/==) :: (MonadTest m, Eq a, Show a, HasCallStack) => a -> a -> m ()
/== :: a -> a -> m ()
(/==) a
x a
y = do
  Bool
ok <- (HasCallStack => m Bool) -> m Bool
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => m Bool) -> m Bool)
-> (HasCallStack => m Bool) -> m Bool
forall a b. (a -> b) -> a -> b
$ Bool -> m Bool
forall (m :: * -> *) a. (MonadTest m, HasCallStack) => a -> m a
eval (a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
y)
  if Bool
ok
    then m ()
forall (m :: * -> *). MonadTest m => m ()
success
    else (HasCallStack => m ()) -> m ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => m ()) -> m ()) -> (HasCallStack => m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ a -> a -> m ()
forall (m :: * -> *) a b.
(MonadTest m, Show a, Show b, HasCallStack) =>
a -> b -> m ()
failDiff a
x a
y

(?==) :: (MonadTest m, Eq a, Show a, HasCallStack) => a -> (a -> Bool) -> m ()
?== :: a -> (a -> Bool) -> m ()
(?==) a
x a -> Bool
p = do
  a
r <- (HasCallStack => m a) -> m a
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => m a) -> m a) -> (HasCallStack => m a) -> m a
forall a b. (a -> b) -> a -> b
$ a -> m a
forall (m :: * -> *) a. (MonadTest m, HasCallStack) => a -> m a
eval a
x
  if a -> Bool
p a
r
    then m ()
forall (m :: * -> *). MonadTest m => m ()
success
    else (HasCallStack => m ()) -> m ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => m ()) -> m ()) -> (HasCallStack => m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ Maybe Diff -> String -> m ()
forall (m :: * -> *) a.
(MonadTest m, HasCallStack) =>
Maybe Diff -> String -> m a
failWith Maybe Diff
forall a. Maybe a
Nothing (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unlines
          [ String
"━━━ Invalid result ━━━"
          , a -> String
forall a. Show a => a -> String
showPretty a
x
          ]