packages feed

gl-block-1.1: 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 Data.Proxy (Proxy (..))
import Foreign (Storable)
import Foreign qualified
import GHC.Generics (Generic)

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