hw-prim-0.6.2.17: test/HaskellWorks/Data/ByteStringSpec.hs
module HaskellWorks.Data.ByteStringSpec where
import Control.Monad
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import Test.Hspec
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import qualified HaskellWorks.Data.ByteString as BS
import qualified Hedgehog.Gen as G
import qualified Hedgehog.Range as R
{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}
spec :: Spec
spec = describe "HaskellWorks.Data.ByteStringSpec" $ do
it "resegment does not modify data" $ requireProperty $ do
bss <- forAll $ (BS.pack <$>) <$> G.list (R.linear 0 8) (G.list (R.linear 0 24) (G.word8 R.constantBounded))
chunkSize <- forAll $ G.int (R.linear 1 4)
mconcat (BS.resegment chunkSize bss) === mconcat bss
it "resegment creates correctly sized segments" $ requireProperty $ do
bss <- forAll $ (BS.pack <$>) <$> G.list (R.linear 0 8) (G.list (R.linear 0 24) (G.word8 R.constantBounded))
chunkSize <- forAll $ G.int (R.linear 1 4)
let withoutLast = reverse (drop 1 (reverse (BS.resegment chunkSize bss)))
let disalignments = (\n -> n - (n `div` chunkSize) * chunkSize) . BS.length <$> withoutLast
disalignments === replicate (length disalignments) 0
it "resegmentPadded does not modify data" $ requireProperty $ do
bss <- forAll $ (BS.pack <$>) <$> G.list (R.linear 0 8) (G.list (R.linear 0 24) (G.word8 R.constantBounded))
chunkSize <- forAll $ G.int (R.linear 1 4)
elbs <- forAll $ pure $ LBS.fromChunks bss
albs <- forAll $ pure $ LBS.take (LBS.length elbs) (LBS.fromChunks (BS.resegmentPadded chunkSize bss))
albs === elbs
it "resegmentPadded creates correctly sized segments" $ requireProperty $ do
bss <- forAll $ (BS.pack <$>) <$> G.list (R.linear 0 8) (G.list (R.linear 0 24) (G.word8 R.constantBounded))
chunkSize <- forAll $ G.int (R.linear 1 4)
forM_ (reverse (BS.resegmentPadded chunkSize bss)) $ \bs -> do
(BS.length bs) `mod` chunkSize === 0
it "rechunk does not modify data" $ requireProperty $ do
bss <- forAll $ (BS.pack <$>) <$> G.list (R.linear 0 8) (G.list (R.linear 0 24) (G.word8 R.constantBounded))
chunkSize <- forAll $ G.int (R.linear 1 4)
mconcat (BS.rechunk chunkSize bss) === mconcat bss
it "rechunk creates correctly sized segments" $ requireProperty $ do
bss <- forAll $ (BS.pack <$>) <$> G.list (R.linear 0 8) (G.list (R.linear 0 24) (G.word8 R.constantBounded))
chunkSize <- forAll $ G.int (R.linear 1 4)
forM_ (drop 1 (reverse (BS.rechunk chunkSize bss))) $ \bs -> do
(BS.length bs) `mod` chunkSize === 0