packages feed

effectful-2.1.0.0: tests/ReaderTests.hs

module ReaderTests (readerTests) where

import Test.Tasty
import Test.Tasty.HUnit

import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Reader.Dynamic
import qualified Utils as U

readerTests :: TestTree
readerTests = testGroup "Reader"
  [ testCase "local works in handlers (dynamic/static)" $ test_localInHandler runReader
  , testCase "local works in handlers (dynamic/pure)" $ test_localInHandler runPureReader
  ]

data SomeEff :: Effect where
  SomeAction :: SomeEff m ()

type instance DispatchOf SomeEff = Dynamic

test_localInHandler
  :: (forall r es a. r -> Eff (Reader r : es) a -> Eff es a)
  -> Assertion
test_localInHandler runR = runEff . runR "global" . interpret f $ do
  local (const "local") $ send SomeAction
  where
    f :: [IOE, Reader String] :>> es => EffectHandler SomeEff es
    f _ SomeAction = U.assertEqual "expected result" "local" =<< ask

-- | Purely dynamic Reader for testing purposes.
runPureReader :: r -> Eff (Reader r : es) a -> Eff es a
runPureReader r0 = interpret (handler r0)
  where
    handler :: r -> EffectHandler (Reader r) handlerEs
    handler r env = \case
      Ask       -> pure r
      Local f m -> localSeqUnlift env $ \unlift -> do
        unlift $ interpose (handler $ f r) m