packages feed

freer-simple-1.0.0.0: tests/Tests/Fresh.hs

module Tests.Fresh (tests) where

import Control.Monad (replicateM)

import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit ((@?=), testCase)
import Test.Tasty.QuickCheck ((==>), testProperty)

import Control.Monad.Freer (Eff, run)
import Control.Monad.Freer.Fresh (fresh, runFresh)

tests :: TestTree
tests = testGroup "Fresh tests"
  [ testCase "Start at 0, refresh twice, yields 1"
      $ testFresh 10 @?= 9
  , testProperty "Freshening n times yields (n-1)"
      $ \n -> n > 0 ==> testFresh n == (n-1)
  ]

makeFresh :: Int -> Eff r Int
makeFresh n = fst <$> runFresh 0 (last <$> replicateM n fresh)

testFresh :: Int -> Int
testFresh = run . makeFresh