{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Test.QuickCheck.Instances.ByteString () where
import Prelude ()
import Test.QuickCheck.Instances.CustomPrelude
import Data.Word (Word8)
import Test.QuickCheck
import Test.QuickCheck.Gen
import Test.QuickCheck.Random (QCGen (..))
import qualified System.Random.SplitMix as SM
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Short as SBS
instance Arbitrary BS.ByteString where
arbitrary :: Gen ByteString
arbitrary = forall a. (QCGen -> Int -> a) -> Gen a
MkGen forall a b. (a -> b) -> a -> b
$ \(QCGen SMGen
g0) Int
size ->
if Int
size forall a. Ord a => a -> a -> Bool
<= Int
0
then ByteString
BS.empty
else
let (Int
i, SMGen
g1) = SMGen -> (Int, SMGen)
SM.nextInt SMGen
g0
size' :: Int
size' = Int
i forall a. Integral a => a -> a -> a
`mod` Int
size
in forall a b. (a, b) -> a
fst (forall a.
Int -> (a -> Maybe (Word8, a)) -> a -> (ByteString, Maybe a)
BS.unfoldrN Int
size' SMGen -> Maybe (Word8, SMGen)
gen SMGen
g1)
where
gen :: SM.SMGen -> Maybe (Word8, SM.SMGen)
gen :: SMGen -> Maybe (Word8, SMGen)
gen !SMGen
g = forall a. a -> Maybe a
Just (forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
w64, SMGen
g')
where
~(Word64
w64, SMGen
g') = SMGen -> (Word64, SMGen)
SM.nextWord64 SMGen
g
shrink :: ByteString -> [ByteString]
shrink ByteString
xs = [Word8] -> ByteString
BS.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => a -> [a]
shrink (ByteString -> [Word8]
BS.unpack ByteString
xs)
instance CoArbitrary BS.ByteString where
coarbitrary :: forall b. ByteString -> Gen b -> Gen b
coarbitrary = forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
BS.unpack
instance Function BS.ByteString where
function :: forall b. (ByteString -> b) -> ByteString :-> b
function = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap ByteString -> [Word8]
BS.unpack [Word8] -> ByteString
BS.pack
instance Arbitrary LBS.ByteString where
arbitrary :: Gen ByteString
arbitrary = forall a. (QCGen -> Int -> a) -> Gen a
MkGen forall a b. (a -> b) -> a -> b
$ \(QCGen SMGen
g0) Int
size ->
if Int
size forall a. Ord a => a -> a -> Bool
<= Int
0
then ByteString
LBS.empty
else
let (Int
i, SMGen
g1) = SMGen -> (Int, SMGen)
SM.nextInt SMGen
g0
size' :: Int
size' = Int
i forall a. Integral a => a -> a -> a
`mod` Int
size
in forall a. (a -> Maybe (Word8, a)) -> a -> ByteString
LBS.unfoldr (Int, SMGen) -> Maybe (Word8, (Int, SMGen))
gen (Int
size', SMGen
g1)
where
gen :: (Int, SM.SMGen) -> Maybe (Word8, (Int, SM.SMGen))
gen :: (Int, SMGen) -> Maybe (Word8, (Int, SMGen))
gen (!Int
i, !SMGen
g)
| Int
i forall a. Ord a => a -> a -> Bool
<= Int
0 = forall a. Maybe a
Nothing
| Bool
otherwise = forall a. a -> Maybe a
Just (forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
w64, (Int
i forall a. Num a => a -> a -> a
- Int
1, SMGen
g'))
where
~(Word64
w64, SMGen
g') = SMGen -> (Word64, SMGen)
SM.nextWord64 SMGen
g
shrink :: ByteString -> [ByteString]
shrink ByteString
xs = [Word8] -> ByteString
LBS.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => a -> [a]
shrink (ByteString -> [Word8]
LBS.unpack ByteString
xs)
instance CoArbitrary LBS.ByteString where
coarbitrary :: forall b. ByteString -> Gen b -> Gen b
coarbitrary = forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
LBS.unpack
instance Function LBS.ByteString where
function :: forall b. (ByteString -> b) -> ByteString :-> b
function = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap ByteString -> [Word8]
LBS.unpack [Word8] -> ByteString
LBS.pack
instance Arbitrary SBS.ShortByteString where
arbitrary :: Gen ShortByteString
arbitrary = [Word8] -> ShortByteString
SBS.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
arbitrary
shrink :: ShortByteString -> [ShortByteString]
shrink ShortByteString
xs = [Word8] -> ShortByteString
SBS.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => a -> [a]
shrink (ShortByteString -> [Word8]
SBS.unpack ShortByteString
xs)
instance CoArbitrary SBS.ShortByteString where
coarbitrary :: forall b. ShortByteString -> Gen b -> Gen b
coarbitrary = forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShortByteString -> [Word8]
SBS.unpack
instance Function SBS.ShortByteString where
function :: forall b. (ShortByteString -> b) -> ShortByteString :-> b
function = forall b a c.
Function b =>
(a -> b) -> (b -> a) -> (a -> c) -> a :-> c
functionMap ShortByteString -> [Word8]
SBS.unpack [Word8] -> ShortByteString
SBS.pack