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