git.iko.soy/typeable/generic-arbitrary
on warnings help sign in
138 lines 3.5 kB history raw
1{-# LANGUAGE DerivingStrategies #-}
2{-# LANGUAGE DerivingVia #-}
3{-# LANGUAGE DeriveAnyClass #-}
4{-# OPTIONS_GHC -fconstraint-solver-iterations=5 #-} -- GHC-9.2.4
6-- | Testing that our Arbitrary instances do not get stuck and respect the
7-- `size` parameter while generating.
9module RecursiveTest where
11import Control.DeepSeq (NFData)
12import GHC.Generics (Generic)
13import Test.QuickCheck
14import Test.QuickCheck.Arbitrary.Generic
16data Unit = Unit
17 deriving (Eq, Show, Generic)
18 deriving anyclass NFData
19#if MIN_VERSION_QuickCheck(2, 14, 0)
20 deriving Arbitrary via (GenericArbitrary Unit)
21#else
22instance Arbitrary Unit where
23 arbitrary = genericArbitrary
24 shrink = genericShrink
25#endif
27prop_unitTotal :: Unit -> Property
28prop_unitTotal = total
30data Single = Single Int
31 deriving (Eq, Show, Generic)
32 deriving anyclass NFData
33#if MIN_VERSION_QuickCheck(2, 14, 0)
34 deriving Arbitrary via (GenericArbitrary Single)
35#else
36instance Arbitrary Single where
37 arbitrary = genericArbitrary
38 shrink = genericShrink
39#endif
41prop_singleTotal :: Single -> Property
42prop_singleTotal = total
44data Multiple = M1 | M2 | M3 Int
45 deriving (Eq, Show, Generic)
46 deriving anyclass NFData
47#if MIN_VERSION_QuickCheck(2, 14, 0)
48 deriving Arbitrary via (GenericArbitrary Multiple)
49#else
50instance Arbitrary Multiple where
51 arbitrary = genericArbitrary
52 shrink = genericShrink
53#endif
55prop_multipleTotal :: Multiple -> Property
56prop_multipleTotal = total
58data Rec = Rec
59 { unit :: Unit
60 , single :: Single
61 , multiple :: Multiple
62 } deriving (Eq, Show, Generic)
63 deriving anyclass NFData
64#if MIN_VERSION_QuickCheck(2, 14, 0)
65 deriving Arbitrary via (GenericArbitrary Rec)
66#else
67instance Arbitrary Rec where
68 arbitrary = genericArbitrary
69 shrink = genericShrink
70#endif
72prop_recTotal :: Rec -> Property
73prop_recTotal = total
75data Expr
76 = Lit Int
77 | Add Expr Expr
78 | Mul Expr Expr
79 deriving (Eq, Show, Generic)
80 deriving anyclass NFData
81#if MIN_VERSION_QuickCheck(2, 14, 0)
82 deriving Arbitrary via (GenericArbitrary Expr)
83#else
84instance Arbitrary Expr where
85 arbitrary = genericArbitrary
86 shrink = genericShrink
87#endif
89prop_exprTotal :: Expr -> Property
90prop_exprTotal = total
92data Recursive
93 = R1 Recursive
94 | R2 Recursive Int
95 | N Int
96 | R3 Recursive
97 | R4 Recursive
98 | R5 Recursive String
99 deriving (Eq, Show, Generic)
100 deriving anyclass NFData
101#if MIN_VERSION_QuickCheck(2, 14, 0)
102 deriving Arbitrary via (GenericArbitrary Recursive)
103#else
104instance Arbitrary Recursive where
105 arbitrary = genericArbitrary
106 shrink = genericShrink
107#endif
109prop_recursiveTotal :: Recursive -> Property
110prop_recursiveTotal = total
112data DeepRecursive
113 = Deep DeepRecursive DeepRecursive DeepRecursive DeepRecursive DeepRecursive
114 | Short
115 deriving (Eq, Show, Generic)
116 deriving anyclass NFData
117#if MIN_VERSION_QuickCheck(2, 14, 0)
118 deriving Arbitrary via (GenericArbitrary DeepRecursive)
119#else
120instance Arbitrary DeepRecursive where
121 arbitrary = genericArbitrary
122 shrink = genericShrink
123#endif
125prop_deepRecursiveTotal :: DeepRecursive -> Property
126prop_deepRecursiveTotal = total
128data P p = NoP | P p
129 deriving (Eq, Show, Generic)
130 deriving anyclass NFData
132-- Note that deriving via doesn't work for case with arguments
133instance (Arg (P p) p, Arbitrary p) => Arbitrary (P p) where
134 arbitrary = genericArbitrary
135 shrink = genericShrink
137prop_Ptotal :: P (P Int) -> Property
138prop_Ptotal = total