packages feed

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 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