git.iko.soy/typeable/generic-arbitrary
on master help sign in
going conditional comp
commitddcfecc636a408e0e95cdd9386737063c8edf562 authorAleksey Uymanov <s9gf4ult@gmail.com> dateMon 8 Aug 2022, 12:43 (4 years ago) parentd802f67
4 files changed+65−11
generic-arbitrary.cabal+4−1 src/Test/QuickCheck/Arbitrary/Generic.hs+6−4 test/LimitationDemo.hs+12−5 test/RecursiveTest.hs+43−1
generic-arbitrary.cabal+4−1
@@ -26,7 +26,7 @@ source-repository head
2626library
2727 exposed-modules: Test.QuickCheck.Arbitrary.Generic
2828 build-depends: base >=4.8 && <5
29− , QuickCheck >= 2.14
29+ , QuickCheck
3030 hs-source-dirs: src
3131 default-language: Haskell2010
3232 default-extensions: AllowAmbiguousTypes
@@ -68,7 +68,10 @@ test-suite test
6868 default-extensions: AllowAmbiguousTypes
6969 , CPP
7070 , DataKinds
71+ , DeriveAnyClass
7172 , DeriveGeneric
73+ , DerivingStrategies
74+ , DerivingVia
7275 , FlexibleContexts
7376 , FlexibleInstances
7477 , GeneralizedNewtypeDeriving
src/Test/QuickCheck/Arbitrary/Generic.hs+6−4
@@ -1,5 +1,3 @@
1−{-# LANGUAGE FlexibleContexts, UndecidableInstances, TypeOperators, DataKinds, TypeFamilies, ScopedTypeVariables#-}
2−
31{- |
42
53Generic implementation of the 'arbitrary' method. Example usage:
@@ -32,8 +30,10 @@ The generated 'arbitrary' method is equivalent to
3230-}
3331
3432module Test.QuickCheck.Arbitrary.Generic
35− ( GenericArbitrary(..)
36− , Arbitrary(..)
33+ ( Arbitrary(..)
34+#if MIN_VERSION_QuickCheck(2, 14, 0)
35+ , GenericArbitrary(..)
36+#endif
3737 , Arg
3838 , genericArbitrary
3939 , genericShrink
@@ -46,6 +46,7 @@ import Data.Type.Bool
4646import GHC.Generics as G
4747import GHC.TypeLits
4848import Test.QuickCheck as QC
49+#if MIN_VERSION_QuickCheck(2, 14, 0)
4950import Test.QuickCheck.Arbitrary (GSubterms, RecursivelyShrink)
5051
5152newtype GenericArbitrary a = GenericArbitrary { unGenericArbitrary :: a }
@@ -59,6 +60,7 @@ instance
5960 ) => Arbitrary (GenericArbitrary a) where
6061 arbitrary = coerce (genericArbitrary :: Gen a)
6162 shrink = coerce (genericShrink :: a -> [a])
63+#endif
6264
6365type family TypesDiffer a b where
6466 TypesDiffer a a = 'False
test/LimitationDemo.hs+12−5
@@ -1,8 +1,3 @@
1−{-# LANGUAGE NumDecimals #-}
2−{-# LANGUAGE DerivingStrategies #-}
3−{-# LANGUAGE DerivingVia #-}
4−{-# LANGUAGE DeriveAnyClass #-}
5−
61module LimitationDemo where
72
83import Control.DeepSeq
@@ -16,12 +11,24 @@ import Test.QuickCheck.Arbitrary.Generic
1611data R1 = R1 R2
1712 deriving (Eq, Ord, Show, Generic)
1813 deriving anyclass NFData
14+#if MIN_VERSION_QuickCheck(2, 14, 0)
1915 deriving Arbitrary via (GenericArbitrary R1)
16+#else
17+instance Arbitrary R1 where
18+ arbitrary = genericArbitrary
19+ shrink = genericShrink
20+#endif
2021
2122data R2 = R2 R1
2223 deriving (Eq, Ord, Show, Generic)
2324 deriving anyclass NFData
25+#if MIN_VERSION_QuickCheck(2, 14, 0)
2426 deriving Arbitrary via (GenericArbitrary R2)
27+#else
28+instance Arbitrary R2 where
29+ arbitrary = genericArbitrary
30+ shrink = genericShrink
31+#endif
2532
2633-- To force the instance realy be generated
2734usage :: IO ()
test/RecursiveTest.hs+43−1
@@ -15,7 +15,13 @@ import Test.QuickCheck.Arbitrary.Generic
1515data Unit = Unit
1616 deriving (Eq, Show, Generic)
1717 deriving anyclass NFData
18+#if MIN_VERSION_QuickCheck(2, 14, 0)
1819 deriving Arbitrary via (GenericArbitrary Unit)
20+#else
21+instance Arbitrary Unit where
22+ arbitrary = genericArbitrary
23+ shrink = genericShrink
24+#endif
1925
2026prop_unitTotal :: Unit -> Property
2127prop_unitTotal = total
@@ -23,7 +29,13 @@ prop_unitTotal = total
2329data Single = Single Int
2430 deriving (Eq, Show, Generic)
2531 deriving anyclass NFData
32+#if MIN_VERSION_QuickCheck(2, 14, 0)
2633 deriving Arbitrary via (GenericArbitrary Single)
34+#else
35+instance Arbitrary Single where
36+ arbitrary = genericArbitrary
37+ shrink = genericShrink
38+#endif
2739
2840prop_singleTotal :: Single -> Property
2941prop_singleTotal = total
@@ -31,7 +43,13 @@ prop_singleTotal = total
3143data Multiple = M1 | M2 | M3 Int
3244 deriving (Eq, Show, Generic)
3345 deriving anyclass NFData
46+#if MIN_VERSION_QuickCheck(2, 14, 0)
3447 deriving Arbitrary via (GenericArbitrary Multiple)
48+#else
49+instance Arbitrary Multiple where
50+ arbitrary = genericArbitrary
51+ shrink = genericShrink
52+#endif
3553
3654prop_multipleTotal :: Multiple -> Property
3755prop_multipleTotal = total
@@ -42,7 +60,13 @@ data Rec = Rec
4260 , multiple :: Multiple
4361 } deriving (Eq, Show, Generic)
4462 deriving anyclass NFData
45− deriving Arbitrary via (GenericArbitrary Rec)
63+#if MIN_VERSION_QuickCheck(2, 14, 0)
64+ deriving Arbitrary via (GenericArbitrary Rec)
65+#else
66+instance Arbitrary Rec where
67+ arbitrary = genericArbitrary
68+ shrink = genericShrink
69+#endif
4670
4771prop_recTotal :: Rec -> Property
4872prop_recTotal = total
@@ -53,7 +77,13 @@ data Expr
5377 | Mul Expr Expr
5478 deriving (Eq, Show, Generic)
5579 deriving anyclass NFData
80+#if MIN_VERSION_QuickCheck(2, 14, 0)
5681 deriving Arbitrary via (GenericArbitrary Expr)
82+#else
83+instance Arbitrary Expr where
84+ arbitrary = genericArbitrary
85+ shrink = genericShrink
86+#endif
5787
5888prop_exprTotal :: Expr -> Property
5989prop_exprTotal = total
@@ -67,7 +97,13 @@ data Recursive
6797 | R5 Recursive String
6898 deriving (Eq, Show, Generic)
6999 deriving anyclass NFData
100+#if MIN_VERSION_QuickCheck(2, 14, 0)
70101 deriving Arbitrary via (GenericArbitrary Recursive)
102+#else
103+instance Arbitrary Recursive where
104+ arbitrary = genericArbitrary
105+ shrink = genericShrink
106+#endif
71107
72108prop_recursiveTotal :: Recursive -> Property
73109prop_recursiveTotal = total
@@ -77,7 +113,13 @@ data DeepRecursive
77113 | Short
78114 deriving (Eq, Show, Generic)
79115 deriving anyclass NFData
116+#if MIN_VERSION_QuickCheck(2, 14, 0)
80117 deriving Arbitrary via (GenericArbitrary DeepRecursive)
118+#else
119+instance Arbitrary DeepRecursive where
120+ arbitrary = genericArbitrary
121+ shrink = genericShrink
122+#endif
81123
82124prop_deepRecursiveTotal :: DeepRecursive -> Property
83125prop_deepRecursiveTotal = total