massiv-test-0.1.6: tests/Test/Massiv/Array/Manifest/PrimitiveSpec.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Test.Massiv.Array.Manifest.PrimitiveSpec (spec) where
import Data.Massiv.Array as A
import Data.Massiv.Array.Unsafe
import Test.Massiv.Core
import Data.Word
import Data.Primitive.ByteArray
prop_ToFromByteArray ::
forall ix. (Ragged L ix Word16)
=> Array P ix Word16
-> Property
prop_ToFromByteArray arr =
expectProp $ do
let sz = size arr
ba = unwrapByteArray arr
resizeM sz (fromByteArray Seq (toByteArray arr)) `shouldReturn` arr
fromByteArrayM Seq sz (toByteArray arr) `shouldReturn` arr
fromByteArrayOffsetM Seq sz (unwrapByteArrayOffset arr) ba `shouldReturn` arr
marr <- unsafeThaw arr
(reallocated, mba) <- toMutableByteArray marr
-- check that no reallocation happens when there was no slicing
reallocated `shouldBe` (2 * totalElem sz == sizeofByteArray ba)
marr' <- fromMutableByteArrayM sz mba
unsafeFreeze Seq marr' `shouldReturn` arr
let mba' = unwrapMutableByteArrayOffset marr
marr'' <- fromMutableByteArrayOffsetM sz mba' (unwrapMutableByteArray marr)
unsafeFreeze Seq marr'' `shouldReturn` arr
prop_ToFromPrimitiveVector ::
forall ix. (Ragged L ix Word)
=> Array P ix Word
-> Property
prop_ToFromPrimitiveVector arr =
expectProp $ do
fromPrimitiveVector (toPrimitiveVector arr) `shouldBe` flatten arr
marr <- unsafeThaw arr
arr' <- unsafeFreeze Seq $ fromPrimitiveMVector $ toPrimitiveMVector marr
arr' `shouldBe` flatten arr
spec :: Spec
spec =
describe "Primitive" $ do
describe "ToFromByteArray" $ do
prop "ToFromByteArray" $ prop_ToFromByteArray @Ix1
prop "ToFromByteArray" $ prop_ToFromByteArray @Ix2
prop "ToFromByteArray" $ prop_ToFromByteArray @Ix3
describe "ToFromPrimitiveVector" $ do
prop "ToFromPrimitiveVector" $ prop_ToFromPrimitiveVector @Ix1
prop "ToFromPrimitiveVector" $ prop_ToFromPrimitiveVector @Ix2
prop "ToFromPrimitiveVector" $ prop_ToFromPrimitiveVector @Ix3