packages feed

hw-prim-0.6.2.18: test/HaskellWorks/Data/ByteStringSpec.hs

module HaskellWorks.Data.ByteStringSpec where

import Control.Monad
import Data.Foldable
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import Test.Hspec

import qualified Data.ByteString               as BS
import qualified Data.ByteString.Lazy          as LBS
import qualified Data.ByteString.Lazy.Internal as LBSI
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
  it "rechunk creates correctly sized segments" $ requireProperty $ do
    ws <- forAll $ G.list (R.linear 0 (LBSI.defaultChunkSize `div` 4)) (G.word64 R.constantBounded)
    fold (BS.toByteStrings ws) === BS.toByteString ws