packages feed

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