ether-0.4.0.2: test/Regression/T10.hs
module Regression.T10 (test10) where
import Control.Applicative
import Data.Functor.Identity
import qualified Control.Monad.Ether.Implicit as I
import Test.Tasty
import Test.Tasty.QuickCheck
testEther :: Integer -> I.StateT Integer Maybe [Integer]
testEther m = range
where
range = liftA2 (:) yield (range <|> pure [])
yield = I.stateT $ \n -> do
I.guard (n <= m)
Just (n, n + 1)
testEther' :: Integer -> I.State Integer [Integer]
testEther' m =
I.stateT $ Identity . maybe ([], m + 1) id . I.runStateT (testEther m)
next1 :: Integer -> Integer -> Maybe Integer
next1 m n
| n <= m = Just (m + 1)
| otherwise = Nothing
range1 :: Integer -> Integer -> Maybe [Integer]
range1 m n
| n <= m = Just [n..m]
| otherwise = Nothing
test10 :: TestTree
test10 = testGroup "T10: Alternative instance"
[ testProperty "execStateT works"
$ \m n -> I.execStateT (testEther m) n == next1 m n
, testProperty "evalStateT works"
$ \m n -> I.evalStateT (testEther m) n == range1 m n
, testProperty "execState works"
$ \m n -> I.execState (testEther' m) n == m + 1
, testProperty "evalState works"
$ \m n -> I.evalState (testEther' m) n == [n..m]
]