packages feed

bzlib-0.5.3.0: test/Test.hs

module Main where

import Codec.Compression.BZip.Internal (
  CompressParams (..),
  DecompressParams (..),
  DecompressStream (..),
  compress,
  decompress,
  decompressIO,
  defaultDecompressParams,
 )
import Control.Monad (liftM2)
import qualified Data.ByteString as B
import Data.Word (Word8)
import Test.Codec.Compression.BZip.Internal ()
import Test.Codec.Compression.BZip.Stream ()
import Test.QuickCheck (Property, Testable (..), ioProperty, (==>))
import Test.Tasty (defaultMain, testGroup)
import Test.Tasty.QuickCheck (testProperty)
import Utils ()

main :: IO ()
main =
  defaultMain $
    testGroup
      "bzip tests"
      [ testProperty "decompress . compress = id (standard)" prop_decompress_after_compress
      , testProperty "decoding 66 does not throw" $ decodeByte 66
      , testProperty "decoding 67 does not throw" $ decodeByte 67
      ]

prop_decompress_after_compress
  :: CompressParams
  -> DecompressParams
  -> Property
prop_decompress_after_compress cp dp =
  decompressBufferSize dp > 0 && compressBufferSize cp > 0 ==>
    liftM2 (==) (decompress dp . compress cp) id

decodeByte :: Word8 -> Property
decodeByte w8 = case decompressIO defaultDecompressParams of
  DecompressInputRequired cont -> ioProperty $ do
    state <- cont (B.singleton w8)
    pure $ case state of
      DecompressInputRequired {} -> property True
      DecompressOutputAvailable {} -> property False
      DecompressStreamEnd {} -> property False
      DecompressStreamError {} -> property True
  _ -> property False