extensible-effects-2.5.1.0: test/Control/Eff/Choose/Test.hs
{-# LANGUAGE FlexibleContexts, AllowAmbiguousTypes #-}
{-# LANGUAGE TemplateHaskell #-}
module Control.Eff.Choose.Test (testGroups) where
import Test.HUnit hiding (State)
import Control.Eff
import Control.Eff.Example
import Control.Eff.Example.Test (ex2)
import Control.Eff.Exception
import Control.Eff.Lift
import Control.Eff.Choose
import Utils
import Test.Framework.TH
import Test.Framework.Providers.HUnit
testGroups = [ $(testGroupGenerator) ]
case_Choose1_exc11 :: Assertion
case_Choose1_exc11 = [2,3] @=? (run exc11)
where
exc11 = makeChoice exc1
exc1 = return 1 `add` choose [1,2]
case_Choose_ex2 :: Assertion
case_Choose_ex2 =
let ex2_1 = run . makeChoice . runErrBig $ ex2 (choose [5,7,1])
ex2_2 = run . runErrBig . makeChoice $ ex2 (choose [5,7,1])
in
assertEqual "Choose: Combining exceptions and non-determinism: ex2_1"
expected1 ex2_1
>> assertEqual "Choose: Combining exceptions and non-determinism: ex2_2"
expected2 ex2_2
where
expected1 = [Right 5,Left (TooBig 7),Right 1]
expected2 = Left (TooBig 7)
case_Choose_exRec :: Assertion
case_Choose_exRec =
let exRec_1 = run . runErrBig . makeChoice $ exRec (ex2 (choose [5,7,1]))
exRec_2 = run . makeChoice . runErrBig $ exRec (ex2 (choose [5,7,1]))
exRec_3 = run . runErrBig . makeChoice $ exRec (ex2 (choose [5,7,11,1]))
in
assertEqual "Choose: error recovery: exRec_1" expected1 exRec_1
>> assertEqual "Choose: error recovery: exRec_2" expected2 exRec_2
>> assertEqual "Choose: error recovery: exRec_1" expected3 exRec_3
where
expected1 = Right [5,7,1]
expected2 = [Right 5,Right 7,Right 1]
expected3 = Left (TooBig 11)
-- Errror recovery part
-- The code is the same as in transf1.hs. The inferred signatures differ
-- Was: exRec :: MonadError TooBig m => m Int -> m Int
-- exRec :: Member (Exc TooBig) r => Eff r Int -> Eff r Int
exRec m = catchError m handler
where handler (TooBig n) | n <= 7 = return n
handler e = throwError e
case_Choose_monadBaseControl :: Assertion
case_Choose_monadBaseControl = runLift (makeChoice $ doThing $ choose [1,2,3]) @=? Just [1,2,3]