{-# LANGUAGE RankNTypes #-}

module Signet.Unstable.Type.Test where

import qualified Control.Monad as Monad
import qualified GHC.Stack as Stack

data Test io tree = MkTest
  { forall (io :: * -> *) (tree :: * -> *).
Test io tree -> forall void. HasCallStack => String -> io void
assertFailure :: forall void. (Stack.HasCallStack) => String -> io void,
    forall (io :: * -> *) (tree :: * -> *).
Test io tree -> String -> tree () -> tree ()
describe :: String -> tree () -> tree (),
    forall (io :: * -> *) (tree :: * -> *).
Test io tree -> String -> io () -> tree ()
it :: String -> io () -> tree ()
  }

assertEq ::
  (Stack.HasCallStack, Applicative io, Eq a, Show a) =>
  Test io tree ->
  a ->
  a ->
  io ()
assertEq :: forall (io :: * -> *) a (tree :: * -> *).
(HasCallStack, Applicative io, Eq a, Show a) =>
Test io tree -> a -> a -> io ()
assertEq Test io tree
test a
expected a
actual =
  Bool -> io () -> io ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.when (a
expected a -> a -> Bool
forall a. Eq a => a -> a -> Bool
/= a
actual)
    (io () -> io ()) -> (String -> io ()) -> String -> io ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Test io tree -> forall void. HasCallStack => String -> io void
forall (io :: * -> *) (tree :: * -> *).
Test io tree -> forall void. HasCallStack => String -> io void
assertFailure Test io tree
test
    (String -> io ()) -> String -> io ()
forall a b. (a -> b) -> a -> b
$ String
"expected " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> a -> String
forall a. Show a => a -> String
show a
expected String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" but got " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> a -> String
forall a. Show a => a -> String
show a
actual