{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.GenValidity.ByteString where
import qualified Data.ByteString as SB
import qualified Data.ByteString.Lazy as LB
import qualified Data.ByteString.Lazy.Internal as LB
import qualified Data.ByteString.Short as Short
import Data.GenValidity
import Data.Validity.ByteString ()
import Data.Word (Word8)
import System.Random as Random
import Test.QuickCheck
import Test.QuickCheck.Gen
import Test.QuickCheck.Random
-- |
--
-- > genValid = SB.pack <$> genValid
-- > shrinkValid = fmap SB.pack . shrinkValid . SB.unpack
instance GenValid SB.ByteString where
genValid = genStrictByteStringBy genValid
shrinkValid = fmap SB.pack . shrinkValid . SB.unpack
genStrictByteStringBy :: Gen Word8 -> Gen SB.ByteString
genStrictByteStringBy (MkGen word8Func) = do
len <- genListLength
MkGen $ \qcgen size ->
let go :: QCGen -> Maybe (Word8, QCGen)
go qcg =
let (qc1, qc2) = Random.split qcg
in Just (word8Func qc1 size, qc2)
in fst $ SB.unfoldrN len go qcgen
instance GenValid LB.ByteString where
genValid = genLazyByteStringByStrictByteString genValid
shrinkValid = fmap LB.pack . shrinkValid . LB.unpack
genLazyByteStringBy :: Gen Word8 -> Gen LB.ByteString
genLazyByteStringBy gen = genLazyByteStringByStrictByteString (genStrictByteStringBy gen)
genLazyByteStringByStrictByteString :: Gen SB.ByteString -> Gen LB.ByteString
genLazyByteStringByStrictByteString gen =
sized $ \s -> do
ss <- arbPartition s
go ss
where
go [] = pure LB.Empty
go (s : ss) = LB.Chunk <$> resize s gen <*> go ss
instance GenValid Short.ShortByteString where
genValid = Short.pack <$> genValid
shrinkValid = fmap Short.pack . shrinkValid . Short.unpack