packages feed

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
  ]