massiv-test-1.1.0.0: tests/Test/Massiv/Core/SchedulerSpec.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
module Test.Massiv.Core.SchedulerSpec (spec) where
import Control.Exception.Base (ArithException (DivideByZero))
import Data.Massiv.Array as A
import Test.Massiv.Core
import Prelude as P
-- | Ensure proper exception handling.
prop_CatchDivideByZero :: ArrIx D Ix2 Int -> [Int] -> Property
prop_CatchDivideByZero (ArrIx arr ix) caps =
assertDeepException
(== DivideByZero)
( A.sum $
A.imap
( \ix' x ->
if ix == ix'
then x `div` 0
else x
)
(setComp (ParOn caps) arr)
)
-- | Ensure proper exception handling in nested parallel computation
prop_CatchNested :: ArrIx D Ix1 (ArrIx D Ix1 Int) -> [Int] -> Property
prop_CatchNested (ArrIx arr ix) caps =
assertDeepException
(== DivideByZero)
( computeAs U $
A.map A.sum $
A.imap
( \ix' (ArrIx iarr ixi) ->
if ix == ix'
then
A.imap
( \ixi' e ->
if ixi == ixi'
then e `div` 0
else e
)
iarr
else iarr
)
(setComp (ParOn caps) arr)
)
spec :: Spec
spec =
describe "Scheduler - Exceptions" $ do
it "CatchDivideByZero" $ property prop_CatchDivideByZero
it "CatchNested" $ property prop_CatchNested