massiv-0.2.6.0: tests/Data/Massiv/Array/MutableSpec.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Data.Massiv.Array.MutableSpec (spec) where
import Control.Monad.ST
import Data.Functor.Identity
import Data.Massiv.CoreArbitrary as A
import Data.Proxy
import Test.Hspec
import Test.QuickCheck
import Test.QuickCheck.Monadic
import Test.QuickCheck.Function
prop_MapMapM :: (Show (Array r ix Int), Eq (Array r ix Int), Mutable r ix Int) =>
r -> Proxy ix -> Fun Int Int -> ArrTiny D ix Int -> Property
prop_MapMapM r _ f (ArrTiny arr) =
computeAs r (A.map (apply f) arr) === runIdentity (A.mapMR r (return . apply f) arr)
prop_iMapiMapM :: (Show (Array r ix Int), Eq (Array r ix Int), Mutable r ix Int) =>
r -> Proxy ix -> Fun (ix, Int) Int -> ArrTiny D ix Int -> Property
prop_iMapiMapM r _ f (ArrTiny arr) =
computeAs r (A.imap (curry (apply f)) arr) ===
runIdentity (A.imapMR r (\ix e -> return $ apply f (ix, e)) arr)
prop_generateMakeST :: (Show (Array r ix Int), Eq (Array r ix Int), Mutable r ix Int) =>
r -> Proxy ix -> Arr r ix Int -> Property
prop_generateMakeST _ _ (Arr arr) =
arr === runST (generateArray (getComp arr) (size arr) (return . evaluateAt arr))
prop_generateMakeIO :: (Show (Array r ix Int), Eq (Array r ix Int), Mutable r ix Int) =>
r -> Proxy ix -> Arr r ix Int -> Property
prop_generateMakeIO _ _ (Arr arr) = monadicIO $ do
arr' <- run $ generateArray (getComp arr) (size arr) (return . evaluateAt arr)
return (arr === arr')
mutableSpec ::
( Show r
, Show (Array r Ix3 Int)
, Show (Array r Ix1 Int)
, Show (Array r Ix2 Int)
, Eq (Array r Ix3 Int)
, Eq (Array r Ix1 Int)
, Eq (Array r Ix2 Int)
, Mutable r Ix3 Int
, Mutable r Ix1 Int
, Mutable r Ix2 Int
)
=> r
-> SpecWith ()
mutableSpec r = do
describe (show r) $ do
describe "map == mapM" $ do
it "Ix1" $ property $ prop_MapMapM r (Proxy :: Proxy Ix1)
it "Ix2" $ property $ prop_MapMapM r (Proxy :: Proxy Ix2)
it "Ix3" $ property $ prop_MapMapM r (Proxy :: Proxy Ix3)
describe "imap == imapM" $ do
it "Ix1" $ property $ prop_iMapiMapM r (Proxy :: Proxy Ix1)
it "Ix2T" $ property $ prop_iMapiMapM r (Proxy :: Proxy Ix2)
it "Ix3T" $ property $ prop_iMapiMapM r (Proxy :: Proxy Ix3)
describe "makeArray == generateArrayST" $ do
it "Ix1" $ property $ prop_generateMakeST r (Proxy :: Proxy Ix1)
it "Ix2" $ property $ prop_generateMakeST r (Proxy :: Proxy Ix2)
it "Ix3" $ property $ prop_generateMakeST r (Proxy :: Proxy Ix3)
describe "makeArray == generateArrayIO" $ do
it "Ix1" $ property $ prop_generateMakeIO r (Proxy :: Proxy Ix1)
it "Ix2" $ property $ prop_generateMakeIO r (Proxy :: Proxy Ix2)
it "Ix3" $ property $ prop_generateMakeIO r (Proxy :: Proxy Ix3)
generateSpec :: Spec
generateSpec = do
mutableSpec P
mutableSpec S
mutableSpec U
mutableSpec B
mutableSpec N
spec :: Spec
spec = describe "GenerateM" generateSpec