git.iko.soy/typeable/generic-arbitrary
on master help sign in
Merge branch 'fix-instances' into older-quickcheck
bcf174eAleksey Uymanov
generic-arbitrary.cabal+1
@@ -35,6 +35,7 @@ library
35 default-language: Haskell2010
35 default-language: Haskell2010
36 default-extensions: AllowAmbiguousTypes
36 default-extensions: AllowAmbiguousTypes
37 , CPP
37 , CPP
38+ , ConstraintKinds
38 , DataKinds
39 , DataKinds
39 , DeriveGeneric
40 , DeriveGeneric
40 , FlexibleContexts
41 , FlexibleContexts
src/Test/QuickCheck/Arbitrary/Generic.hs+9−4
@@ -31,6 +31,7 @@ The generated 'arbitrary' method is equivalent to
31
31
32module Test.QuickCheck.Arbitrary.Generic
32module Test.QuickCheck.Arbitrary.Generic
33 ( Arbitrary(..)
33 ( Arbitrary(..)
34+ , Arg
34 , genericArbitrary
35 , genericArbitrary
35 , genericShrink
36 , genericShrink
36 ) where
37 ) where
@@ -44,16 +45,20 @@ import GHC.TypeLits
44import Test.QuickCheck as QC
45import Test.QuickCheck as QC
45import Test.QuickCheck.Arbitrary
46import Test.QuickCheck.Arbitrary
46
47
48+type family TypesDiffer a b where
49+ TypesDiffer a a = 'False
50+ TypesDiffer a b = 'True
51+
52+type Arg self field = (TypesDiffer self field ~ 'True)
53+
47type family AllFieldsFinal self (a :: * -> *) :: Bool where
54type family AllFieldsFinal self (a :: * -> *) :: Bool where
48 AllFieldsFinal self U1 = 'True
55 AllFieldsFinal self U1 = 'True
49 AllFieldsFinal self (a :*: b) = AllFieldsFinal self a && AllFieldsFinal self b
56 AllFieldsFinal self (a :*: b) = AllFieldsFinal self a && AllFieldsFinal self b
50− AllFieldsFinal self (M1 S t (K1 R self)) = 'False
57+ AllFieldsFinal self (M1 S t (K1 R field)) = TypesDiffer self field
51− AllFieldsFinal self (M1 S t (K1 R other)) = 'True
52
58
53type family Finite self (a :: * -> *) :: Bool where
59type family Finite self (a :: * -> *) :: Bool where
54 Finite self U1 = 'True
60 Finite self U1 = 'True
55− Finite self (K1 R self) = 'False
61+ Finite self (K1 R field) = TypesDiffer self field
56− Finite self (K1 R other) = 'True
57 Finite self (a :*: b) = Finite self a && Finite self b
62 Finite self (a :*: b) = Finite self a && Finite self b
58 Finite self (M1 D t f) = Finite self f
63 Finite self (M1 D t f) = Finite self f
59 Finite self (a :+: b) = Finite self a || Finite self b
64 Finite self (a :+: b) = Finite self a || Finite self b
test/RecursiveTest.hs+12
@@ -106,3 +106,15 @@ instance Arbitrary DeepRecursive where
106
106
107prop_deepRecursiveTotal :: DeepRecursive -> Property
107prop_deepRecursiveTotal :: DeepRecursive -> Property
108prop_deepRecursiveTotal = total
108prop_deepRecursiveTotal = total
109+
110+data P p = NoP | P p
111+ deriving (Eq, Show, Generic)
112+
113+instance (NFData p) => NFData (P p)
114+
115+instance (Arg (P p) p, Arbitrary p) => Arbitrary (P p) where
116+ arbitrary = genericArbitrary
117+ shrink = genericShrink
118+
119+prop_Ptotal :: P (P Int) -> Property
120+prop_Ptotal = total