module Data.Conduit.LazySpec (spec) where
import qualified Data.Conduit.Lazy as CLazy
import Test.Hspec
import Control.Monad.IO.Class
import qualified Data.Conduit as C
import qualified Data.Conduit.Binary as CB
import Control.Monad.Trans.Resource
import Data.Monoid
import qualified Data.IORef as I
import Control.Monad (forever)
spec :: Spec
spec = describe "Data.Conduit.Lazy" $ do
describe "lazy" $ do
it' "works inside a ResourceT" $ runResourceT $ do
counter <- liftIO $ I.newIORef 0
let incr i = do
istate <- liftIO $ I.newIORef $ Just (i :: Int)
let loop = do
res <- liftIO $ I.atomicModifyIORef istate ((,) Nothing)
case res of
Nothing -> return ()
Just x -> do
count <- liftIO $ I.atomicModifyIORef counter
(\j -> (j + 1, j + 1))
liftIO $ count `shouldBe` i
C.yield x
loop
loop
nums <- CLazy.lazyConsume $ mconcat $ map incr [1..10]
liftIO $ nums `shouldBe` [1..10]
it' "returns nothing outside ResourceT" $ do
bss <- runResourceT $ CLazy.lazyConsume $ CB.sourceFile "test/main.hs"
bss `shouldBe` []
it' "works with pure sources" $ do
nums <- CLazy.lazyConsume $ forever $ C.yield 1
take 100 nums `shouldBe` replicate 100 (1 :: Int)
it' :: String -> IO () -> Spec
it' = it