Z-Data-0.1.0.0: test/Z/Data/Array/UnalignedAccessSpec.hs
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Z.Data.Array.UnalignedAccessSpec where
import qualified Data.List as L
import Data.Int
import GHC.Float
import Data.Word
import Z.Data.Array.UnalignedAccess
import Control.Monad.Primitive
import Data.Primitive.ByteArray
import Test.QuickCheck
import Test.QuickCheck.Function
import Test.QuickCheck.Property
import Test.Hspec
import Test.Hspec.QuickCheck
spec :: Spec
spec = describe "unaligned acess" . modifyMaxSuccess (*10) . modifyMaxSize (*10) $ do
prop "roundtrip Word8" $ \ (w::Word8) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Word16" $ \ (w::Word16) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Word32" $ \ (w::Word32) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Word64" $ \ (w::Word64) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Word" $ \ (w::Word) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Word16" $ \ (w::Word16) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Word32" $ \ (w::Word32) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Word64" $ \ (w::Word64) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Word" $ \ (w::Word) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Word16" $ \ (w::Word16) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Word32" $ \ (w::Word32) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Word64" $ \ (w::Word64) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Word" $ \ (w::Word) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
--------------------------------------------------------------------------------
prop "roundtrip Int16" $ \ (w::Int16) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Int16" $ \ (w::Int16) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Int16" $ \ (w::Int16) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Int32" $ \ (w::Int32) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Int32" $ \ (w::Int32) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Int32" $ \ (w::Int32) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Int64" $ \ (w::Int64) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Int64" $ \ (w::Int64) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Int64" $ \ (w::Int64) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Int" $ \ (w::Int) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Int" $ \ (w::Int) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Int" $ \ (w::Int) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Float" $ \ (w::Float) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Float" $ \ (w::Float) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Float" $ \ (w::Float) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Double" $ \ (w::Double) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Double" $ \ (w::Double) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Double" $ \ (w::Double) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip Char" $ \ (w::Char) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# w)
w' <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let w'' = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip LE Char" $ \ (w::Char) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (LE w))
(LE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (LE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')
prop "roundtrip BE Char" $ \ (w::Char) -> ioProperty $ do
mba@(MutableByteArray mba#) <- newByteArray 128
primitive_ (writeWord8ArrayAs mba# 7# (BE w))
(BE w') <- primitive (readWord8ArrayAs mba# 7#)
(ByteArray ba#) <- unsafeFreezeByteArray mba
let (BE w'') = indexWord8ArrayAs ba# 7#
return $ (w === w') .&&. (w === w'')