packages feed

ether-0.5.0.0: test/Regression/T1.hs

module Regression.T1 (test1) where

import Ether
import Data.List (group)

import Test.Tasty
import Test.Tasty.QuickCheck

data Tag1
data Tag2

testEther
  :: (MonadReader Tag1 String m, MonadReader Tag2 String m)
  => m ((String, String), (String, String))
testEther = do
  s1 <- ask @Tag1
  s2 <- ask @Tag2
  let s1s2 = (s1, s2)
  s1s2' <- local @Tag2 (map succ) $ do
    s1' <- ask @Tag1
    s2' <- ask @Tag2
    return (s1', s2')
  return (s1s2, s1s2')

runner1 s1 s2 = flip (runReader @Tag1) s1 . flip (runReaderT @Tag2) s2
runner2 s1 s2 = flip (runReader @Tag2) s2 . flip (runReaderT @Tag1) s1
runner3 s1 s2 = flip runReaders (Tagged @Tag1 s1, Tagged @Tag2 s2)

same :: Eq a => [a] -> Bool
same = (<=1) . length . group

test1 :: TestTree
test1 = testGroup "T1: Reader local environment"
  [ testProperty "runner₁ works"
      $ \s1 s2 -> property
      $ runner1 s1 s2 testEther == ((s1, s2), (s1, map succ s2))
  , testProperty "runner₂ works"
      $ \s1 s2 -> property
      $ runner2 s1 s2 testEther == ((s1, s2), (s1, map succ s2))
  , testProperty "runner₃ works"
      $ \s1 s2 -> property
      $ runner3 s1 s2 testEther == ((s1, s2), (s1, map succ s2))
  , testProperty "runner₁ == runner₂ == runner₃"
      $ \s1 s2 -> property
      $ same
        [ runner1 s1 s2 testEther
        , runner2 s1 s2 testEther
        , runner3 s1 s2 testEther ]
  ]