{-# LANGUAGE ScopedTypeVariables #-} module UnliftIO.ReaperSpec (spec) where import Control.Concurrent import Data.IORef import Test.Hspec import Test.Hspec.QuickCheck import UnliftIO.Reaper spec :: Spec spec = do prop "works" $ \(is :: [Int]) -> 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 () type Item = (Int, IORef Int) action :: [Item] -> IO ([Item] -> [Item]) action = mkListAction $ \(i, ref) -> do modifyIORef ref succ return $ if i > 1 then Just (pred i, ref) else Nothing