gl-block-1.0: test/Spec/Packed.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE TypeFamilies #-}
module Spec.Packed where
import Graphics.Gl.Block (Block, Packed(..))
import Graphics.Gl.Block qualified as Block
import GHC.Generics (Generic)
import Foreign (Storable)
import Foreign qualified
import Data.Proxy (Proxy(..))
import Test.Tasty.HUnit
data SomeStruct = SomeStruct
{ wat :: Bool -- 4
, this :: Double -- 8
, that :: Float -- 4
, those :: (Float, Float) -- 4 + 4
}
deriving stock (Eq, Ord, Show, Generic)
deriving anyclass Block
deriving Storable via (Packed SomeStruct)
someStruct :: SomeStruct
someStruct = SomeStruct
{ wat = True
, this = 2 * pi
, that = pi
, those = (1/60, -1e6)
}
unit_packedSize :: (Block.PackedSize SomeStruct ~ 24) => Assertion
unit_packedSize = Block.sizeOfPacked (Proxy :: Proxy SomeStruct) @?= 24
unit_peekPoked :: Assertion
unit_peekPoked = do
tripped <- Foreign.with someStruct Foreign.peek
tripped @?= someStruct