packages feed

pipes-bzip-0.2.0.0: test/test.hs

{-# LANGUAGE ViewPatterns #-}
import qualified Codec.Compression.BZip     as Z
import           Control.Applicative
import           Control.Monad
import           Control.Monad.Random
import qualified Data.ByteString.Char8      as S
import qualified Data.ByteString.Lazy       as LZ
import qualified Data.ByteString.Lazy.Char8 as L
import           Pipes
import qualified Pipes.ByteString           as PB
import           Pipes.BZip
import           Pipes.Safe
import           System.Directory           (removeFile)
import qualified System.IO                  as IO

import           Test.Hspec
import           Test.Hspec.QuickCheck
import           Test.QuickCheck
import           Test.QuickCheck.Property

import           Prelude                    as P

safeReadFile :: FilePath -> Producer S.ByteString (SafeT IO) ()
safeReadFile file = bracket
    (IO.openFile file IO.ReadMode)
    IO.hClose
    PB.fromHandle

safeWriteFile :: FilePath -> Consumer S.ByteString (SafeT IO) ()
safeWriteFile file = bracket
    (IO.openFile file IO.WriteMode)
    IO.hClose
    PB.toHandle

main :: IO ()
main = hspec $ do
    describe "decompress" $ do
        forM_ ["sample1", "sample2", "sample3" ] $ \file -> do
            it ("correctly " ++ file ++ ".bz2") $ do
                runSafeT $ runEffect $ bunzip2 (safeReadFile ("test/" ++ file ++ ".bz2")) >-> safeWriteFile ("test/" ++ file ++ ".check")
                dec <- L.take (10^9) <$> L.readFile ("test/" ++ file ++ ".check")
                ref <- L.readFile ("test/" ++ file ++ ".ref")
                removeFile ("test/" ++ file ++ ".check")
                dec `shouldBe` ref
    describe "compress" $ do
        forM_ ["sample1", "sample2", "sample3" ] $ \file -> do
            it ("correctly " ++ file ++ ".ref")  $ do
                runSafeT $ runEffect $ bzip2 (safeReadFile ("test/" ++ file ++ ".ref")) >-> safeWriteFile ("test/" ++ file ++ ".check2")
                bz <- L.readFile ("test/" ++ file ++ ".check2")
                ref <- L.readFile ("test/" ++ file ++ ".9.bz2")
                removeFile ("test/" ++ file ++ ".check2")
                bz `shouldBe` ref
    describe "lazy ByteString" $ do
        it "correctly 100000" $ do
            lazyCheck 100000 `shouldReturn` ()
            removeFile "test/result.dat"
        it "correctly 1000000" $ do
            lazyCheck 1000000`shouldReturn` ()
            removeFile "test/result.dat"
        it "correctly 10000000" $ do
            lazyCheck 10000000`shouldReturn` ()
            removeFile "test/result.dat"

lazyCheck :: Int -> IO ()
lazyCheck i = do
    theData <- randomData i
    let compressedData = Z.compress theData
        pipesDecompressedData = runSafeT $ PB.toLazyM $ bunzip2 (PB.fromLazy compressedData)
    LZ.writeFile "test/result.dat" =<< pipesDecompressedData


randomData :: Int -> IO L.ByteString
randomData i = L.pack . take i <$> getRandoms