conduit 1.0.17 → 1.0.17.1
raw patch · 3 files changed
+100/−1 lines, 3 files
Files
- conduit.cabal +3/−1
- test/Data/Conduit/Extra/ZipConduitSpec.hs +26/−0
- test/Data/Conduit/ExtraSpec.hs +71/−0
conduit.cabal view
@@ -1,5 +1,5 @@ Name: conduit-Version: 1.0.17+Version: 1.0.17.1 Synopsis: Streaming data processing library. Description: @conduit@ is a solution to the streaming data problem, allowing for production, transformation, and consumption of streams of data in constant memory. It is an alternative to lazy I\/O which guarantees deterministic resource handling, and fits in the same general solution space as @enumerator@\/@iteratee@ and @pipes@. For a tutorial, please visit <https://haskell.fpcomplete.com/user/snoyberg/library-documentation/conduit-overview>.@@ -68,6 +68,8 @@ test-suite test hs-source-dirs: test main-is: main.hs+ other-modules: Data.Conduit.Extra.ZipConduitSpec+ Data.Conduit.ExtraSpec type: exitcode-stdio-1.0 cpp-options: -DTEST build-depends: conduit
+ test/Data/Conduit/Extra/ZipConduitSpec.hs view
@@ -0,0 +1,26 @@+module Data.Conduit.Extra.ZipConduitSpec (spec) where+import Test.Hspec+import Data.Conduit+import qualified Data.Conduit.List as CL+import Control.Applicative ((<*))++spec :: Spec+spec = describe "Data.Conduit.Extra.ZipConduit" $ do+ it "ZipConduit" $ do+ let src = mapM_ yield [1..3 :: Int]+ conduit1 = CL.map (+1)+ conduit2 = CL.concatMap (replicate 2)+ conduit = getZipConduit $ ZipConduit conduit1 <* ZipConduit conduit2+ sink = CL.consume+ res <- src $$ conduit =$ sink+ res `shouldBe` [2, 1, 1, 3, 2, 2, 4, 3, 3]+ it "sequenceConduits" $ do+ let src = mapM_ yield [1..3 :: Int]+ conduit1 = CL.map (+1)+ conduit2 = CL.concatMap (replicate 2)+ conduit = do+ x <- sequenceConduits [conduit1, conduit2]+ yield $ length x + 10+ sink = CL.consume+ res <- src $$ conduit =$ sink+ res `shouldBe` [2, 1, 1, 3, 2, 2, 4, 3, 3, 12]
+ test/Data/Conduit/ExtraSpec.hs view
@@ -0,0 +1,71 @@+module Data.Conduit.ExtraSpec where++import Data.Conduit+import Test.Hspec+import Test.Hspec.QuickCheck+import Data.Conduit.List (isolate, peek, consume)+import qualified Data.Conduit.List as CL+import qualified Data.Text as T+import qualified Data.Text.Encoding as T+import qualified Data.ByteString as S+import qualified Data.Conduit.Text as CT++spec :: Spec+spec = describe "Data.Conduit.Extra" $ do+ it "basic test" $ do+ let sink2 :: Sink a IO (Maybe a, Maybe a)+ sink2 = do+ ma1 <- fuseLeftovers id (isolate 10) peek+ ma2 <- peek+ return (ma1, ma2)++ source = yield 1 >> yield 2+ res <- source $$ sink2+ res `shouldBe` (Just 1, Just 1)++ it "get leftovers" $ do+ let sink2 :: Sink a IO ([a], [a], [a])+ sink2 = do+ (x, y) <- fuseReturnLeftovers (isolate 2) peek3+ z <- CL.consume+ return (x, y, z)++ peek3 = do+ x <- CL.take 3+ mapM_ leftover $ reverse x+ return x++ source = mapM_ yield [1..5]+ res <- source $$ sink2+ res `shouldBe` ([1..2], [1..2], [3..5])++ it "multiple values" $ do+ let sink2 :: Sink a IO ([a], Maybe a)+ sink2 = do+ ma1 <- fuseLeftovers id (isolate 10) peek3+ ma2 <- peek+ return (ma1, ma2)++ peek3 = do+ x <- CL.take 3+ mapM_ leftover $ reverse x+ return x++ source = mapM_ yield [1..5]+ res <- source $$ sink2+ res `shouldBe` ([1..3], Just 1)++ prop "more complex" $ \ss cnt -> do+ let ts = map T.pack ss+ src = mapM_ (yield . T.encodeUtf8) ts+ conduit = CL.map T.decodeUtf8+ sink = CT.take cnt =$ consume+ undo = return . T.encodeUtf8 . T.concat+ res <- src $$ do+ x <- fuseLeftovers undo conduit sink+ y <- consume+ return (T.concat x, T.decodeUtf8 $ S.concat y)+ res `shouldBe` T.splitAt cnt (T.concat ts)++main :: IO ()+main = hspec spec