1
- {-# LANGUAGE CPP #-}
1
+ {-# LANGUAGE CPP #-}
2
+ {-# LANGUAGE FlexibleContexts #-}
3
+ {-# LANGUAGE GADTs #-}
4
+ {-# LANGUAGE TypeOperators #-}
2
5
{-# OPTIONS_GHC -fno-warn-orphans #-}
3
6
module Test.QuickCheck.Instances.Cabal () where
4
7
@@ -8,7 +11,10 @@ import Data.List (intercalate)
8
11
import Distribution.Utils.Generic (lowercase )
9
12
import Test.QuickCheck
10
13
14
+ import GHC.Generics
15
+
11
16
import Distribution.CabalSpecVersion
17
+ import Distribution.Compiler
12
18
import Distribution.ModuleName
13
19
import Distribution.Parsec.Newtypes
14
20
import Distribution.Simple.Flag (Flag (.. ))
@@ -311,6 +317,17 @@ instance Arbitrary LicenseExpression where
311
317
shrink (EOr a b) = a : b : map (uncurry EOr ) (shrink (a, b))
312
318
shrink _ = []
313
319
320
+ -------------------------------------------------------------------------------
321
+ -- Compiler
322
+ -------------------------------------------------------------------------------
323
+
324
+ instance Arbitrary CompilerFlavor where
325
+ arbitrary = elements knownCompilerFlavors
326
+
327
+ instance Arbitrary CompilerId where
328
+ arbitrary = genericArbitrary
329
+ shrink = genericShrink
330
+
314
331
-------------------------------------------------------------------------------
315
332
-- Helpers
316
333
-------------------------------------------------------------------------------
@@ -319,3 +336,38 @@ shortListOf1 :: Int -> Gen a -> Gen [a]
319
336
shortListOf1 bound gen = sized $ \ n -> do
320
337
k <- choose (1 , 1 `max` ((n `div` 2 ) `min` bound))
321
338
vectorOf k gen
339
+
340
+ -------------------------------------------------------------------------------
341
+ -- Generic Arbitrary
342
+ -------------------------------------------------------------------------------
343
+
344
+ -- Generic arbitary for non-recursive types
345
+ genericArbitrary :: (Generic a , GArbitrary (Rep a )) => Gen a
346
+ genericArbitrary = fmap to garbitrary
347
+
348
+ class GArbitrary f where
349
+ garbitrary :: Gen (f () )
350
+
351
+ class GArbitrarySum f where
352
+ garbitrarySum :: [Gen (f () )]
353
+
354
+ class GArbitraryProd f where
355
+ garbitraryProd :: Gen (f () )
356
+
357
+ instance (GArbitrarySum f , i ~ D ) => GArbitrary (M1 i c f ) where
358
+ garbitrary = fmap M1 (oneof garbitrarySum)
359
+
360
+ instance (GArbitraryProd f , i ~ C ) => GArbitrarySum (M1 i c f ) where
361
+ garbitrarySum = [fmap M1 garbitraryProd]
362
+
363
+ instance (GArbitrarySum f , GArbitrarySum g ) => GArbitrarySum (f :+: g ) where
364
+ garbitrarySum = map (fmap L1 ) garbitrarySum ++ map (fmap R1 ) garbitrarySum
365
+
366
+ instance (GArbitraryProd f , i ~ S ) => GArbitraryProd (M1 i c f ) where
367
+ garbitraryProd = fmap M1 garbitraryProd
368
+
369
+ instance (GArbitraryProd f , GArbitraryProd g ) => GArbitraryProd (f :*: g ) where
370
+ garbitraryProd = liftA2 (:*:) garbitraryProd garbitraryProd
371
+
372
+ instance (Arbitrary a ) => GArbitraryProd (K1 i a ) where
373
+ garbitraryProd = fmap K1 arbitrary
0 commit comments