packages feed

massiv-0.3.0.0: tests/Data/Massiv/Array/ManifestSpec.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeApplications #-}
module Data.Massiv.Array.ManifestSpec (spec) where

import Data.ByteString as S
import Data.ByteString.Builder as S
import Data.ByteString.Lazy as SL
import Data.Massiv.CoreArbitrary as A
import Data.Word (Word8)


-- ByteString
prop_toFromByteString :: Manifest r Ix1 Word8 => Array r Ix1 Word8 -> Property
prop_toFromByteString arr = toManifest arr === fromByteString (getComp arr) (toByteString arr)

prop_castToFromByteString :: Array S Ix1 Word8 -> Property
prop_castToFromByteString arr = arr === castFromByteString (getComp arr) (castToByteString arr)


prop_fromToByteString :: Comp -> [Word8] -> Property
prop_fromToByteString comp ls = bs === toByteString (fromByteString comp bs)
  where bs = S.pack ls

prop_toBuilder :: Array P Ix1 Word8 -> Property
prop_toBuilder arr = bs === SL.toStrict (S.toLazyByteString (toBuilder S.word8 arr))
  where bs = toByteString arr

conversionSpec :: Spec
conversionSpec =
  describe "ByteString" $ do
    it "castTo/TromByteString" $ property prop_castToFromByteString
    it "to/from ByteString P" $ property (prop_toFromByteString @P)
    it "to/from ByteString S" $ property (prop_toFromByteString @S)
    it "from/to ByteString" $ property prop_fromToByteString
    it "toBuilder" $ property prop_toBuilder


spec :: Spec
spec = describe "Conversion" conversionSpec