content: {-# LANGUAGE CPP #-}
  {-# LANGUAGE DeriveAnyClass #-}
  
  {-# OPTIONS_GHC -fplugin=GHC.TypeLits.KnownNat.Solver #-}
  
  module Clash.Tests.BitPack where
  
  import Test.Tasty
  import Test.Tasty.HUnit
  
  import Clash.Class.BitPack
  import Clash.Sized.Vector
  import Clash.Sized.Signed
  
  import GHC.Generics (Generic)
  
  data Unit    = Unit                        deriving (Generic, BitPack, Eq, Show)
  data Wrapper = Wrapper Int                 deriving (Generic, BitPack, Eq, Show)
  data Sum     = SumTypeA | SumTypeB         deriving (Generic, BitPack, Eq, Show)
  data BigSum  = BS1 | BS2 | BS3 | BS4 | BS5 deriving (Generic, BitPack, Eq, Show)
  data Product = Product Int Int             deriving (Generic, BitPack, Eq, Show)
  data SP      = S Int Int | P Int           deriving (Generic, BitPack, Eq, Show)
  data Rec1    = Rec1 { a :: Int }           deriving (Generic, BitPack, Eq, Show)
  data Rec2    = Rec2 { b :: Int, c :: Int } deriving (Generic, BitPack, Eq, Show)
  
  rtt :: (Eq a, Show a, BitPack a) => a -> Assertion
  rtt u = unpack (pack u) @?= u
  
  tests :: TestTree
  tests =
    testGroup
      "BitPack"
      [ testGroup
          "Generic"
          [ testCase "Unit" (rtt Unit)
          , testCase "Wrapper" (rtt (Wrapper 3))
          , testCase "SumTypeA" (rtt SumTypeA)
          , testCase "SumTypeB" (rtt SumTypeB)
          , testCase "BigSum1" (rtt BS1)
          , testCase "BigSum2" (rtt BS2)
          , testCase "BigSum3" (rtt BS3)
          , testCase "BigSum4" (rtt BS4)
          , testCase "BigSum5" (rtt BS5)
          , testCase "Product" (rtt (Product 3 5))
          , testCase "SP1" (rtt (S 3 5))
          , testCase "SP2" (rtt (P 10))
          , testCase "Rec1" (rtt (Rec1 10))
          , testCase "Rec2" (rtt (Rec2 10 30))
          , testCase "Vec" (rtt ((1 :: Signed 6) :> 2 :> (-5) :> 4 :> Nil))
          ]
      ]
  
  