packages feed

auto-update-0.1.1.2: test/Control/ReaperSpec.hs

module Control.ReaperSpec (spec) where

import Control.Reaper
import Control.Concurrent
import Test.Hspec
import Test.Hspec.QuickCheck
import Data.IORef

type Item = (Int, IORef Int)

action = mkListAction $ \(i, ref) -> do
    modifyIORef ref succ
    return $ if i > 1
             then Just (pred i, ref)
             else Nothing

spec :: Spec
spec = prop "works" $ \is -> do
    reaper <- mkReaper defaultReaperSettings
        { reaperAction = action
        , reaperDelay = 1000
        }

    let mkTestCase i = do
            ref <- newIORef 0
            let expected = (abs i `mod` 10) + 1
            reaperAdd reaper (expected, ref)
            return (expected, ref)
    testCases <- mapM mkTestCase is

    let test (expected, ref) = do
            actual <- readIORef ref
            actual `shouldBe` (expected :: Int)
    threadDelay 100000
    mapM_ test testCases
    [] <- reaperRead reaper
    return ()