packages feed

deepseq-th-0.1.0.4: test-whnf-is-nf.hs

{-# LANGUAGE TemplateHaskell, CPP #-}

module Main where

import Data.Int
import Data.Word
import System.Exit   (exitFailure)
import Test.WhnfIsNf

assertTypeWhnfIsNf :: String -> Maybe Bool -> IO ()
assertTypeWhnfIsNf msg (Just True) = do
    putStrLn $ "assertTypeWhnfIsNf     " ++ msg ++ "...PASS!"
assertTypeWhnfIsNf msg res = do
    putStrLn $ "assertTypeWhnfIsNf     " ++ msg ++ "...FAIL! (w/ " ++ show res ++ ")"
    exitFailure

assertTypeWhnfIsNotNf :: String -> Maybe Bool -> IO ()
assertTypeWhnfIsNotNf msg (Just True) = do
    putStrLn $ "assertTypeWhnfIsNotNf  " ++ msg ++ "...FAIL!"
    exitFailure
assertTypeWhnfIsNotNf msg res = do
    putStrLn $ "assertTypeWhnfIsNotNf  " ++ msg ++ "...PASS! (w/ " ++ show res ++ ")"

#define posAss(S,T) assertTypeWhnfIsNf S $(typeWhnfIsNfExp =<< [t| T |])
#define negAss(S,T) assertTypeWhnfIsNotNf S $(typeWhnfIsNfExp =<< [t| T |])


data Foo a = Foo1
           | Foo2 !Int !String
           | Foo3 (Foo a)
           | Foo4 { fX :: Int, fY :: Char }
           | Foo5 !Bar
           | Foo6 !(String->Int)
           | Foo a :--: !Bool

data Bar = Bar0 | Bar1 !Char | Bar2 !Int !Int | Bar3 !Bar | !Bar :---: !Bar

data Doo = Doo0 | Doo1 Bar

data Zoo = Zoo0 | Zoo1 !Bar

data Goo = Goo0 | Goo1 !Doo

data EH = EH {-# UNPACK #-} !W64 | EQ {-# NOUNPACK #-} !W64 !Bool

newtype W64 = EA Word64

main :: IO ()
main = do
    posAss("()",     ())
    posAss("Bool",   Bool)
    posAss("Char",   Char)
    posAss("Int",    Int)
    posAss("Int8",   Int8)
    posAss("Int16",  Int16)
    posAss("Int32",  Int32)
    posAss("Int64",  Int64)
    posAss("Word",   Word)
    posAss("Word8",  Word8)
    posAss("Word16", Word16)
    posAss("Word32", Word32)
    posAss("Word64", Word64)

    posAss("Int->Int",            Int->Int)
    posAss("String->(Char,Int)",  String->(Char,Int))

    negAss("Doo",       Doo)
    posAss("Zoo",       Zoo)
    negAss("Goo",       Goo)
    posAss("Bar",       Bar)
    negAss("Foo",       Foo)
    negAss("Foo Int",   Foo Int)

    negAss("String",         String)
    negAss("[Char]",         [Char])
    negAss("[Int]",          [Int])
    negAss("[()]",           [()])
    negAss("Maybe Bool",     Maybe Bool)
    posAss("EH",             EH)