genvalidity-bytestring 0.6.0.0 → 1.0.0.0
raw patch · 6 files changed
+151/−144 lines, 6 filesdep ~genvaliditysetup-changedPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: genvalidity
API changes (from Hackage documentation)
- Data.GenValidity.ByteString: genTrulyUncheckedLazyByteString :: Gen ByteString
- Data.GenValidity.ByteString: genTrulyUncheckedStrictByteString :: Gen ByteString
- Data.GenValidity.ByteString: instance (TypeError ...) => Data.GenValidity.GenUnchecked Data.ByteString.Internal.ByteString
- Data.GenValidity.ByteString: instance (TypeError ...) => Data.GenValidity.GenUnchecked Data.ByteString.Lazy.Internal.ByteString
- Data.GenValidity.ByteString: instance Data.GenValidity.GenUnchecked Data.ByteString.Short.Internal.ShortByteString
- Data.GenValidity.ByteString: shrinkTrulyUncheckedLazyByteString :: ByteString -> [ByteString]
- Data.GenValidity.ByteString: shrinkTrulyUncheckedStrictByteString :: ByteString -> [ByteString]
Files
- CHANGELOG.md +89/−0
- LICENSE +1/−1
- Setup.hs +0/−3
- genvalidity-bytestring.cabal +8/−7
- src/Data/GenValidity/ByteString.hs +15/−94
- test/Data/GenValidity/ByteStringSpec.hs +38/−39
+ CHANGELOG.md view
@@ -0,0 +1,89 @@+# Changelog++## [1.0.0.0] - 2021-11-20++### Changed++* Compatibility with `genvalidity >= 1.0.0.0`++### Removed++* `genTrulyUncheckedStrictByteString`+* `shrinkTrulyUncheckedStrictByteString`+* `genTrulyUncheckedLazyByteString`+* `shrinkTrulyUncheckedLazyByteString`++## [0.6.0.0] - 2020-04-17++### Added++* genStrictByteStringBy+* genLazyByteStringBy+* genLazyByteStringByStrictByteString+* Benchmarks for the generators++### Changed++* Strict Bytestrings are now generated up to 4x faster.+* Lazy Bytestrings are now generated to usually have multiple chunks.++## [0.5.0.1] - 2020-02-10++* Improved the cabal file++## [0.5.0.0] - 2019-03-06++### Added++* genTrulyUncheckedLazyByteString+* shrinkTrulyUncheckedLazyByteString++### Changed++* Removed the 'GenUnchecked' and 'GenInvalid' instances for both strict and lazy `ByteString`s+* Poisoned those two instances as well.++## [0.4.1.0] - 2019-03-06++### Added++* 'GenUnchecked' and 'GenValid' for 'ShortByteString'++## [0.4.0.0] - 2019-03-06++### Added++* genTrulyUncheckedStrictByteString+* shrinkTrulyUncheckedStrictByteString++### Changed++* The 'genUnchecked' instance of 'Strict.ByteString' and 'Lazy.ByteString' now `error` instead of generating values that segfault.++## [0.3.0.2] - 2019-02-28++### Changed++* Clearer documentation++## [0.3.0.1] - 2018-10-07++### Changed++* Test suite compatibility with `validity >= 0.9`++## [0.3.0.0] - 2018-08-25++### Added++* `GenUnchecked`, `GenValid` and `GenInvalid`, instances for lazy `ByteString`.++### Changed++* `genUnchecked :: Gen ByteString` now generates much more unchecked values according to the new `validity-bytestring`.+ **If you experience unexpected segfaults, the problem could be that you are using unchecked `ByteString`s where you should be using valid `ByteString`s.**++## Older versions++No history before version 0.3.0.0+
LICENSE view
@@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016-2020 Tom Sydney Kerckhove+Copyright (c) 2016-2021 Tom Sydney Kerckhove Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal
− Setup.hs
@@ -1,3 +0,0 @@-import Distribution.Simple--main = defaultMain
genvalidity-bytestring.cabal view
@@ -1,23 +1,24 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.33.0.+-- This file has been generated from package.yaml by hpack version 0.34.4. -- -- see: https://github.com/sol/hpack------ hash: e829149efdf6026d6246ee4a88e92b01272e80068931d575c245f5ba38e086b3 name: genvalidity-bytestring-version: 0.6.0.0+version: 1.0.0.0 synopsis: GenValidity support for ByteString category: Testing homepage: https://github.com/NorfairKing/validity#readme bug-reports: https://github.com/NorfairKing/validity/issues author: Tom Sydney Kerckhove maintainer: syd@cs-syd.eu-copyright: Copyright: (c) 2016-2020 Tom Sydney Kerckhove+copyright: Copyright: (c) 2016-2021 Tom Sydney Kerckhove license: MIT license-file: LICENSE build-type: Simple+extra-source-files:+ LICENSE+ CHANGELOG.md source-repository head type: git@@ -34,7 +35,7 @@ QuickCheck , base >=4.7 && <5 , bytestring- , genvalidity >=0.8+ , genvalidity >=1.0 , random , validity >=0.5 , validity-bytestring >=0.4@@ -54,7 +55,7 @@ , base >=4.7 && <5 , bytestring , deepseq- , genvalidity >=0.7+ , genvalidity , genvalidity-bytestring , genvalidity-hspec , hspec
src/Data/GenValidity/ByteString.hs view
@@ -1,45 +1,26 @@ {-# OPTIONS_GHC -fno-warn-orphans #-}-{-# LANGUAGE CPP #-}-#if MIN_VERSION_base(4,9,0)-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE UndecidableInstances #-}-#endif+ module Data.GenValidity.ByteString where +import qualified Data.ByteString as SB+import qualified Data.ByteString.Lazy as LB+import qualified Data.ByteString.Lazy.Internal as LB+import qualified Data.ByteString.Short as Short import Data.GenValidity import Data.Validity.ByteString ()+import Data.Word (Word8) import System.Random as Random import Test.QuickCheck import Test.QuickCheck.Gen import Test.QuickCheck.Random-import Data.Word (Word8)-#if !MIN_VERSION_base(4,8,0)-import Control.Applicative ((<*>), pure)-import Data.Functor ((<$>))-#endif-import qualified Data.ByteString as SB-import qualified Data.ByteString.Internal as SB-import qualified Data.ByteString.Lazy as LB-import qualified Data.ByteString.Lazy.Internal as LB-import qualified Data.ByteString.Short as Short-#if MIN_VERSION_base(4,9,0)-import GHC.TypeLits-#endif+ -- | -- -- > genValid = SB.pack <$> genValid -- > shrinkValid = fmap SB.pack . shrinkValid . SB.unpack instance GenValid SB.ByteString where- genValid = genStrictByteStringBy genValid- shrinkValid = fmap SB.pack . shrinkValid . SB.unpack-#if MIN_VERSION_base(4,9,0)--- If you see this error and want to learn more, have a look at docs/BYTESTRING.md-instance GHC.TypeLits.TypeError ('GHC.TypeLits.Text "The GenUnchecked Data.ByteString.ByteString is disabled:" 'GHC.TypeLits.:$$: 'GHC.TypeLits.Text "Do not instantiate GenUnchecked, instantiate GenValid instead") =>- GenUnchecked SB.ByteString where- genUnchecked = error "unreachable"- shrinkUnchecked = error "unreachable"-#endif+ genValid = genStrictByteStringBy genValid+ shrinkValid = fmap SB.pack . shrinkValid . SB.unpack genStrictByteStringBy :: Gen Word8 -> Gen SB.ByteString genStrictByteStringBy (MkGen word8Func) = do@@ -51,39 +32,9 @@ in Just (word8Func qc1 size, qc2) in fst $ SB.unfoldrN len go qcgen ---- | WARNING: Unchecked ByteStrings are __seriously__ broken.------ The pointer may still point to something which is fine, but--- the offset and length will most likely be complete nonsense.--- This will most-likely lead to segfaults.------ This means that 'genUnchecked' will generate seriously broken 'ByteString' values.--- This is __intended__. If you need valid 'ByteString' values, use 'GenValid' instead.------ Make sure to not use any test suite combinators or property combinators that involve--- 'GenInvalid' (like 'genValiditySpec') on types that contain 'ByteString' values.-genTrulyUncheckedStrictByteString :: Gen SB.ByteString-genTrulyUncheckedStrictByteString = do- ws <- genUnchecked- -- TODO what do we do about the foreign pointer?- let SB.PS p _ _ = SB.pack ws- SB.PS p <$> genUnchecked <*> genUnchecked--shrinkTrulyUncheckedStrictByteString :: SB.ByteString -> [SB.ByteString]-shrinkTrulyUncheckedStrictByteString (SB.PS p o l) =- [SB.PS p o' l' | (o', l') <- shrinkUnchecked (o, l)]- instance GenValid LB.ByteString where- genValid = genLazyByteStringBy genValid- shrinkValid = fmap LB.pack . shrinkValid . LB.unpack-#if MIN_VERSION_base(4,9,0)--- If you see this error and want to learn more, have a look at docs/BYTESTRING.md-instance GHC.TypeLits.TypeError ('GHC.TypeLits.Text "The GenUnchecked Data.ByteString.Lazy.ByteString is disabled:" 'GHC.TypeLits.:$$: 'GHC.TypeLits.Text "Do not instantiate GenUnchecked, instantiate GenValid instead") =>- GenUnchecked LB.ByteString where- genUnchecked = error "unreachable"- shrinkUnchecked = error "unreachable"-#endif+ genValid = genLazyByteStringByStrictByteString genValid+ shrinkValid = fmap LB.pack . shrinkValid . LB.unpack genLazyByteStringBy :: Gen Word8 -> Gen LB.ByteString genLazyByteStringBy gen = genLazyByteStringByStrictByteString (genStrictByteStringBy gen)@@ -95,38 +46,8 @@ go ss where go [] = pure LB.Empty- go (s:ss) = LB.Chunk <$> resize s gen <*> go ss---- | WARNING: Unchecked ByteStrings are __seriously__ broken.------ See 'genTrulyUncheckedStrictByteString'-genTrulyUncheckedLazyByteString :: Gen LB.ByteString-genTrulyUncheckedLazyByteString =- sized $ \n ->- case n of- 0 -> pure LB.Empty- _ -> do- (a, b) <- genSplit n- sb <- resize a genTrulyUncheckedStrictByteString- lb <- resize b genTrulyUncheckedLazyByteString- pure $ LB.Chunk sb lb--shrinkTrulyUncheckedLazyByteString :: LB.ByteString -> [LB.ByteString]-shrinkTrulyUncheckedLazyByteString lb_ =- case lb_ of- LB.Empty -> []- (LB.Chunk sb lb) ->- LB.Empty :- [ LB.Chunk sb' lb'- | (sb', lb') <-- shrinkTuple- shrinkTrulyUncheckedStrictByteString- shrinkTrulyUncheckedLazyByteString- (sb, lb)- ]--instance GenUnchecked Short.ShortByteString where- genUnchecked = Short.pack <$> genValid- shrinkUnchecked = fmap Short.pack . shrinkUnchecked . Short.unpack+ go (s : ss) = LB.Chunk <$> resize s gen <*> go ss -instance GenValid Short.ShortByteString+instance GenValid Short.ShortByteString where+ genValid = Short.pack <$> genValid+ shrinkValid = fmap Short.pack . shrinkValid . Short.unpack
test/Data/GenValidity/ByteStringSpec.hs view
@@ -1,66 +1,65 @@ module Data.GenValidity.ByteStringSpec- ( spec- ) where+ ( spec,+ )+where import Control.DeepSeq--import Test.Hspec-import Test.QuickCheck--import Data.GenValidity-import Data.GenValidity.ByteString ()- import qualified Data.ByteString as SB (ByteString) import qualified Data.ByteString.Lazy as LB (ByteString) import qualified Data.ByteString.Short as Short (ShortByteString)+import Data.GenValidity+import Data.GenValidity.ByteString ()+import Test.Hspec+import Test.QuickCheck checkable :: (Validity t, Show t, NFData t) => Gen t -> SpecWith () checkable gen =- it "generates bytestrings that can be checked for validity" $+ it "generates bytestrings that can be checked for validity" $ forAll gen $ \v ->- case prettyValidate v of- Left e -> deepseq e True- Right v_ -> deepseq v_ True+ case prettyValidate v of+ Left e -> deepseq e True+ Right v_ -> deepseq v_ True showable :: Show t => Gen t -> SpecWith () showable gen =- it "generates bytestrings that can be shown" $+ it "generates bytestrings that can be shown" $ forAll gen $ \v -> deepseq (show v) True spec :: Spec spec = do- do describe "genValid :: Gen SB.ByteString" $ do- checkable (genValid :: Gen SB.ByteString)- showable (genValid :: Gen SB.ByteString)- it "generates valid strict bytestring" $- forAll (genValid :: Gen SB.ByteString) isValid- describe "genValid :: Gen LB.ByteString" $ do- checkable (genValid :: Gen LB.ByteString)- showable (genValid :: Gen LB.ByteString)- it "generates valid lazy bytestring" $- forAll (genValid :: Gen LB.ByteString) isValid- describe "genUnchecked :: Gen Short.ShortByteString" $ do- checkable (genUnchecked :: Gen Short.ShortByteString)- showable (genUnchecked :: Gen Short.ShortByteString)- describe "genValid :: Gen Short.ShortByteString" $ do- checkable (genValid :: Gen Short.ShortByteString)- showable (genValid :: Gen Short.ShortByteString)- it "generates valid lazy bytestring" $- forAll (genValid :: Gen Short.ShortByteString) isValid+ do+ describe "genValid :: Gen SB.ByteString" $ do+ checkable (genValid :: Gen SB.ByteString)+ showable (genValid :: Gen SB.ByteString)+ it "generates valid strict bytestring" $+ forAll (genValid :: Gen SB.ByteString) isValid+ describe "genValid :: Gen LB.ByteString" $ do+ checkable (genValid :: Gen LB.ByteString)+ showable (genValid :: Gen LB.ByteString)+ it "generates valid lazy bytestring" $+ forAll (genValid :: Gen LB.ByteString) isValid+ describe "genValid :: Gen Short.ShortByteString" $ do+ checkable (genValid :: Gen Short.ShortByteString)+ showable (genValid :: Gen Short.ShortByteString)+ describe "genValid :: Gen Short.ShortByteString" $ do+ checkable (genValid :: Gen Short.ShortByteString)+ showable (genValid :: Gen Short.ShortByteString)+ it "generates valid lazy bytestring" $+ forAll (genValid :: Gen Short.ShortByteString) isValid -- Uncomment to test that the instances are poisoned ----- instance GenUnchecked SB.ByteString where--- genUnchecked = undefined--- shrinkUnchecked = undefined+-- instance GenValid SB.ByteString where+-- genValid = undefined+-- shrinkValid = undefined ----- instance GenUnchecked LB.ByteString where--- genUnchecked = undefined--- shrinkUnchecked = undefined+-- instance GenValid LB.ByteString where+-- genValid = undefined+-- shrinkValid = undefined -- -- Uncomment to see the error message that you would get -- -- data FooBar = FooBar SB.ByteString String -- deriving (Show, Eq, Generic) -- instance Validity FooBar--- instance GenUnchecked FooBar+-- instance GenValid FooBar