1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
{-# LANGUAGE ViewPatterns #-}
import Control.Applicative
import Control.Monad (replicateM, forM_)
import qualified Data.ByteString.Char8 as S
import qualified Data.ByteString.Lazy.Char8 as L
import Conduit
import Data.Conduit.BZlib
import System.Random
import Test.Hspec
import Test.Hspec.QuickCheck
import Prelude as P
main :: IO ()
main = hspec $ do
describe "decompress" $ do
forM_ [1..5] $ \n -> do
let file = "sample"++show n
it ("correctly " ++ file ++ ".bz2") $ do
dec <- runConduitRes
$ sourceFile ("test/" ++ file ++ ".bz2")
.| bunzip2
.| takeCE 1000000000
.| sinkLazy
ref <- L.readFile ("test/" ++ file ++ ".ref")
dec `shouldBe` ref
describe "compress" $ do
prop ". decompress == id" $ \((`mod` (2^(16 :: Int))) . abs -> n) -> do
let bsize = 8192
ss <- P.takeWhile (not. null)
. P.map (P.take bsize)
. P.iterate (P.drop bsize)
<$> replicateM (abs n) randomIO
dest <- runConduitRes
$ yieldMany (P.map S.pack ss)
.| bzip2
.| bunzip2
.| takeCE 1000000000
.| sinkLazy
dest `shouldBe` L.pack (P.concat ss)
|