packages feed

ether-0.4.0.0: test/Regression/T2.hs

module Regression.T2 (test2) where

import Control.Ether.Abbr
import qualified Control.Monad.Ether.Implicit as I
import qualified Control.Ether.Implicit.Abbr as I

import Test.Tasty
import Test.Tasty.QuickCheck

testEther :: Ether '[I.R Integer, I.R Bool] m => m String
testEther = I.local (succ :: Integer -> Integer) $ do
  n :: Integer <- I.ask
  b <- I.local not I.ask
  return (if b then "" else show n)

runner1 (n :: Integer) = flip I.runReader n . flip I.runReaderT True
runner2 (n :: Integer) = flip I.runReader True . flip I.runReaderT n

test2 :: TestTree
test2 = testGroup "T2: Implicit tags"
  [ testProperty "runner₁ works"
    $ \n -> property
    $ runner1 n testEther == show (succ n)
  , testProperty "runner₂ works"
    $ \n -> property
    $ runner2 n testEther == show (succ n)
  , testProperty "runner₁ == runner₂"
    $ \n -> property
    $ runner1 n testEther == runner2 n testEther
  ]