packages feed

psx-0.1.1.0: test/psx-test-no-psx.hsc

{-# LANGUAGE CApiFFI #-}

module Main (main) where

#include "hs-psx.h"

import Data.Int (Int32)
import Foreign.C.Error (throwErrnoIfMinus1)
import Foreign.Ptr (Ptr)
import Foreign.Marshal (alloca)
import Foreign.Storable (Storable(..))

import Test.Tasty (defaultMain, testGroup)
import Test.Tasty.HUnit ((@?=), assertBool, testCase)

main :: IO ()
main = defaultMain $ testGroup "Tests" [
      testCase "sigfillset sets HS_PSX_SIGNAL" sigfillsetNotWrapped
    , testCase "Haskell psx is not detected" psxNotDetected
    ]

data SigsetT

instance Storable SigsetT where
    sizeOf _ = #{size sigset_t}
    alignment _ = #{alignment sigset_t}
    peek _ = error "peek not implemented"
    poke _ _ = error "poke not implemented"

foreign import capi unsafe "signal.h sigfillset"
    sigfillset :: Ptr SigsetT -> IO #{type int}

foreign import capi unsafe "signal.h sigismember"
    sigismember :: Ptr SigsetT -> #{type int} -> IO #{type int}

sigfillsetNotWrapped :: IO ()
sigfillsetNotWrapped = alloca $ \set -> do
    0 <- throwErrnoIfMinus1 "sigfillset" $ sigfillset set
    isMember <- throwErrnoIfMinus1 "sigismember" $ sigismember set #{const HS_PSX_SIGNAL}
    isMember @?= 1


foreign import capi unsafe "detect-psx.h detect_psx"
    detectPsx :: IO #{type int}

psxNotDetected :: IO ()
psxNotDetected =
    assertBool "psx detected" . not . toBool =<< detectPsx
  where
    toBool n = n /= 0