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