packages feed

haskell-mpi-1.4.0: test/OtherTests.hs

module OtherTests (otherTests) where

import TestHelpers

import Foreign.Storable (peek, poke)
import Foreign.Marshal (alloca)
import Foreign.C.Types (CInt)
import Control.Parallel.MPI.Base
import Data.Maybe (isJust)

otherTests :: ThreadSupport -> Rank -> [(String,TestRunnerTest)]
otherTests threadSupport _ =
   [ testCase "Peeking/poking Status" statusPeekPoke
   , testCase "Querying MPI implementation" getImplementationTest
   , testCase "Universe size" universeSizeTest
   , testCase "wtime/wtick" wtimeWtickTest
   , testCase "commGetParent is null" commGetParentNullTest
   , testCase "commRank, commSize, getProcessor name, version" rankSizeNameVersionTest
   , testCase "initialized" initializedTest
   , testCase "finalized" finalizedTest
   , testCase "tag value upper bound" tagUpperBoundTest
   , testCase "queryThread" $ queryThreadTest threadSupport
   , testCase "test requestNull" $ testRequestNull
   , testCase "Info objects" $ testInfoObjects
   , testCase "anySource/anySize values" anySourceTagTest
   , testCase "openClosePort" openClosePortTest
   ]

queryThreadTest :: ThreadSupport -> IO ()
queryThreadTest threadSupport = do
   newThreadSupport <- queryThread
   threadSupport == newThreadSupport @?
      ("Result from queryThread: " ++ show newThreadSupport ++
       ", differs from result from initThread: " ++ show threadSupport)

statusPeekPoke :: IO ()
statusPeekPoke = do
  alloca $ \statusPtr -> do
    let s0 = Status (fromIntegral (maxBound::CInt)) 2 3
    poke statusPtr s0
    s1 <- peek statusPtr
    s0 == s1 @? ("Poked " ++ show s0 ++ ", but peeked " ++ show s1)

getImplementationTest :: IO ()
getImplementationTest = do
  putStrLn $ "Using " ++ show (getImplementation)

wtimeWtickTest :: IO ()
wtimeWtickTest = do
  t <- wtime
  tick <- wtick
  tick < t @? "Timer resolution is greater than current time"
  putStrLn $ "Current time is " ++ show t ++ ", timer resolution is " ++ show tick
  putStrLn $ "Wtime is global: " ++ show wtimeIsGlobal

universeSizeTest :: IO ()
universeSizeTest = do
  us <- universeSize commWorld
  putStrLn $ "Universe size is " ++ show us

rankSizeNameVersionTest :: IO ()
rankSizeNameVersionTest = do
  r <- commRank commWorld
  s <- commSize commWorld
  p <- getProcessorName
  v <- getVersion
  putStrLn $ "I am process " ++ show r ++ " out of " ++ show s ++ ", running on " ++ p ++ ", MPI version " ++ show v

initializedTest :: IO ()
initializedTest = do
   isInit <- initialized
   isInit == True @? "initialized return False, but was expected to return True"

finalizedTest :: IO ()
finalizedTest = do
   isFinal <- finalized
   isFinal == False @? "finalized return True, but was expected to return False"

tagUpperBoundTest :: IO ()
tagUpperBoundTest = do
  putStrLn $ "Maximum tag value is " ++ show tagUpperBound
  tagUpperBound /= (-1) @? "tagUpperBound has no value"

testRequestNull :: IO ()
testRequestNull = do
  status <- test requestNull
  isJust status @? "test requestNull does not return status"
  let (Just s) = status
  status_source s == anySource @? "status returned from (test requestNull) does not have source set to anySource"
  status_tag s == anyTag @? "status returned from (test requestNull) does not have tag set to anyTag"
  status_error s == 0 @? "status returned from (test requestNull) does not have error set to success"

commGetParentNullTest :: IO ()
commGetParentNullTest = do
  comm <- commGetParent
  comm == commNull @? "commGetParent did not return commNull, yet this is not dynamically-spawned process"

testInfoObjects :: IO ()
testInfoObjects = do
  i <- infoCreate
  v <- infoGet i "foo"
  v == Nothing @? "Key 'foo' found in freshly-created Info object"
  infoSet i "foo" "bar"
  v' <- infoGet i "foo"
  v' == (Just "bar") @? ("Key 'foo' was not set to 'bar', check retrieved " ++ show v')
  infoDelete i "foo"
  v'' <- infoGet i "foo"
  v'' == Nothing @? "Key 'foo' was not deleted"

anySourceTagTest :: IO ()
anySourceTagTest = do
  if (anySource) == (toEnum (-1)) then return ()
    else putStrLn ("anySource is not -1, but rather " ++ show anySource)
  if (anyTag) == (toEnum (-1)) then return ()
    else putStrLn ("anyTag is not -1, but rather " ++ show anyTag)

openClosePortTest :: IO ()
openClosePortTest = do
  port <- openPort infoNull
  closePort port