{-# LANGUAGE CPP #-}

module Test.Cardano.Base.Bytes (
  genByteArray,
  genByteString,
  genLazyByteString,
  genShortByteString,
) where

import Data.Array.Byte (ByteArray)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
#if MIN_VERSION_bytestring(0,11,1)
import qualified Data.ByteString.Short as SBS
#else
import qualified Data.ByteString.Short.Internal as SBS
#endif
import Data.MemPack.Buffer (byteArrayFromShortByteString)
#if MIN_VERSION_random(1,3,0)
import System.Random.Stateful (
  runStateGen_,
  uniformByteStringM,
  uniformShortByteStringM,
 )
#else
import System.Random.Stateful (
  StatefulGen (..),
  runStateGen_,
  uniformByteStringM,
 )
#endif
import Test.QuickCheck
import Test.QuickCheck.Gen (Gen (MkGen))

genByteArray :: Int -> Gen ByteArray
genByteArray :: Int -> Gen ByteArray
genByteArray Int
n = ShortByteString -> ByteArray
byteArrayFromShortByteString (ShortByteString -> ByteArray)
-> Gen ShortByteString -> Gen ByteArray
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen ShortByteString
genShortByteString Int
n

genByteString :: Int -> Gen BS.ByteString
genByteString :: Int -> Gen ByteString
genByteString Int
n = (QCGen -> Int -> ByteString) -> Gen ByteString
forall a. (QCGen -> Int -> a) -> Gen a
MkGen ((QCGen -> Int -> ByteString) -> Gen ByteString)
-> (QCGen -> Int -> ByteString) -> Gen ByteString
forall a b. (a -> b) -> a -> b
$ \QCGen
r Int
_ -> QCGen -> (StateGenM QCGen -> State QCGen ByteString) -> ByteString
forall g a. RandomGen g => g -> (StateGenM g -> State g a) -> a
runStateGen_ QCGen
r ((StateGenM QCGen -> State QCGen ByteString) -> ByteString)
-> (StateGenM QCGen -> State QCGen ByteString) -> ByteString
forall a b. (a -> b) -> a -> b
$ Int -> StateGenM QCGen -> State QCGen ByteString
forall g (m :: * -> *). StatefulGen g m => Int -> g -> m ByteString
uniformByteStringM Int
n

genLazyByteString :: Int -> Gen BSL.ByteString
genLazyByteString :: Int -> Gen ByteString
genLazyByteString Int
n = ByteString -> ByteString
BSL.fromStrict (ByteString -> ByteString) -> Gen ByteString -> Gen ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen ByteString
genByteString Int
n

genShortByteString :: Int -> Gen SBS.ShortByteString
#if MIN_VERSION_random(1,3,0)
genShortByteString :: Int -> Gen ShortByteString
genShortByteString Int
n = (QCGen -> Int -> ShortByteString) -> Gen ShortByteString
forall a. (QCGen -> Int -> a) -> Gen a
MkGen ((QCGen -> Int -> ShortByteString) -> Gen ShortByteString)
-> (QCGen -> Int -> ShortByteString) -> Gen ShortByteString
forall a b. (a -> b) -> a -> b
$ \QCGen
r Int
_ -> QCGen
-> (StateGenM QCGen -> State QCGen ShortByteString)
-> ShortByteString
forall g a. RandomGen g => g -> (StateGenM g -> State g a) -> a
runStateGen_ QCGen
r ((StateGenM QCGen -> State QCGen ShortByteString)
 -> ShortByteString)
-> (StateGenM QCGen -> State QCGen ShortByteString)
-> ShortByteString
forall a b. (a -> b) -> a -> b
$ Int -> StateGenM QCGen -> State QCGen ShortByteString
forall g (m :: * -> *).
StatefulGen g m =>
Int -> g -> m ShortByteString
uniformShortByteStringM Int
n
#else
genShortByteString n = MkGen $ \r _ -> runStateGen_ r $ uniformShortByteString n
#endif