1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
{-# LANGUAGE CPP #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
#if __GLASGOW_HASKELL__ >= 708
{-# LANGUAGE EmptyCase #-}
#endif
{-|
Module: ShowSpec
Copyright: (C) 2015-2017 Ryan Scott
License: BSD-style (see the file LICENSE)
Maintainer: Ryan Scott
Portability: Template Haskell
@hspec@ tests for derived 'Show', 'Show1', and 'Show2' instances.
-}
module ShowSpec where
import Data.Deriving
import GHC.Exts ( Char#, Double#, Float#, Int#, Word#
#if MIN_VERSION_base(4,13,0)
, Int8#, Int16#, Word8#, Word16#
#endif
#if MIN_VERSION_base(4,16,0)
, Int32#, Word32#
#endif
)
import Prelude ()
import Prelude.Compat
import Test.Hspec
import Types.ReadShow ()
-------------------------------------------------------------------------------
-- Plain data types
data TyCon# a b = TyCon# {
tcA :: a
, tcB :: b
, tcInt# :: Int#
, tcFloat# :: Float#
, tcDouble# :: Double#
, tcChar# :: Char#
, tcWord# :: Word#
#if MIN_VERSION_base(4,13,0)
, tcInt8# :: Int8#
, tcInt16# :: Int16#
, tcWord8# :: Word8#
, tcWord16# :: Word16#
#endif
#if MIN_VERSION_base(4,16,0)
, tcInt32# :: Int32#
, tcWord32# :: Word32#
#endif
}
data TyCon2 a b c d where
TyConClassConstraints :: (Ord m, Ord n, Ord o, Ord p)
=> m -> n -> o -> p
-> TyCon2 m n o p
TyConEqualityConstraints :: (e ~ g, f ~ h, e ~ f)
=> e -> f -> g -> h
-> TyCon2 e f g h
TyConTypeRefinement1,
TyConTypeRefinement2 :: Int -> z
-> TyCon2 Int Int z z
TyConForalls :: forall p q r s t u.
(Show p, Show q)
=> p -> q -> u -> t
-> TyCon2 r s t u
data Empty1 a b
data Empty2 a b
-- Data families
data family TyFamily# y z :: *
data instance TyFamily# a b = TyFamily# {
tfA :: a
, tfB :: b
, tfInt# :: Int#
, tfFloat# :: Float#
, tfDouble# :: Double#
, tfChar# :: Char#
, tfWord# :: Word#
#if MIN_VERSION_base(4,13,0)
, tfInt8# :: Int8#
, tfInt16# :: Int16#
, tfWord8# :: Word8#
, tfWord16# :: Word16#
#endif
#if MIN_VERSION_base(4,16,0)
, tfInt32# :: Int32#
, tfWord32# :: Word32#
#endif
}
data family TyFamily2 w x y z :: *
data instance TyFamily2 a b c d where
TyFamilyClassConstraints :: (Ord m, Ord n, Ord o, Ord p)
=> m -> n -> o -> p
-> TyFamily2 m n o p
TyFamilyEqualityConstraints :: (e ~ g, f ~ h, e ~ f)
=> e -> f -> g -> h
-> TyFamily2 e f g h
TyFamilyTypeRefinement1,
TyFamilyTypeRefinement2 :: Int -> z
-> TyFamily2 Int Int z z
TyFamilyForalls :: forall p q r s t u.
(Show p, Show q)
=> p -> q -> u -> t
-> TyFamily2 r s t u
-------------------------------------------------------------------------------
-- Plain data types
$(deriveShow ''TyCon#)
$(deriveShow ''TyCon2)
$(deriveShow ''Empty1)
$(deriveShow1 ''TyCon#)
$(deriveShow1 ''TyCon2)
$(deriveShow1 ''Empty1)
#if defined(NEW_FUNCTOR_CLASSES)
$(deriveShow2 ''TyCon#)
$(deriveShow2 ''TyCon2)
$(deriveShow2 ''Empty1)
#endif
-- Use EmptyCase here
$(deriveShowOptions defaultShowOptions{ showEmptyCaseBehavior = True } ''Empty2)
$(deriveShow1Options defaultShowOptions{ showEmptyCaseBehavior = True } ''Empty2)
#if defined(NEW_FUNCTOR_CLASSES)
$(deriveShow2Options defaultShowOptions{ showEmptyCaseBehavior = True } ''Empty2)
#endif
#if MIN_VERSION_template_haskell(2,7,0)
-- Data families
$(deriveShow 'TyFamily#)
$(deriveShow 'TyFamilyClassConstraints)
$(deriveShow1 'TyFamily#)
$(deriveShow1 'TyFamilyEqualityConstraints)
# if defined(NEW_FUNCTOR_CLASSES)
$(deriveShow2 'TyFamily#)
$(deriveShow2 'TyFamilyTypeRefinement1)
# endif
#endif
-------------------------------------------------------------------------------
main :: IO ()
main = hspec spec
spec :: Spec
spec = pure ()
|