genvalidity-bytestring 0.2.0.2 → 0.3.0.0
raw patch · 3 files changed
+98/−25 lines, 3 filesdep +deepseqdep ~validity-bytestringPVP ok
version bump matches the API change (PVP)
Dependencies added: deepseq
Dependency ranges changed: validity-bytestring
API changes (from Hackage documentation)
+ Data.GenValidity.ByteString: instance Data.GenValidity.GenInvalid Data.ByteString.Lazy.Internal.ByteString
+ Data.GenValidity.ByteString: instance Data.GenValidity.GenUnchecked Data.ByteString.Lazy.Internal.ByteString
+ Data.GenValidity.ByteString: instance Data.GenValidity.GenValid Data.ByteString.Lazy.Internal.ByteString
Files
- genvalidity-bytestring.cabal +14/−12
- src/Data/GenValidity/ByteString.hs +41/−6
- test/Data/GenValidity/ByteStringSpec.hs +43/−7
genvalidity-bytestring.cabal view
@@ -1,11 +1,13 @@--- This file has been generated from package.yaml by hpack version 0.28.2.+cabal-version: >= 1.10++-- This file has been generated from package.yaml by hpack version 0.29.6. -- -- see: https://github.com/sol/hpack ----- hash: bae4cdab53a618ad6823044913df2dcea8f67ce3356ac37fa1814bb673dd289f+-- hash: b00e12f8384f62c8e948f3eb83a4b6a8da6ff010b7a31c7b0a17362fa6e4b6fd name: genvalidity-bytestring-version: 0.2.0.2+version: 0.3.0.0 synopsis: GenValidity support for ByteString description: Please see README.md category: Testing@@ -18,13 +20,16 @@ license: MIT license-file: LICENSE build-type: Simple-cabal-version: >= 1.10 source-repository head type: git location: https://github.com/NorfairKing/validity library+ exposed-modules:+ Data.GenValidity.ByteString+ other-modules:+ Paths_genvalidity_bytestring hs-source-dirs: src build-depends:@@ -33,16 +38,15 @@ , bytestring , genvalidity >=0.5 , validity >=0.5- , validity-bytestring >=0.3- exposed-modules:- Data.GenValidity.ByteString- other-modules:- Paths_genvalidity_bytestring+ , validity-bytestring >=0.4 default-language: Haskell2010 test-suite genvalidity-bytestring-test type: exitcode-stdio-1.0 main-is: Spec.hs+ other-modules:+ Data.GenValidity.ByteStringSpec+ Paths_genvalidity_bytestring hs-source-dirs: test ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall -fno-warn-name-shadowing@@ -50,11 +54,9 @@ QuickCheck , base , bytestring+ , deepseq , genvalidity , genvalidity-bytestring , genvalidity-hspec , hspec- other-modules:- Data.GenValidity.ByteStringSpec- Paths_genvalidity_bytestring default-language: Haskell2010
src/Data/GenValidity/ByteString.hs view
@@ -5,16 +5,51 @@ import Data.GenValidity import Data.Validity.ByteString ()+import Test.QuickCheck #if !MIN_VERSION_base(4,8,0)+import Control.Applicative ((<*>), pure) import Data.Functor ((<$>)) #endif import qualified Data.ByteString as SB-import Data.ByteString (ByteString)+import qualified Data.ByteString.Internal as SB+import qualified Data.ByteString.Lazy as LB+import qualified Data.ByteString.Lazy.Internal as LB -instance GenUnchecked ByteString where- genUnchecked = SB.pack <$> genUnchecked- shrinkUnchecked = fmap SB.pack . shrinkUnchecked . SB.unpack+-- | 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.+instance GenUnchecked SB.ByteString where+ genUnchecked = do+ ws <- genUnchecked+ -- TODO what do we do about the foreign pointer?+ let SB.PS p _ _ = SB.pack ws+ SB.PS p <$> genUnchecked <*> genUnchecked+ shrinkUnchecked (SB.PS p o l) =+ [SB.PS p o' l' | (o', l') <- shrinkUnchecked (o, l)] -instance GenValid ByteString+instance GenValid SB.ByteString where+ genValid = SB.pack <$> genValid+ shrinkValid = fmap SB.pack . shrinkValid . SB.unpack -instance GenInvalid ByteString+instance GenInvalid SB.ByteString++instance GenUnchecked LB.ByteString where+ genUnchecked =+ sized $ \n ->+ case n of+ 0 -> pure LB.Empty+ _ -> do+ (a, b) <- genSplit n+ sb <- resize a genUnchecked+ lb <- resize b genUnchecked+ pure $ LB.Chunk sb lb+ shrinkUnchecked LB.Empty = []+ shrinkUnchecked (LB.Chunk sb lb) =+ LB.Empty : [LB.Chunk sb' lb' | (sb', lb') <- shrinkUnchecked (sb, lb)]++instance GenValid LB.ByteString where+ genValid = LB.pack <$> genValid+ shrinkValid = fmap LB.pack . shrinkValid . LB.unpack++instance GenInvalid LB.ByteString
test/Data/GenValidity/ByteStringSpec.hs view
@@ -2,19 +2,55 @@ ( spec ) where +import Control.DeepSeq+ import Test.Hspec import Test.QuickCheck import Data.GenValidity import Data.GenValidity.ByteString () -import Data.ByteString (ByteString)+import qualified Data.ByteString as SB (ByteString)+import qualified Data.ByteString.Lazy as LB (ByteString) +checkable :: (Validity t, Show t, NFData t) => Gen t -> SpecWith ()+checkable gen =+ it "generates bytestrings that can be checked for validity" $+ forAll gen $ \v ->+ case prettyValidation 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" $+ forAll gen $ \v -> deepseq (show v) True+ spec :: Spec spec = do- describe "genValid" $- it "generates valid bytestring" $- forAll (genValid :: Gen ByteString) isValid- describe "genUnchecked `suchThat` isValid" $- it "generates valid bytestring" $- forAll ((genUnchecked :: Gen ByteString) `suchThat` isValid) isValid+ describe "genUnchecked :: Gen SB.ByteString" $ do+ checkable (genUnchecked :: Gen SB.ByteString)+ -- showable (genUnchecked :: Gen SB.ByteString) DOES NOT HOLD+ 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 "genInvalid :: Gen SB.ByteString" $ do+ checkable (genInvalid :: Gen SB.ByteString)+ -- showable (genInvalid :: Gen SB.ByteString) DOES NOT HOLD+ it "generates invalid strict bytestring" $+ forAll (genInvalid :: Gen SB.ByteString) isInvalid+ describe "genUnchecked :: Gen LB.ByteString" $ do+ checkable (genUnchecked :: Gen LB.ByteString)+ -- showable (genUnchecked :: Gen LB.ByteString) DOES NOT HOLD+ 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 "genInvalid :: Gen LB.ByteString" $ do+ checkable (genInvalid :: Gen LB.ByteString)+ -- showable (genInvalid :: Gen LB.ByteString) DOES NOT HOLD+ it "generates invalid lazy bytestring" $+ forAll (genInvalid :: Gen LB.ByteString) isInvalid