git.iko.soy/typeable/generic-arbitrary
on master help sign in
going conditional comp
ddcfeccAleksey Uymanov
generic-arbitrary.cabal+4−1
@@ -26,7 +26,7 @@ source-repository head
26library
26library
27 exposed-modules: Test.QuickCheck.Arbitrary.Generic
27 exposed-modules: Test.QuickCheck.Arbitrary.Generic
28 build-depends: base >=4.8 && <5
28 build-depends: base >=4.8 && <5
29− , QuickCheck >= 2.14
29+ , QuickCheck
30 hs-source-dirs: src
30 hs-source-dirs: src
31 default-language: Haskell2010
31 default-language: Haskell2010
32 default-extensions: AllowAmbiguousTypes
32 default-extensions: AllowAmbiguousTypes
@@ -68,7 +68,10 @@ test-suite test
68 default-extensions: AllowAmbiguousTypes
68 default-extensions: AllowAmbiguousTypes
69 , CPP
69 , CPP
70 , DataKinds
70 , DataKinds
71+ , DeriveAnyClass
71 , DeriveGeneric
72 , DeriveGeneric
73+ , DerivingStrategies
74+ , DerivingVia
72 , FlexibleContexts
75 , FlexibleContexts
73 , FlexibleInstances
76 , FlexibleInstances
74 , GeneralizedNewtypeDeriving
77 , GeneralizedNewtypeDeriving
src/Test/QuickCheck/Arbitrary/Generic.hs+6−4
@@ -1,5 +1,3 @@
1−{-# LANGUAGE FlexibleContexts, UndecidableInstances, TypeOperators, DataKinds, TypeFamilies, ScopedTypeVariables#-}
2−
3{- |
1{- |
4
2
5Generic implementation of the 'arbitrary' method. Example usage:
3Generic implementation of the 'arbitrary' method. Example usage:
@@ -32,8 +30,10 @@ The generated 'arbitrary' method is equivalent to
32-}
30-}
33
31
34module Test.QuickCheck.Arbitrary.Generic
32module Test.QuickCheck.Arbitrary.Generic
33+ ( Arbitrary(..)
34+#if MIN_VERSION_QuickCheck(2, 14, 0)
35− ( GenericArbitrary(..)
35+ , GenericArbitrary(..)
36− , Arbitrary(..)
36+#endif
37 , Arg
37 , Arg
38 , genericArbitrary
38 , genericArbitrary
39 , genericShrink
39 , genericShrink
@@ -46,6 +46,7 @@ import Data.Type.Bool
46import GHC.Generics as G
46import GHC.Generics as G
47import GHC.TypeLits
47import GHC.TypeLits
48import Test.QuickCheck as QC
48import Test.QuickCheck as QC
49+#if MIN_VERSION_QuickCheck(2, 14, 0)
49import Test.QuickCheck.Arbitrary (GSubterms, RecursivelyShrink)
50import Test.QuickCheck.Arbitrary (GSubterms, RecursivelyShrink)
50
51
51newtype GenericArbitrary a = GenericArbitrary { unGenericArbitrary :: a }
52newtype GenericArbitrary a = GenericArbitrary { unGenericArbitrary :: a }
@@ -59,6 +60,7 @@ instance
59 ) => Arbitrary (GenericArbitrary a) where
60 ) => Arbitrary (GenericArbitrary a) where
60 arbitrary = coerce (genericArbitrary :: Gen a)
61 arbitrary = coerce (genericArbitrary :: Gen a)
61 shrink = coerce (genericShrink :: a -> [a])
62 shrink = coerce (genericShrink :: a -> [a])
63+#endif
62
64
63type family TypesDiffer a b where
65type family TypesDiffer a b where
64 TypesDiffer a a = 'False
66 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−
6module LimitationDemo where
1module LimitationDemo where
7
2
8import Control.DeepSeq
3import Control.DeepSeq
@@ -16,12 +11,24 @@ import Test.QuickCheck.Arbitrary.Generic
16data R1 = R1 R2
11data R1 = R1 R2
17 deriving (Eq, Ord, Show, Generic)
12 deriving (Eq, Ord, Show, Generic)
18 deriving anyclass NFData
13 deriving anyclass NFData
14+#if MIN_VERSION_QuickCheck(2, 14, 0)
19 deriving Arbitrary via (GenericArbitrary R1)
15 deriving Arbitrary via (GenericArbitrary R1)
16+#else
17+instance Arbitrary R1 where
18+ arbitrary = genericArbitrary
19+ shrink = genericShrink
20+#endif
20
21
21data R2 = R2 R1
22data R2 = R2 R1
22 deriving (Eq, Ord, Show, Generic)
23 deriving (Eq, Ord, Show, Generic)
23 deriving anyclass NFData
24 deriving anyclass NFData
25+#if MIN_VERSION_QuickCheck(2, 14, 0)
24 deriving Arbitrary via (GenericArbitrary R2)
26 deriving Arbitrary via (GenericArbitrary R2)
27+#else
28+instance Arbitrary R2 where
29+ arbitrary = genericArbitrary
30+ shrink = genericShrink
31+#endif
25
32
26-- To force the instance realy be generated
33-- To force the instance realy be generated
27usage :: IO ()
34usage :: IO ()
test/RecursiveTest.hs+43−1
@@ -15,7 +15,13 @@ import Test.QuickCheck.Arbitrary.Generic
15data Unit = Unit
15data Unit = Unit
16 deriving (Eq, Show, Generic)
16 deriving (Eq, Show, Generic)
17 deriving anyclass NFData
17 deriving anyclass NFData
18+#if MIN_VERSION_QuickCheck(2, 14, 0)
18 deriving Arbitrary via (GenericArbitrary Unit)
19 deriving Arbitrary via (GenericArbitrary Unit)
20+#else
21+instance Arbitrary Unit where
22+ arbitrary = genericArbitrary
23+ shrink = genericShrink
24+#endif
19
25
20prop_unitTotal :: Unit -> Property
26prop_unitTotal :: Unit -> Property
21prop_unitTotal = total
27prop_unitTotal = total
@@ -23,7 +29,13 @@ prop_unitTotal = total
23data Single = Single Int
29data Single = Single Int
24 deriving (Eq, Show, Generic)
30 deriving (Eq, Show, Generic)
25 deriving anyclass NFData
31 deriving anyclass NFData
32+#if MIN_VERSION_QuickCheck(2, 14, 0)
26 deriving Arbitrary via (GenericArbitrary Single)
33 deriving Arbitrary via (GenericArbitrary Single)
34+#else
35+instance Arbitrary Single where
36+ arbitrary = genericArbitrary
37+ shrink = genericShrink
38+#endif
27
39
28prop_singleTotal :: Single -> Property
40prop_singleTotal :: Single -> Property
29prop_singleTotal = total
41prop_singleTotal = total
@@ -31,7 +43,13 @@ prop_singleTotal = total
31data Multiple = M1 | M2 | M3 Int
43data Multiple = M1 | M2 | M3 Int
32 deriving (Eq, Show, Generic)
44 deriving (Eq, Show, Generic)
33 deriving anyclass NFData
45 deriving anyclass NFData
46+#if MIN_VERSION_QuickCheck(2, 14, 0)
34 deriving Arbitrary via (GenericArbitrary Multiple)
47 deriving Arbitrary via (GenericArbitrary Multiple)
48+#else
49+instance Arbitrary Multiple where
50+ arbitrary = genericArbitrary
51+ shrink = genericShrink
52+#endif
35
53
36prop_multipleTotal :: Multiple -> Property
54prop_multipleTotal :: Multiple -> Property
37prop_multipleTotal = total
55prop_multipleTotal = total
@@ -42,7 +60,13 @@ data Rec = Rec
42 , multiple :: Multiple
60 , multiple :: Multiple
43 } deriving (Eq, Show, Generic)
61 } deriving (Eq, Show, Generic)
44 deriving anyclass NFData
62 deriving anyclass NFData
63+#if MIN_VERSION_QuickCheck(2, 14, 0)
45− deriving Arbitrary via (GenericArbitrary Rec)
64+ deriving Arbitrary via (GenericArbitrary Rec)
65+#else
66+instance Arbitrary Rec where
67+ arbitrary = genericArbitrary
68+ shrink = genericShrink
69+#endif
46
70
47prop_recTotal :: Rec -> Property
71prop_recTotal :: Rec -> Property
48prop_recTotal = total
72prop_recTotal = total
@@ -53,7 +77,13 @@ data Expr
53 | Mul Expr Expr
77 | Mul Expr Expr
54 deriving (Eq, Show, Generic)
78 deriving (Eq, Show, Generic)
55 deriving anyclass NFData
79 deriving anyclass NFData
80+#if MIN_VERSION_QuickCheck(2, 14, 0)
56 deriving Arbitrary via (GenericArbitrary Expr)
81 deriving Arbitrary via (GenericArbitrary Expr)
82+#else
83+instance Arbitrary Expr where
84+ arbitrary = genericArbitrary
85+ shrink = genericShrink
86+#endif
57
87
58prop_exprTotal :: Expr -> Property
88prop_exprTotal :: Expr -> Property
59prop_exprTotal = total
89prop_exprTotal = total
@@ -67,7 +97,13 @@ data Recursive
67 | R5 Recursive String
97 | R5 Recursive String
68 deriving (Eq, Show, Generic)
98 deriving (Eq, Show, Generic)
69 deriving anyclass NFData
99 deriving anyclass NFData
100+#if MIN_VERSION_QuickCheck(2, 14, 0)
70 deriving Arbitrary via (GenericArbitrary Recursive)
101 deriving Arbitrary via (GenericArbitrary Recursive)
102+#else
103+instance Arbitrary Recursive where
104+ arbitrary = genericArbitrary
105+ shrink = genericShrink
106+#endif
71
107
72prop_recursiveTotal :: Recursive -> Property
108prop_recursiveTotal :: Recursive -> Property
73prop_recursiveTotal = total
109prop_recursiveTotal = total
@@ -77,7 +113,13 @@ data DeepRecursive
77 | Short
113 | Short
78 deriving (Eq, Show, Generic)
114 deriving (Eq, Show, Generic)
79 deriving anyclass NFData
115 deriving anyclass NFData
116+#if MIN_VERSION_QuickCheck(2, 14, 0)
80 deriving Arbitrary via (GenericArbitrary DeepRecursive)
117 deriving Arbitrary via (GenericArbitrary DeepRecursive)
118+#else
119+instance Arbitrary DeepRecursive where
120+ arbitrary = genericArbitrary
121+ shrink = genericShrink
122+#endif
81
123
82prop_deepRecursiveTotal :: DeepRecursive -> Property
124prop_deepRecursiveTotal :: DeepRecursive -> Property
83prop_deepRecursiveTotal = total
125prop_deepRecursiveTotal = total