packages feed

Z-IO-0.1.1.2: test/Z/Compression/ZlibSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Z.Compression.ZlibSpec where

import           Control.Monad
import           Data.IORef
import           Data.ByteString       as B
import           Data.ByteString.Lazy  as BL
import           Z.Data.Vector         as V
import           Z.Compression.Zlib
import qualified Codec.Compression.Zlib as TheZlib
import           Z.IO.Buffered
import           Test.QuickCheck
import           Test.QuickCheck.Function
import           Test.QuickCheck.Property
import           Test.Hspec
import           Test.Hspec.QuickCheck
import           Test.HUnit


spec :: Spec
spec = describe "zlib" $ do

    describe "decompress . compress === id" . modifyMaxSize (*50) $ do
        prop "decompress . compress === id" $ \ xs  -> do
            decompress defaultDecompressConfig
                (compress defaultCompressConfig (V.pack xs)) === V.pack xs

        prop "decompress . compress === id(with dict)" $ \ xs  -> do
            let dict = "aabbccdd"
            decompress defaultDecompressConfig{decompressDictionary = dict}
                (compress defaultCompressConfig{compressDictionary = dict} (V.pack xs))
                    === V.pack xs

        prop "compress === TheZlib.compress" $ \ xs  -> do
            V.unpack (compress defaultCompressConfig (V.pack xs)) ===
                BL.unpack (TheZlib.compressWith TheZlib.defaultCompressParams (BL.pack xs))

        prop "compress === TheZlib.compress(with dict)" $ \ xs  -> do
            V.unpack (compress defaultCompressConfig{compressDictionary = "aabbccdd"} (V.pack xs)) ===
                BL.unpack (TheZlib.compressWith
                    TheZlib.defaultCompressParams{TheZlib.compressDictionary = Just "aabbccdd" }
                        (BL.pack xs))

        prop "decompressSink . compressSource === id" $ \ xss -> do
            ref <- newIORef []
            (write, flush) <- compressSink defaultCompressConfig
                (\ x -> modifyIORef' ref (x:), return ())

            let vs = Prelude.map V.pack xss

            forM_ vs write
            flush

            source <- sourceFromList . Prelude.reverse =<< readIORef ref
            vs' <- collectSource =<< decompressSource defaultDecompressConfig source

            V.concat vs @=? V.concat vs'

        prop "decompressSink . compressSource === id(with dict)" $ \ xss -> do
            let dict = "aabbccdd"
            ref <- newIORef []
            (write, flush) <- compressSink defaultCompressConfig{compressDictionary = dict}

                (\ x -> modifyIORef' ref (x:), return ())

            let vs = Prelude.map V.pack xss

            forM_ vs write
            flush

            source <- sourceFromList . Prelude.reverse =<< readIORef ref
            vs' <- collectSource =<< decompressSource
                defaultDecompressConfig{decompressDictionary = dict} source

            V.concat vs @=? V.concat vs'