Blame test/Data/Conduit/ExtraSpec.hs

Packit 4b2029
module Data.Conduit.ExtraSpec where
Packit 4b2029
Packit 4b2029
import Data.Conduit
Packit 4b2029
import Test.Hspec
Packit 4b2029
import Test.Hspec.QuickCheck
Packit 4b2029
import Data.Conduit.List (isolate, peek, consume)
Packit 4b2029
import qualified Data.Conduit.List as CL
Packit 4b2029
import qualified Data.Text as T
Packit 4b2029
import qualified Data.Text.Encoding as T
Packit 4b2029
import qualified Data.ByteString as S
Packit 4b2029
import qualified Data.Conduit.Text as CT
Packit 4b2029
Packit 4b2029
spec :: Spec
Packit 4b2029
spec = describe "Data.Conduit.Extra" $ do
Packit 4b2029
    it "basic test" $ do
Packit 4b2029
        let sink2 :: Sink a IO (Maybe a, Maybe a)
Packit 4b2029
            sink2 = do
Packit 4b2029
                ma1 <- fuseLeftovers id (isolate 10) peek
Packit 4b2029
                ma2 <- peek
Packit 4b2029
                return (ma1, ma2)
Packit 4b2029
Packit 4b2029
            source = yield 1 >> yield 2
Packit 4b2029
        res <- source $$ sink2
Packit 4b2029
        res `shouldBe` (Just 1, Just 1)
Packit 4b2029
Packit 4b2029
    it "get leftovers" $ do
Packit 4b2029
        let sink2 :: Sink a IO ([a], [a], [a])
Packit 4b2029
            sink2 = do
Packit 4b2029
                (x, y) <- fuseReturnLeftovers (isolate 2) peek3
Packit 4b2029
                z <- CL.consume
Packit 4b2029
                return (x, y, z)
Packit 4b2029
Packit 4b2029
            peek3 = do
Packit 4b2029
                x <- CL.take 3
Packit 4b2029
                mapM_ leftover $ reverse x
Packit 4b2029
                return x
Packit 4b2029
Packit 4b2029
            source = mapM_ yield [1..5]
Packit 4b2029
        res <- source $$ sink2
Packit 4b2029
        res `shouldBe` ([1..2], [1..2], [3..5])
Packit 4b2029
Packit 4b2029
    it "multiple values" $ do
Packit 4b2029
        let sink2 :: Sink a IO ([a], Maybe a)
Packit 4b2029
            sink2 = do
Packit 4b2029
                ma1 <- fuseLeftovers id (isolate 10) peek3
Packit 4b2029
                ma2 <- peek
Packit 4b2029
                return (ma1, ma2)
Packit 4b2029
Packit 4b2029
            peek3 = do
Packit 4b2029
                x <- CL.take 3
Packit 4b2029
                mapM_ leftover $ reverse x
Packit 4b2029
                return x
Packit 4b2029
Packit 4b2029
            source = mapM_ yield [1..5]
Packit 4b2029
        res <- source $$ sink2
Packit 4b2029
        res `shouldBe` ([1..3], Just 1)
Packit 4b2029
Packit 4b2029
    prop "more complex" $ \ss cnt -> do
Packit 4b2029
        let ts = map T.pack ss
Packit 4b2029
            src = mapM_ (yield . T.encodeUtf8) ts
Packit 4b2029
            conduit = CL.map T.decodeUtf8
Packit 4b2029
            sink = CT.take cnt =$ consume
Packit 4b2029
            undo = return . T.encodeUtf8 . T.concat
Packit 4b2029
        res <- src $$ do
Packit 4b2029
            x <- fuseLeftovers undo conduit sink
Packit 4b2029
            y <- consume
Packit 4b2029
            return (T.concat x, T.decodeUtf8 $ S.concat y)
Packit 4b2029
        res `shouldBe` T.splitAt cnt (T.concat ts)
Packit 4b2029
Packit 4b2029
main :: IO ()
Packit 4b2029
main = hspec spec