ether-0.5.0.0: test/Regression/T9.hs
module Regression.T9 (test9) where
import Ether
import Test.Tasty
import Test.Tasty.QuickCheck
data Foo
data Bar
testEther1 :: MonadState Foo Int m => m String
testEther1 = do
modify @Foo negate
gets @Foo show
testEther2 :: MonadState Bar Int m => m String
testEther2 = tagReplace @Foo @Bar testEther1
testEther
:: (MonadState Foo Int m, MonadState Bar Int m)
=> m String
testEther = do
a <- testEther1
b <- testEther2
return (a ++ b)
model :: Int -> Int -> String
model a b = show (negate a) ++ show (negate b)
runner1 a b
= flip (evalState @Foo) a
. flip (evalStateT @Bar) b
runner2 a b
= flip (evalState @Bar) b
. flip (evalStateT @Foo) a
test9 :: TestTree
test9 = testGroup "T9: Tag replacement"
[ testProperty "runner₁ works"
$ \a b -> property
$ runner1 a b testEther == model a b
, testProperty "runner₂ works"
$ \a b -> property
$ runner2 a b testEther == model a b
, testProperty "runner₁ == runner₂"
$ \a b -> property
$ runner1 a b testEther == runner2 a b testEther
]