packages feed

classy-prelude-conduit-0.4.2: test/Data/Conduit/ContainerSpec.hs

module Data.Conduit.ContainerSpec where

import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck.Arbitrary
import Data.Conduit.Classy
import qualified Data.Conduit.Container as C
import Data.Functor.Identity (Identity, runIdentity)
import qualified Data.ByteString as S
import qualified Data.ByteString.Lazy as L

spec :: Spec
spec = do
    describe "Singleton" $ do
        prop "consumes" $ \x ->
            runIdentity ((C.toSource x :: Source Identity (C.Singleton Int)) $$ C.consume) == x
        prop "takes" $ \str i' ->
            let x = (C.toSource str :: Source Identity (C.Singleton Char)) $$ C.take i
                i = abs i'
             in runIdentity x == take i str
    describe "ByteString" $ do
        prop "consumes" $ \(ArbLByteString x) ->
            runIdentity ((C.toSource x :: Source Identity S.ByteString) $$ C.consume) == x
        prop "takes" $ \(ArbLByteString str) i' ->
            let x = (C.toSource str :: Source Identity S.ByteString) $$ C.take i
                i = abs i'
             in runIdentity x == L.take (fromIntegral i) str

newtype ArbByteString = ArbByteString { unArbByteString :: S.ByteString }
    deriving Show

instance Arbitrary ArbByteString where
    arbitrary = fmap (ArbByteString . S.pack) arbitrary

newtype ArbLByteString = ArbLByteString L.ByteString
    deriving Show

instance Arbitrary ArbLByteString where
    arbitrary = fmap (ArbLByteString . L.fromChunks . map unArbByteString) arbitrary