hedgehog-classes 0.2.1 → 0.2.2
raw patch · 18 files changed
+385/−82 lines, 18 filesdep ~semiringsPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: semirings
API changes (from Hackage documentation)
Files
- CHANGELOG.md +8/−2
- hedgehog-classes.cabal +2/−5
- src/Hedgehog/Classes/MonadPlus.hs +7/−7
- src/Hedgehog/Classes/Storable.hs +1/−1
- test/Spec.hs +4/−4
- test/Spec/Bifoldable.hs +8/−6
- test/Spec/Enum.hs +16/−1
- test/Spec/Monad.hs +86/−7
- test/Spec/MonadIO.hs +0/−6
- test/Spec/MonadPlus.hs +0/−6
- test/Spec/MonadZip.hs +0/−6
- test/Spec/Monoid.hs +18/−10
- test/Spec/Semigroup.hs +38/−11
- test/Spec/Semiring.hs +79/−0
- test/Spec/Show.hs +77/−2
- test/Spec/ShowRead.hs +0/−6
- test/Spec/Storable.hs +32/−1
- test/Spec/Traversable.hs +9/−1
CHANGELOG.md view
@@ -3,11 +3,18 @@ `hedgehog-classes` uses [PVP Versioning][1]. The changelog is available [on GitHub][2]. +0.2.2+=====+* fix problem in storable set-get that caused attempt to index into+ 0-element malloc'd array+* Test suite now tests almost all laws sans arrow/category (thanks @ag-eitilt!)+* Correct tcName of `MonadPlus`. Was `Monad`, now it's `MonadPlus`.+ 0.2.1 ===== * fix problem where ordLaws failed for everything. there was some messed up logic used to check that transitivity held.- Thanks @ocharles for reporting this.+ Thanks very much to @ocharles for reporting this. 0.2.0.1 =======@@ -15,7 +22,6 @@ 0.2 ===- * switch to hedgehog-1.0 * add `binaryLaws` * relax cabal-version to 2.2
hedgehog-classes.cabal view
@@ -2,7 +2,7 @@ name: hedgehog-classes version:- 0.2.1+ 0.2.2 synopsis: Hedgehog will eat your typeclass bugs description:@@ -164,14 +164,11 @@ -- Spec.Ix Spec.Json Spec.Monad- Spec.MonadIO- Spec.MonadPlus- Spec.MonadZip Spec.Monoid Spec.Ord Spec.Semigroup+ Spec.Semiring Spec.Show- Spec.ShowRead Spec.Storable Spec.Traversable
src/Hedgehog/Classes/MonadPlus.hs view
@@ -20,7 +20,7 @@ ( MonadPlus f , forall x. Eq x => Eq (f x), forall x. Show x => Show (f x) ) => (forall x. Gen x -> Gen (f x)) -> Laws-monadPlusLaws gen = Laws "Monad"+monadPlusLaws gen = Laws "MonadPlus" [ ("Left Identity", monadPlusLeftIdentity gen) , ("Right Identity", monadPlusRightIdentity gen) , ("Associativity", monadPlusAssociativity gen)@@ -50,7 +50,7 @@ , "mzero = " ++ showMZero ] }- heqCtx1 lhs rhs ctx + heqCtx1 lhs rhs ctx monadPlusRightIdentity :: forall f. MonadPlusProp f monadPlusRightIdentity fgen = property $ do@@ -68,8 +68,8 @@ , "x = " ++ showX , "mzero = " ++ showMZero ]- } - heqCtx1 lhs rhs ctx + }+ heqCtx1 lhs rhs ctx monadPlusAssociativity :: forall f. MonadPlusProp f monadPlusAssociativity fgen = property $ do@@ -91,7 +91,7 @@ , "c = " ++ showC ] }- heqCtx1 lhs rhs ctx + heqCtx1 lhs rhs ctx monadPlusLeftZero :: forall f. MonadPlusProp f monadPlusLeftZero _ = property $ do@@ -128,7 +128,7 @@ , "v = " ++ showV , "mzero = " ++ showMZero ]- } - heqCtx1 lhs rhs ctx + }+ heqCtx1 lhs rhs ctx
src/Hedgehog/Classes/Storable.hs view
@@ -103,7 +103,7 @@ storableSetGet :: forall a. (Eq a, Show a, Storable a) => Gen a -> Property storableSetGet gen = property $ do a <- forAll gen- len <- forAll $ Gen.int (Range.linear 0 20)+ len <- forAll $ Gen.int (Range.linear 1 20) ix <- forAll $ Gen.int (Range.linear 0 (len - 1)) unsafePerformIO $ do ptr <- genArray gen len
test/Spec.hs view
@@ -21,14 +21,11 @@ --import Spec.Ix import Spec.Json import Spec.Monad-import Spec.MonadIO-import Spec.MonadPlus-import Spec.MonadZip import Spec.Monoid import Spec.Ord import Spec.Semigroup+import Spec.Semiring import Spec.Show-import Spec.ShowRead import Spec.Storable import Spec.Traversable @@ -53,6 +50,9 @@ ++ testExponentialSemigroup ++ testIdempotentSemigroup ++ testRectangularBandSemigroup+ ++ testSemiring+ ++ testRing+ ++ testStar ++ testShow ++ testShowRead ++ testStorable
test/Spec/Bifoldable.hs view
@@ -15,18 +15,20 @@ testBifoldableFunctor :: [(String, [Laws])] testBifoldableFunctor =- [ ("Either", lawsEither)- , ("Const", lawsConst)+ [ ("Either", functorLawsEither)+ , ("Const", functorLawsConst) ] -lawsEither :: [Laws]-lawsEither = [bifoldableLaws either]--lawsConst :: [Laws]+lawsConst, functorLawsConst :: [Laws] lawsConst = [bifoldableLaws const]+functorLawsConst = [bifoldableFunctorLaws const] const :: MonadGen m => m a -> m b -> m (Const a b) const genA _genB = fmap Const genA++lawsEither, functorLawsEither :: [Laws]+lawsEither = [bifoldableLaws either]+functorLawsEither = [bifoldableFunctorLaws either] either :: MonadGen m => m e -> m a -> m (Either e a) either genE genA =
test/Spec/Enum.hs view
@@ -3,11 +3,17 @@ import Hedgehog import Hedgehog.Classes +import Data.Int (Int64)+import Data.Word (Word64) import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range+import Numeric.Natural (Natural) testEnum :: [(String, [Laws])]-testEnum = []+testEnum =+ [ ("Integer", listInteger)+ , ("Natural", listNatural)+ ] testBoundedEnum :: [(String, [Laws])] testBoundedEnum =@@ -58,3 +64,12 @@ listWord16 = [boundedEnumLaws (ranged Gen.word16)] listWord32 = [boundedEnumLaws (ranged Gen.word32)] listWord64 = [boundedEnumLaws (ranged Gen.word64)]++listInteger, listNatural :: [Laws]+listInteger = [enumLaws (Gen.integral $ Range.constantFrom+ (0 :: Integer)+ (2 * fromIntegral (minBound :: Int64))+ (2 * fromIntegral (maxBound :: Int64)))]+listNatural = [enumLaws (Gen.integral $ Range.constant+ (0 :: Natural)+ (2 * fromIntegral (maxBound :: Word64)))]
test/Spec/Monad.hs view
@@ -1,6 +1,18 @@-module Spec.Monad (testMonad) where+{-# language+ DerivingStrategies+ , GeneralizedNewtypeDeriving+ #-} -import Data.Functor.Compose (Compose(..))+module Spec.Monad+ ( testMonad+ , testMonadIO+ , testMonadPlus+ , testMonadZip+ ) where++import Control.Applicative (Alternative(..), liftA2)+import Control.Monad.IO.Class (MonadIO(..))+ import Data.Functor.Identity (Identity(..)) import Hedgehog@@ -9,21 +21,48 @@ import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range +import System.IO.Unsafe (unsafePerformIO)+ import Prelude hiding (either) testMonad :: [(String, [Laws])] testMonad = [ ("[]", lawsList)- , ("Maybe", lawsMaybe) , ("Either e", lawsEither)+ , ("Identity", lawsIdentity)+ , ("IO", lawsIO)+ , ("Maybe", lawsMaybe) ] -lawsList :: [Laws]-lawsList = [monadLaws (Gen.list (Range.linear 0 6))]+{-+testMonadFix :: [(String, [Laws])]+testMonadFix =+ [ ("[]", fixLawsList)+ , ("Either e", fixLawsEither)+ , ("Identity", fixLawsIdentity)+ , ("IO", fixLawsIO)+ , ("Maybe", fixLawsMaybe)+ ]+-} -lawsMaybe :: [Laws]-lawsMaybe = [monadLaws Gen.maybe]+testMonadIO :: [(String, [Laws])]+testMonadIO =+ [ ("IO", ioLawsIO)+ ] +testMonadPlus :: [(String, [Laws])]+testMonadPlus =+ [ ("[]", plusLawsList)+ , ("Maybe", plusLawsMaybe)+ ]++testMonadZip :: [(String, [Laws])]+testMonadZip =+ [ ("[]", zipLawsList)+ , ("Identity", zipLawsIdentity)+ , ("Maybe", zipLawsMaybe)+ ]+ lawsEither :: [Laws] lawsEither = [monadLaws eitherInteger] @@ -37,3 +76,43 @@ (2, Left <$> genE) , (1 + fromIntegral n, Right <$> genA) ]++lawsIdentity, zipLawsIdentity :: [Laws]+lawsIdentity = [monadLaws identity]+zipLawsIdentity = [monadZipLaws identity]++identity :: MonadGen m => m a -> m (Identity a)+identity = fmap Identity++lawsList, plusLawsList, zipLawsList :: [Laws]+lawsList = [monadLaws list]+plusLawsList = [monadPlusLaws list]+zipLawsList = [monadZipLaws list]++list :: MonadGen m => m a -> m [a]+list = Gen.list $ Range.linear 0 6++lawsMaybe, plusLawsMaybe, zipLawsMaybe :: [Laws]+lawsMaybe = [monadLaws Gen.maybe]+plusLawsMaybe = [monadPlusLaws Gen.maybe]+zipLawsMaybe = [monadZipLaws Gen.maybe]++lawsIO, ioLawsIO :: [Laws]+lawsIO = [monadLaws io]+ioLawsIO = [monadIOLaws io]++newtype TestIO a = TestIO (IO a)+ deriving newtype (Functor, Applicative, Monad, Alternative)++-- | Unsafe!+instance Eq a => Eq (TestIO a) where+ TestIO a == TestIO b = unsafePerformIO $ liftA2 (==) a b+ {-# noinline (==) #-}+-- | Unsafe!+instance Show a => Show (TestIO a) where+ showsPrec d (TestIO a) = unsafePerformIO $ fmap (showsPrec d) a+instance MonadIO TestIO where+ liftIO = TestIO++io :: MonadGen m => m a -> m (TestIO a)+io = fmap pure
− test/Spec/MonadIO.hs
@@ -1,6 +0,0 @@-module Spec.MonadIO (testMonadIO) where--import Hedgehog.Classes--testMonadIO :: [(String, [Laws])]-testMonadIO = []
− test/Spec/MonadPlus.hs
@@ -1,6 +0,0 @@-module Spec.MonadPlus (testMonadPlus) where--import Hedgehog.Classes--testMonadPlus :: [(String, [Laws])]-testMonadPlus = []
− test/Spec/MonadZip.hs
@@ -1,6 +0,0 @@-module Spec.MonadZip (testMonadZip) where--import Hedgehog.Classes--testMonadZip :: [(String, [Laws])]-testMonadZip = []
test/Spec/Monoid.hs view
@@ -18,29 +18,37 @@ testCommutativeMonoid :: [(String, [Laws])] testCommutativeMonoid =- [ ("Sum Integer", lawsSum)- , ("Product Integer", lawsProduct)- , ("Maybe Integer", lawsMaybe)+ [ ("Sum Integer", commutativeLawsSum)+ , ("Product Integer", commutativeLawsProduct)+ , ("Maybe Integer", commutativeLawsMaybe) ] -lawsSum, lawsProduct, lawsMaybe, lawsAp :: [Laws]--lawsSum = [monoidLaws genSum]-lawsProduct = [monoidLaws genProduct]-lawsMaybe = [monoidLaws genMaybe]-lawsAp = [monoidLaws genAp]- genInteger :: Gen Integer genInteger = Gen.integral (Range.linear (-3) 20) +lawsSum, commutativeLawsSum :: [Laws]+lawsSum = [monoidLaws genSum]+commutativeLawsSum = [commutativeMonoidLaws genSum]+ genSum :: Gen (Sum Integer) genSum = fmap coerce genInteger +lawsProduct, commutativeLawsProduct :: [Laws]+lawsProduct = [monoidLaws genProduct]+commutativeLawsProduct = [commutativeMonoidLaws genProduct]+ genProduct :: Gen (Product Integer) genProduct = fmap coerce genInteger +lawsMaybe, commutativeLawsMaybe :: [Laws]+lawsMaybe = [monoidLaws genMaybe]+commutativeLawsMaybe = [commutativeMonoidLaws genMaybe]+ genMaybe :: Gen (Maybe (Sum Integer)) genMaybe = Gen.maybe genSum++lawsAp :: [Laws]+lawsAp = [monoidLaws genAp] genAp :: Gen (Ap Maybe (Sum Integer)) genAp = fmap coerce genMaybe
test/Spec/Semigroup.hs view
@@ -9,27 +9,54 @@ import Hedgehog.Classes import Data.Monoid (Sum(..))+import Data.Semigroup (Last(..)) import Hedgehog (Gen) import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range testSemigroup :: [(String, [Laws])]-testSemigroup = [("Maybe", listMaybe)]--listMaybe :: [Laws]-listMaybe = map ($ genMaybe) [semigroupLaws, commutativeSemigroupLaws]--genMaybe :: Gen (Maybe (Sum Int))-genMaybe = Gen.maybe (fmap Sum $ Gen.int Range.constantBounded)+testSemigroup =+ [ ("Last", lawsLast)+ , ("Maybe", lawsMaybe)+ ] testCommutativeSemigroup :: [(String, [Laws])]-testCommutativeSemigroup = []+testCommutativeSemigroup =+ [ ("Maybe", commutativeLawsMaybe)+ ] testExponentialSemigroup :: [(String, [Laws])]-testExponentialSemigroup = []+testExponentialSemigroup =+ [ ("Last", exponentialLawsLast)+ , ("Maybe", exponentialLawsMaybe)+ ] testIdempotentSemigroup :: [(String, [Laws])]-testIdempotentSemigroup = []+testIdempotentSemigroup =+ [ ("Last", idempotentLawsLast)+ ] testRectangularBandSemigroup :: [(String, [Laws])]-testRectangularBandSemigroup = []+testRectangularBandSemigroup =+ [ ("Last", rectangularBandLawsLast)+ ]++genInteger :: Gen Integer+genInteger = Gen.integral (Range.linear (-3) 20)++lawsLast, exponentialLawsLast, idempotentLawsLast, rectangularBandLawsLast :: [Laws]+lawsLast = [semigroupLaws genLast]+exponentialLawsLast = [exponentialSemigroupLaws genLast]+idempotentLawsLast = [idempotentSemigroupLaws genLast]+rectangularBandLawsLast = [rectangularBandSemigroupLaws genLast]++genLast :: Gen (Last Integer)+genLast = Last <$> genInteger++lawsMaybe, commutativeLawsMaybe, exponentialLawsMaybe :: [Laws]+lawsMaybe = [semigroupLaws genMaybe]+commutativeLawsMaybe = [commutativeSemigroupLaws genMaybe]+exponentialLawsMaybe = [exponentialSemigroupLaws genMaybe]++genMaybe :: Gen (Maybe (Sum Integer))+genMaybe = Gen.maybe (Sum <$> genInteger)
+ test/Spec/Semiring.hs view
@@ -0,0 +1,79 @@+module Spec.Semiring+ ( testSemiring+ , testRing+ , testStar+ ) where++import Hedgehog.Classes++import qualified Hedgehog.Gen as Gen+import qualified Hedgehog.Range as Range++testSemiring :: [(String, [Laws])]+testSemiring =+ [ ("Bool", lawsBool)+ , ("Int", lawsInt)+ , ("Int8", lawsInt8)+ , ("Int16", lawsInt16)+ , ("Int32", lawsInt32)+ , ("Int64", lawsInt64)+ , ("Word", lawsWord)+ , ("Word8", lawsWord8)+ , ("Word16", lawsWord16)+ , ("Word32", lawsWord32)+ , ("Word64", lawsWord64)+ ]++testRing :: [(String, [Laws])]+testRing =+ [ ("Int", ringLawsInt)+ , ("Int8", ringLawsInt8)+ , ("Int16", ringLawsInt16)+ , ("Int32", ringLawsInt32)+ , ("Int64", ringLawsInt64)+ , ("Word", ringLawsWord)+ , ("Word8", ringLawsWord8)+ , ("Word16", ringLawsWord16)+ , ("Word32", ringLawsWord32)+ , ("Word64", ringLawsWord64)+ ]++testStar :: [(String, [Laws])]+testStar =+ [ ("Bool", starLawsBool)+ ]++ranged :: (Bounded a, Num a) => (Range.Range a -> b) -> b+ranged f = f Range.constantBounded++lawsBool, starLawsBool :: [Laws]+lawsBool = [semiringLaws Gen.bool]+starLawsBool = [starLaws Gen.bool]++lawsInt, lawsInt8, lawsInt16, lawsInt32, lawsInt64 :: [Laws]+lawsInt = [semiringLaws (ranged Gen.int)]+lawsInt8 = [semiringLaws (ranged Gen.int8)]+lawsInt16 = [semiringLaws (ranged Gen.int16)]+lawsInt32 = [semiringLaws (ranged Gen.int32)]+lawsInt64 = [semiringLaws (ranged Gen.int64)]++lawsWord, lawsWord8, lawsWord16, lawsWord32, lawsWord64 :: [Laws]+lawsWord = [semiringLaws (ranged Gen.word)]+lawsWord8 = [semiringLaws (ranged Gen.word8)]+lawsWord16 = [semiringLaws (ranged Gen.word16)]+lawsWord32 = [semiringLaws (ranged Gen.word32)]+lawsWord64 = [semiringLaws (ranged Gen.word64)]++ringLawsInt, ringLawsInt8, ringLawsInt16, ringLawsInt32, ringLawsInt64 :: [Laws]+ringLawsInt = [ringLaws (ranged Gen.int)]+ringLawsInt8 = [ringLaws (ranged Gen.int8)]+ringLawsInt16 = [ringLaws (ranged Gen.int16)]+ringLawsInt32 = [ringLaws (ranged Gen.int32)]+ringLawsInt64 = [ringLaws (ranged Gen.int64)]++ringLawsWord, ringLawsWord8, ringLawsWord16, ringLawsWord32, ringLawsWord64 :: [Laws]+ringLawsWord = [ringLaws (ranged Gen.word)]+ringLawsWord8 = [ringLaws (ranged Gen.word8)]+ringLawsWord16 = [ringLaws (ranged Gen.word16)]+ringLawsWord32 = [ringLaws (ranged Gen.word32)]+ringLawsWord64 = [ringLaws (ranged Gen.word64)]
test/Spec/Show.hs view
@@ -1,6 +1,81 @@-module Spec.Show (testShow) where+module Spec.Show+ ( testShow+ , testShowRead+ ) where +import Hedgehog import Hedgehog.Classes +import qualified Hedgehog.Gen as Gen+import qualified Hedgehog.Range as Range+ testShow :: [(String, [Laws])]-testShow = []+testShow =+ [ ("E", lawsE)+ , ("Int", lawsInt)+ , ("Int8", lawsInt8)+ , ("Int16", lawsInt16)+ , ("Int32", lawsInt32)+ , ("Int64", lawsInt64)+ , ("Word", lawsWord)+ , ("Word8", lawsWord8)+ , ("Word16", lawsWord16)+ , ("Word32", lawsWord32)+ , ("Word64", lawsWord64) + ]++testShowRead :: [(String, [Laws])]+testShowRead =+ [ ("E", readLawsE)+ , ("Int", readLawsInt)+ , ("Int8", readLawsInt8)+ , ("Int16", readLawsInt16)+ , ("Int32", readLawsInt32)+ , ("Int64", readLawsInt64)+ , ("Word", readLawsWord)+ , ("Word8", readLawsWord8)+ , ("Word16", readLawsWord16)+ , ("Word32", readLawsWord32)+ , ("Word64", readLawsWord64) + ]++lawsE, readLawsE :: [Laws]+lawsE = [showLaws genE]+readLawsE = [showReadLaws genE]++data E = E1 | E2 | E3 | E4 | E5 | E6 | E7 | E8+ deriving (Eq, Show, Read, Enum, Bounded)++genE :: Gen E+genE = Gen.enumBounded++ranged :: (Bounded a, Num a) => (Range.Range a -> b) -> b+ranged f = f (Range.constantBounded)++lawsInt, lawsInt8, lawsInt16, lawsInt32, lawsInt64 :: [Laws]+lawsInt = [showLaws (ranged Gen.int)]+lawsInt8 = [showLaws (ranged Gen.int8)]+lawsInt16 = [showLaws (ranged Gen.int16)]+lawsInt32 = [showLaws (ranged Gen.int32)]+lawsInt64 = [showLaws (ranged Gen.int64)]++lawsWord, lawsWord8, lawsWord16, lawsWord32, lawsWord64 :: [Laws]+lawsWord = [showLaws (ranged Gen.word)]+lawsWord8 = [showLaws (ranged Gen.word8)]+lawsWord16 = [showLaws (ranged Gen.word16)]+lawsWord32 = [showLaws (ranged Gen.word32)]+lawsWord64 = [showLaws (ranged Gen.word64)]++readLawsInt, readLawsInt8, readLawsInt16, readLawsInt32, readLawsInt64 :: [Laws]+readLawsInt = [showReadLaws (ranged Gen.int)]+readLawsInt8 = [showReadLaws (ranged Gen.int8)]+readLawsInt16 = [showReadLaws (ranged Gen.int16)]+readLawsInt32 = [showReadLaws (ranged Gen.int32)]+readLawsInt64 = [showReadLaws (ranged Gen.int64)]++readLawsWord, readLawsWord8, readLawsWord16, readLawsWord32, readLawsWord64 :: [Laws]+readLawsWord = [showReadLaws (ranged Gen.word)]+readLawsWord8 = [showReadLaws (ranged Gen.word8)]+readLawsWord16 = [showReadLaws (ranged Gen.word16)]+readLawsWord32 = [showReadLaws (ranged Gen.word32)]+readLawsWord64 = [showReadLaws (ranged Gen.word64)]
− test/Spec/ShowRead.hs
@@ -1,6 +0,0 @@-module Spec.ShowRead (testShowRead) where--import Hedgehog.Classes--testShowRead :: [(String, [Laws])]-testShowRead = []
test/Spec/Storable.hs view
@@ -2,5 +2,36 @@ import Hedgehog.Classes +import qualified Hedgehog.Gen as Gen+import qualified Hedgehog.Range as Range+ testStorable :: [(String, [Laws])]-testStorable = []+testStorable =+ [ ("Int", lawsInt)+ , ("Int8", lawsInt8)+ , ("Int16", lawsInt16)+ , ("Int32", lawsInt32)+ , ("Int64", lawsInt64)+ , ("Word", lawsWord)+ , ("Word8", lawsWord8)+ , ("Word16", lawsWord16)+ , ("Word32", lawsWord32)+ , ("Word64", lawsWord64)+ ]++ranged :: (Bounded a, Num a) => (Range.Range a -> b) -> b+ranged f = f (Range.constantBounded)++lawsInt, lawsInt8, lawsInt16, lawsInt32, lawsInt64 :: [Laws]+lawsInt = [storableLaws (ranged Gen.int)]+lawsInt8 = [storableLaws (ranged Gen.int8)]+lawsInt16 = [storableLaws (ranged Gen.int16)]+lawsInt32 = [storableLaws (ranged Gen.int32)]+lawsInt64 = [storableLaws (ranged Gen.int64)]++lawsWord, lawsWord8, lawsWord16, lawsWord32, lawsWord64 :: [Laws]+lawsWord = [storableLaws (ranged Gen.word)]+lawsWord8 = [storableLaws (ranged Gen.word8)]+lawsWord16 = [storableLaws (ranged Gen.word16)]+lawsWord32 = [storableLaws (ranged Gen.word32)]+lawsWord64 = [storableLaws (ranged Gen.word64)]
test/Spec/Traversable.hs view
@@ -2,5 +2,13 @@ import Hedgehog.Classes +import qualified Hedgehog.Gen as Gen+import qualified Hedgehog.Range as Range+ testTraversable :: [(String, [Laws])]-testTraversable = []+testTraversable =+ [ ("[]", lawsList)+ ]++lawsList :: [Laws]+lawsList = [traversableLaws (Gen.list (Range.linear 0 6))]