{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UnliftedNewtypes #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE UnboxedSums #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-unused-top-binds #-}
module Main where
import Language.Haskell.TH.DeepStrict.Golden
import Test.Tasty
import Data.Proxy
import Data.HashMap.Strict (HashMap)
import Data.Tree (Tree)
import GHC.Exts
data StrictList a = SCons !a !(StrictList a) | SNill
data Tricky = Tricky !Int (HashMap Int Int)
newtype Identity# :: forall (r :: RuntimeRep). TYPE r -> TYPE r where
MkIdentity# :: forall (r :: RuntimeRep) (a :: TYPE r). a -> Identity# a
data family Strict x
data instance Strict (a, b) = StrictPair !a !b
data instance Strict (Maybe a) = StrictJust !a | StrictNothing
type family Strict' x
type instance Strict' [x] = StrictList x
data EmbeddedDataFam = EmbeddedDataFam !Int !(Strict (Char, Int))
data EmbeddedDataFamFail = EmbeddedDataFamFail !Int !(Strict (Char, Maybe Int))
$(pure [])
main :: IO ()
main = defaultMain spec
spec :: TestTree
spec = testGroup "golden tests"
[ testGroup "simple types"
[ $(testType =<< [t|Bool|])
, $(testType =<< [t|Maybe Bool|])
, $(testType =<< [t|Int|])
, $(testType =<< [t|Integer|])
, $(testType =<< [t|Rational|])
, $(testType =<< [t|[Bool]|])
, $(testType =<< [t|(Bool, Bool)|])
, $(testType =<< [t|()|])
, $(testType =<< [t|Proxy Bool|])
, $(testType =<< [t|StrictList ()|])
, $(testType =<< [t|Tree Bool|])
, $(testType =<< [t| HashMap () ()|])
]
, testGroup "unlifted"
[ $(testType =<< [t|Int#|])
, $(testType =<< [t|ByteArray#|])
, $(testType =<< [t|Identity# Int#|])
, $(testType =<< [t|Identity# (Maybe Int)|])
, $(testType =<< [t|(# Int#, Int# #)|])
, $(testType =<< [t| Identity# (# Int#, Int# #)|])
, $(testType =<< [t| (# Int# | Int# #)|])
, $(testType =<< [t| (# Int# | Maybe Int #)|])
]
, testGroup "regresion tests"
[ $(testType =<< [t|Tricky|]) ]
, testGroup "data families"
[ $(testType =<< [t|Strict (Int, Int)|])
, $(testType =<< [t|Strict (Maybe Char)|])
, $(testType =<< [t|EmbeddedDataFam|])
, $(testType =<< [t|EmbeddedDataFamFail|])
, $(testType =<< [t|Strict' [Int]|])
]
]