text-show-0.6: tests/Instances/Derived.hs
{-# LANGUAGE CPP, FlexibleContexts, FlexibleInstances, GADTs,
GeneralizedNewtypeDeriving, StandaloneDeriving,
TemplateHaskell, TypeOperators, UndecidableInstances #-}
#include "overlap.h"
__LANGUAGE_OVERLAPPING_INSTANCES__
#if __GLASGOW_HASKELL__ >= 706
-- GHC 7.4 also supports PolyKinds, but Template Haskell doesn't seem to play
-- -- nicely with it for some reason.
{-# LANGUAGE PolyKinds #-}
#endif
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-|
Module: Instances.Derived
Copyright: (C) 2014-2015 Ryan Scott
License: BSD-style (see the file LICENSE)
Maintainer: Ryan Scott
Stability: Experimental
Portability: GHC
Defines data types with derived 'Show' instances (using "Text.Show.Text.TH")
for testing purposes, including 'Arbitrary' instances.
-}
module Instances.Derived () where
#if !(MIN_VERSION_base(4,8,0))
import Control.Applicative ((<*>), pure)
#endif
import Data.Functor ((<$>))
import Derived
import Prelude hiding (Show)
import Test.Tasty.QuickCheck (Arbitrary(..), Gen, oneof)
import Text.Show.Text (Show(showbPrec))
import Text.Show.Text.TH (deriveShow, mkShowbPrec)
$(deriveShow ''Nullary)
instance Arbitrary Nullary where
arbitrary = pure Nullary
$(deriveShow ''PhantomNullary)
instance Arbitrary (PhantomNullary a) where
arbitrary = pure PhantomNullary
$(deriveShow ''MonomorphicUnary)
deriving instance Arbitrary MonomorphicUnary
$(deriveShow ''PolymorphicUnary)
deriving instance Arbitrary a => Arbitrary (PolymorphicUnary a b)
$(deriveShow ''MonomorphicProduct)
instance Arbitrary MonomorphicProduct where
arbitrary = MonomorphicProduct <$> arbitrary <*> arbitrary <*> arbitrary
$(deriveShow ''PolymorphicProduct)
instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (PolymorphicProduct a b c d) where
arbitrary = PolymorphicProduct <$> arbitrary <*> arbitrary <*> arbitrary
$(deriveShow ''MonomorphicRecord)
instance Arbitrary MonomorphicRecord where
arbitrary = MonomorphicRecord <$> arbitrary <*> arbitrary <*> arbitrary
$(deriveShow ''PolymorphicRecord)
instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (PolymorphicRecord a b c d) where
arbitrary = PolymorphicRecord <$> arbitrary <*> arbitrary <*> arbitrary
$(deriveShow ''MonomorphicInfix)
instance Arbitrary MonomorphicInfix where
arbitrary = (:/:) <$> arbitrary <*> arbitrary
$(deriveShow ''PolymorphicInfix)
instance (Arbitrary a, Arbitrary b) => Arbitrary (PolymorphicInfix a b c) where
arbitrary = PolyInf <$> arbitrary <*> arbitrary
$(deriveShow ''MonomorphicForall)
instance Arbitrary MonomorphicForall where
arbitrary = MonomorphicForall <$> (arbitrary :: Gen Int)
$(deriveShow ''PolymorphicForall)
instance Arbitrary a => Arbitrary (PolymorphicForall a b) where
arbitrary = PolymorphicForall <$> arbitrary <*> (arbitrary :: Gen Int)
$(deriveShow ''AllAtOnce)
instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (AllAtOnce a b c d) where
arbitrary = oneof [ pure AAONullary
, AAOUnary <$> arbitrary
, AAOProduct <$> arbitrary <*> arbitrary <*> arbitrary
, AAORecord <$> arbitrary <*> arbitrary <*> arbitrary
, (:/\:) <$> arbitrary <*> arbitrary
, AAOForall <$> arbitrary <*> arbitrary <*> (arbitrary :: Gen Int)
]
$(deriveShow ''GADT)
instance __OVERLAPPING__ Arbitrary (GADT Char b c) where
arbitrary = pure GADTCon1
instance __OVERLAPPING__ Arbitrary (GADT Double Double c) where
arbitrary = GADTCon2 <$> arbitrary
instance __OVERLAPPING__ Arbitrary (GADT Int String c) where
arbitrary = GADTCon3 <$> arbitrary
instance __OVERLAPPABLE__ Arbitrary a => Arbitrary (GADT a b c) where
arbitrary = GADTCon4 <$> arbitrary
instance __OVERLAPPING__ Arbitrary b => Arbitrary (GADT b b c) where
arbitrary = GADTCon5 <$> arbitrary
$(deriveShow ''LeftAssocTree)
instance Arbitrary a => Arbitrary (LeftAssocTree a) where
arbitrary = oneof [ LeftAssocLeaf <$> arbitrary
, (:<:) <$> (LeftAssocLeaf <$> arbitrary)
<*> (LeftAssocLeaf <$> arbitrary)
]
$(deriveShow ''RightAssocTree)
instance Arbitrary a => Arbitrary (RightAssocTree a) where
arbitrary = oneof [ RightAssocLeaf <$> arbitrary
, (:>:) <$> (RightAssocLeaf <$> arbitrary)
<*> (RightAssocLeaf <$> arbitrary)
]
$(deriveShow ''(:?:))
instance (Arbitrary a, Arbitrary b) => Arbitrary (a :?: b) where
arbitrary = (:?:) <$> arbitrary <*> arbitrary
instance Show (f a) => Show (HigherKindedTypeParams f a) where
showbPrec = $(mkShowbPrec ''HigherKindedTypeParams)
deriving instance Arbitrary (f a) => Arbitrary (HigherKindedTypeParams f a)
instance (Read a, Show a) => Show (Restriction a) where
showbPrec = $(mkShowbPrec ''Restriction)
deriving instance Arbitrary a => Arbitrary (Restriction a)
instance (Read a, Show a) => Show (RestrictedContext a) where
showbPrec = $(mkShowbPrec ''RestrictedContext)
deriving instance Arbitrary a => Arbitrary (RestrictedContext a)
instance Show (f (Fix f)) => Show (Fix f) where
showbPrec = $(mkShowbPrec ''Fix)
deriving instance Arbitrary (f (Fix f)) => Arbitrary (Fix f)
#if MIN_VERSION_template_haskell(2,7,0)
$(deriveShow ''AllShow)
instance Arbitrary (AllShow () () c d) where
arbitrary = pure ASNullary
deriving instance Arbitrary (AllShow Int b c d)
instance Arbitrary (AllShow Bool Bool c d) where
arbitrary = ASProduct <$> arbitrary <*> arbitrary
instance Arbitrary c => Arbitrary (AllShow Char Double c d) where
arbitrary = ASRecord <$> arbitrary <*> arbitrary <*> arbitrary
instance Arbitrary (AllShow Float Ordering c d) where
arbitrary = ASInfix <$> arbitrary <*> arbitrary
$(deriveShow 'NASShow1)
instance Arbitrary b => Arbitrary (NotAllShow Int b Int d) where
arbitrary = oneof [NASShow1 <$> arbitrary <*> arbitrary, NASShow2 <$> arbitrary]
$(deriveShow ''OneDataInstance)
instance (Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (OneDataInstance a b c d) where
arbitrary = oneof [ pure ODINullary
, ODIUnary <$> arbitrary
, ODIProduct <$> arbitrary <*> arbitrary
, ODIRecord <$> arbitrary <*> arbitrary <*> arbitrary
, ODIInfix <$> arbitrary <*> arbitrary
]
$(deriveShow ''AssocData1)
deriving instance Arbitrary (AssocData1 ())
$(deriveShow 'AssocCon2)
deriving instance Arbitrary (AssocData2 () Int Int)
#if __GLASGOW_HASKELL__ >= 708 && __GLASGOW_HASKELL__ < 710
$(deriveShow 'NullaryCon)
deriving instance Arbitrary NullaryData
#endif
$(deriveShow 'GADTFamCon1)
instance __OVERLAPPING__ Arbitrary (GADTFam Char b c) where
arbitrary = pure GADTFamCon1
instance __OVERLAPPING__ Arbitrary (GADTFam Double Double c) where
arbitrary = GADTFamCon2 <$> arbitrary
instance __OVERLAPPING__ Arbitrary (GADTFam Int String c) where
arbitrary = GADTFamCon3 <$> arbitrary
instance __OVERLAPPABLE__ Arbitrary a => Arbitrary (GADTFam a b c) where
arbitrary = GADTFamCon4 <$> arbitrary
instance __OVERLAPPING__ Arbitrary b => Arbitrary (GADTFam b b c) where
arbitrary = GADTFamCon5 <$> arbitrary
#endif