mempack-0.2.0.0: tests/Test/Common.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Test.Common (
module X,
QC (..),
) where
import Data.Array.Byte (ByteArray (..))
import Data.ByteString (ByteString)
import qualified Data.ByteString.Lazy as BSL
import Data.ByteString.Short.Internal as SBS (ShortByteString (..))
import Data.MemPack.Buffer (byteArrayFromShortByteString)
import Data.Primitive.Array (Array)
import Data.Primitive.PrimArray (PrimArray (..), primArrayFromList)
import Data.Primitive.Types (Prim)
import qualified Data.Text as T
import qualified Data.Vector.Generic as VG (fromList)
import qualified Data.Vector.Primitive as VP (Vector (..), drop)
import qualified Data.Vector.Storable as VS (Storable, Vector, drop)
import GHC.Exts (fromList)
import System.Random.Stateful
import Test.Hspec as X
import Test.Hspec.QuickCheck as X
import Test.QuickCheck as X
import Test.QuickCheck.Gen (Gen (MkGen))
data QC = QC
instance StatefulGen QC Gen where
uniformWord32 QC = MkGen (\r _n -> runStateGen_ r uniformWord32)
{-# INLINE uniformWord32 #-}
uniformWord64 QC = MkGen (\r _n -> runStateGen_ r uniformWord64)
{-# INLINE uniformWord64 #-}
#if MIN_VERSION_random(1,3,0)
uniformByteArrayM pinned k QC =
MkGen (\r _n -> runStateGen_ r (uniformByteArrayM pinned k))
{-# INLINE uniformByteArrayM #-}
#else
uniformShortByteString k QC =
MkGen (\r _n -> runStateGen_ r (uniformShortByteString k))
{-# INLINE uniformShortByteString #-}
#endif
instance Arbitrary ByteArray where
arbitrary = qcByteArray . getNonNegative =<< arbitrary
instance Arbitrary ByteString where
arbitrary = qcByteString . getNonNegative =<< arbitrary
instance Arbitrary SBS.ShortByteString where
arbitrary = qcShortByteString . getNonNegative =<< arbitrary
instance Arbitrary BSL.ByteString where
arbitrary = BSL.fromChunks <$> arbitrary
instance Arbitrary T.Text where
arbitrary = T.pack <$> arbitrary
instance (Prim a, Arbitrary a) => Arbitrary (PrimArray a) where
arbitrary = primArrayFromList <$> arbitrary
instance Arbitrary a => Arbitrary (Array a) where
arbitrary = fromList <$> arbitrary
instance (Prim a, Arbitrary a) => Arbitrary (VP.Vector a) where
arbitrary = do
v <- VG.fromList <$> arbitrary
frequency [(5, pure v), (5, flip VP.drop v . getNonNegative <$> arbitrary)]
instance (VS.Storable a, Arbitrary a) => Arbitrary (VS.Vector a) where
arbitrary = do
v <- VG.fromList <$> arbitrary
frequency [(5, pure v), (5, flip VS.drop v . getNonNegative <$> arbitrary)]
qcByteArray :: Int -> Gen ByteArray
qcByteArray n = byteArrayFromShortByteString <$> qcShortByteString n
qcByteString :: Int -> Gen ByteString
qcByteString n = uniformByteStringM (fromIntegral n) QC
qcShortByteString :: Int -> Gen SBS.ShortByteString
#if MIN_VERSION_random(1,3,0)
qcShortByteString n = uniformShortByteStringM (fromIntegral n) QC
#else
qcShortByteString n = uniformShortByteString (fromIntegral n) QC
#endif