-- | The "Arb" module defined Arbitrary instances for all the basic types module Arb where import Test.QuickCheck import System.Random import qualified Data.Sequence as Seq import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy.UTF8 as U import Text.ProtocolBuffers.Basic import Data.Word(Word8) arb :: Gen a -> IO a arb g = do s <- getStdGen let (s1,s2) = split s setStdGen s1 let (i,s2') = random s2 return $ generate i s2' g integralRandomR :: (Integral a, RandomGen g) => (a,a) -> g -> (a,g) integralRandomR (a,b) g = case randomR (fromIntegral a :: Integer,fromIntegral b :: Integer) g of (x,g) -> (fromIntegral x, g) minmax :: Bounded a => (a,a) minmax = (minBound,maxBound) barb :: (Enum a,Bounded a) => Gen a barb = elements [minBound..maxBound] bcoarb :: Enum a => a -> Gen b -> Gen b bcoarb a = variant ((fromEnum a) `rem` 4) class ArbCon a x where futz :: a -> Gen x instance ArbCon a a where futz = return instance (Arbitrary a,ArbCon b x) => ArbCon (a -> b) x where futz f = arbitrary >>= futz . f instance Arbitrary Int32 where arbitrary = choose minmax coarbitrary n = variant (fromIntegral ((fromIntegral n) `rem` 4)) instance Random Int32 where randomR = integralRandomR random = randomR minmax instance Arbitrary Int64 where arbitrary = choose minmax coarbitrary n = variant (fromIntegral ((fromIntegral n) `rem` 4)) instance Random Int64 where randomR = integralRandomR random = randomR minmax instance Arbitrary Word32 where arbitrary = choose minmax coarbitrary n = variant (fromIntegral ((fromIntegral n) `rem` 4)) instance Random Word32 where randomR = integralRandomR random = randomR minmax instance Arbitrary Word64 where arbitrary = choose minmax coarbitrary n = variant (fromIntegral ((fromIntegral n) `rem` 4)) instance Random Word64 where randomR = integralRandomR random = randomR minmax instance Arbitrary Word8 where arbitrary = choose minmax coarbitrary n = variant (fromIntegral ((fromIntegral n) `rem` 4)) instance Random Word8 where randomR = integralRandomR random = randomR minmax instance Arbitrary Char where arbitrary = choose minmax coarbitrary n = variant (fromIntegral ((fromEnum n) `rem` 4)) instance Arbitrary Utf8 where arbitrary = do len <- frequency [ (3, choose (1,3)) , (1, return 0) ] fmap (Utf8 . U.fromString) (vector len) coarbitrary (Utf8 s) = variant (fromIntegral ((L.length s) `rem` 4)) instance Arbitrary L.ByteString where arbitrary = do len <- frequency [ (3, choose (1,3)) , (1, return 0) ] fmap L.pack (vector len) coarbitrary s = variant (fromIntegral ((L.length s) `rem` 4)) instance Arbitrary a => Arbitrary (Seq a) where arbitrary = do len <- frequency [ (3, choose (1,3)) , (1, return 0) ] fmap Seq.fromList (vector len) coarbitrary s = variant ((Seq.length s) `rem` 4)