quickcheck-instances 0.3.19 → 0.3.20
raw patch · 4 files changed
+71/−7 lines, 4 filesdep +splitmixdep ~QuickCheckdep ~basedep ~bytestring
Dependencies added: splitmix
Dependency ranges changed: QuickCheck, base, bytestring
Files
- CHANGES +5/−0
- bench/ByteString.hs +16/−0
- quickcheck-instances.cabal +16/−5
- src/Test/QuickCheck/Instances/ByteString.hs +34/−2
CHANGES view
@@ -1,3 +1,8 @@+0.3.20++* Support QuickCheck-2.13+* Faster ByteString `arbitrary`+ 0.3.19 * Instances for `MaybeT`
+ bench/ByteString.hs view
@@ -0,0 +1,16 @@+module Main where++import qualified Data.ByteString as BS+import System.IO (hPutStrLn, stderr)+import qualified Test.QuickCheck as QC+import Test.QuickCheck.Instances.ByteString ()+import qualified Test.QuickCheck.Monadic as QCM++-- BS.pack 6.53s+-- current: 0.07s+main :: IO ()+main = QC.quickCheckWith args $ QC.property $ \bsList -> QCM.monadicIO $ do+ QCM.run $ hPutStrLn stderr (show $ sum $ map BS.length bsList)+ QCM.assert True+ where+ args = QC.stdArgs { QC.maxSize = 1000 }
quickcheck-instances.cabal view
@@ -1,5 +1,5 @@ Name: quickcheck-instances-Version: 0.3.19+Version: 0.3.20 Synopsis: Common quickcheck instances Description: QuickCheck instances.@@ -34,8 +34,8 @@ GHC==7.10.3, GHC==8.0.2, GHC==8.2.2,- GHC==8.4.3,- GHC==8.6.1+ GHC==8.4.4,+ GHC==8.6.4 Source-repository head type: git@@ -66,8 +66,9 @@ Test.QuickCheck.Instances.Vector Hs-Source-Dirs: src Build-depends:- base >=4.5 && <4.13,- QuickCheck >=2.10 && <2.13,+ base >=4.5 && <4.13,+ QuickCheck >=2.13 && <2.14,+ splitmix >=0.0.2 && <0.1, array >=0.4.0.0 && <0.6, base-compat >=0.9.3 && <0.11,@@ -115,3 +116,13 @@ containers, tagged, uuid-types++benchmark bytestring-gen+ type: exitcode-stdio-1.0+ main-is: ByteString.hs+ hs-source-dirs: bench+ build-depends:+ base,+ QuickCheck,+ quickcheck-instances,+ bytestring
src/Test/QuickCheck/Instances/ByteString.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE BangPatterns #-} {-# LANGUAGE FlexibleContexts #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Test.QuickCheck.Instances.ByteString () where@@ -5,8 +6,13 @@ import Prelude () import Prelude.Compat +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 BL import qualified Data.ByteString.Short as SBS@@ -16,7 +22,19 @@ ------------------------------------------------------------------------------- instance Arbitrary BS.ByteString where- arbitrary = BS.pack <$> arbitrary+ arbitrary = MkGen $ \(QCGen g0) size ->+ if size <= 0+ then BS.empty+ else+ let (i, g1) = SM.nextInt g0+ size' = i `mod` size+ in fst (BS.unfoldrN size' gen g1)+ where+ gen :: SM.SMGen -> Maybe (Word8, SM.SMGen)+ gen !g = Just (fromIntegral w64, g')+ where+ ~(w64, g') = SM.nextWord64 g+ shrink xs = BS.pack <$> shrink (BS.unpack xs) instance CoArbitrary BS.ByteString where@@ -27,7 +45,21 @@ instance Arbitrary BL.ByteString where- arbitrary = BL.pack <$> arbitrary+ arbitrary = MkGen $ \(QCGen g0) size ->+ if size <= 0+ then BL.empty+ else+ let (i, g1) = SM.nextInt g0+ size' = i `mod` size+ in BL.unfoldr gen (size', g1)+ where+ gen :: (Int, SM.SMGen) -> Maybe (Word8, (Int, SM.SMGen))+ gen (!i, !g)+ | i <= 0 = Nothing+ | otherwise = Just (fromIntegral w64, (i - 1, g'))+ where+ ~(w64, g') = SM.nextWord64 g+ shrink xs = BL.pack <$> shrink (BL.unpack xs) instance CoArbitrary BL.ByteString where