packages feed

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