{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Cardano.Ledger.BlockHeader where

import Cardano.Ledger.BaseTypes (Nonce, ProtVer, SlotNo)
import Cardano.Ledger.Block (Block (..), EraBlockHeader (..))
import Cardano.Ledger.Core (
  Era,
  EraIndependentBlockBody,
  HASH,
  Hash,
  KeyHash,
  KeyRole (BlockIssuer),
 )
import Control.DeepSeq (NFData)
import Data.Word (Word32)
import GHC.Generics (Generic)
import Lens.Micro

data TestBlockHeader
  = TestBlockHeader
  { TestBlockHeader -> KeyHash BlockIssuer
tbhIssuer :: KeyHash BlockIssuer
  , TestBlockHeader -> Word32
tbhBSize :: Word32
  , TestBlockHeader -> Int
tbhHSize :: Int
  , TestBlockHeader -> Hash HASH EraIndependentBlockBody
tbhBHash :: Hash HASH EraIndependentBlockBody
  , TestBlockHeader -> SlotNo
tbhSlot :: SlotNo
  , TestBlockHeader -> Maybe Nonce
tbhPrevNonce :: Maybe Nonce
  , TestBlockHeader -> ProtVer
tbhProtVer :: ProtVer
  }
  deriving ((forall x. TestBlockHeader -> Rep TestBlockHeader x)
-> (forall x. Rep TestBlockHeader x -> TestBlockHeader)
-> Generic TestBlockHeader
forall x. Rep TestBlockHeader x -> TestBlockHeader
forall x. TestBlockHeader -> Rep TestBlockHeader x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TestBlockHeader -> Rep TestBlockHeader x
from :: forall x. TestBlockHeader -> Rep TestBlockHeader x
$cto :: forall x. Rep TestBlockHeader x -> TestBlockHeader
to :: forall x. Rep TestBlockHeader x -> TestBlockHeader
Generic)

instance NFData TestBlockHeader

instance Era era => EraBlockHeader TestBlockHeader era where
  blockIssuerBlockHeaderG :: SimpleGetter (Block TestBlockHeader era) (KeyHash BlockIssuer)
blockIssuerBlockHeaderG = (Block TestBlockHeader era -> KeyHash BlockIssuer)
-> SimpleGetter (Block TestBlockHeader era) (KeyHash BlockIssuer)
forall s a. (s -> a) -> SimpleGetter s a
to ((Block TestBlockHeader era -> KeyHash BlockIssuer)
 -> SimpleGetter (Block TestBlockHeader era) (KeyHash BlockIssuer))
-> (Block TestBlockHeader era -> KeyHash BlockIssuer)
-> SimpleGetter (Block TestBlockHeader era) (KeyHash BlockIssuer)
forall a b. (a -> b) -> a -> b
$ TestBlockHeader -> KeyHash BlockIssuer
tbhIssuer (TestBlockHeader -> KeyHash BlockIssuer)
-> (Block TestBlockHeader era -> TestBlockHeader)
-> Block TestBlockHeader era
-> KeyHash BlockIssuer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Block TestBlockHeader era -> TestBlockHeader
forall h era. Block h era -> h
blockHeader
  blockHeaderSizeBlockHeaderG :: SimpleGetter (Block TestBlockHeader era) Int
blockHeaderSizeBlockHeaderG = (Block TestBlockHeader era -> Int)
-> SimpleGetter (Block TestBlockHeader era) Int
forall s a. (s -> a) -> SimpleGetter s a
to ((Block TestBlockHeader era -> Int)
 -> SimpleGetter (Block TestBlockHeader era) Int)
-> (Block TestBlockHeader era -> Int)
-> SimpleGetter (Block TestBlockHeader era) Int
forall a b. (a -> b) -> a -> b
$ TestBlockHeader -> Int
tbhHSize (TestBlockHeader -> Int)
-> (Block TestBlockHeader era -> TestBlockHeader)
-> Block TestBlockHeader era
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Block TestBlockHeader era -> TestBlockHeader
forall h era. Block h era -> h
blockHeader
  blockBodySizeBlockHeaderL :: Lens' (Block TestBlockHeader era) Word32
blockBodySizeBlockHeaderL =
    (Block TestBlockHeader era -> Word32)
-> (Block TestBlockHeader era
    -> Word32 -> Block TestBlockHeader era)
-> Lens' (Block TestBlockHeader era) Word32
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (TestBlockHeader -> Word32
tbhBSize (TestBlockHeader -> Word32)
-> (Block TestBlockHeader era -> TestBlockHeader)
-> Block TestBlockHeader era
-> Word32
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Block TestBlockHeader era -> TestBlockHeader
forall h era. Block h era -> h
blockHeader) ((Block TestBlockHeader era -> Word32 -> Block TestBlockHeader era)
 -> Lens' (Block TestBlockHeader era) Word32)
-> (Block TestBlockHeader era
    -> Word32 -> Block TestBlockHeader era)
-> Lens' (Block TestBlockHeader era) Word32
forall a b. (a -> b) -> a -> b
$
      \b :: Block TestBlockHeader era
b@Block {TestBlockHeader
blockHeader :: forall h era. Block h era -> h
blockHeader :: TestBlockHeader
blockHeader} Word32
tbhBSize -> Block TestBlockHeader era
b {blockHeader = blockHeader {tbhBSize}}
  blockBodyHashBlockHeaderL :: Lens'
  (Block TestBlockHeader era) (Hash HASH EraIndependentBlockBody)
blockBodyHashBlockHeaderL =
    (Block TestBlockHeader era -> Hash HASH EraIndependentBlockBody)
-> (Block TestBlockHeader era
    -> Hash HASH EraIndependentBlockBody -> Block TestBlockHeader era)
-> Lens'
     (Block TestBlockHeader era) (Hash HASH EraIndependentBlockBody)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (TestBlockHeader -> Hash HASH EraIndependentBlockBody
tbhBHash (TestBlockHeader -> Hash HASH EraIndependentBlockBody)
-> (Block TestBlockHeader era -> TestBlockHeader)
-> Block TestBlockHeader era
-> Hash HASH EraIndependentBlockBody
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Block TestBlockHeader era -> TestBlockHeader
forall h era. Block h era -> h
blockHeader) ((Block TestBlockHeader era
  -> Hash HASH EraIndependentBlockBody -> Block TestBlockHeader era)
 -> Lens'
      (Block TestBlockHeader era) (Hash HASH EraIndependentBlockBody))
-> (Block TestBlockHeader era
    -> Hash HASH EraIndependentBlockBody -> Block TestBlockHeader era)
-> Lens'
     (Block TestBlockHeader era) (Hash HASH EraIndependentBlockBody)
forall a b. (a -> b) -> a -> b
$
      \b :: Block TestBlockHeader era
b@Block {TestBlockHeader
blockHeader :: forall h era. Block h era -> h
blockHeader :: TestBlockHeader
blockHeader} Hash HASH EraIndependentBlockBody
tbhBHash -> Block TestBlockHeader era
b {blockHeader = blockHeader {tbhBHash}}
  slotNoBlockHeaderL :: Lens' (Block TestBlockHeader era) SlotNo
slotNoBlockHeaderL =
    (Block TestBlockHeader era -> SlotNo)
-> (Block TestBlockHeader era
    -> SlotNo -> Block TestBlockHeader era)
-> Lens' (Block TestBlockHeader era) SlotNo
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (TestBlockHeader -> SlotNo
tbhSlot (TestBlockHeader -> SlotNo)
-> (Block TestBlockHeader era -> TestBlockHeader)
-> Block TestBlockHeader era
-> SlotNo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Block TestBlockHeader era -> TestBlockHeader
forall h era. Block h era -> h
blockHeader) ((Block TestBlockHeader era -> SlotNo -> Block TestBlockHeader era)
 -> Lens' (Block TestBlockHeader era) SlotNo)
-> (Block TestBlockHeader era
    -> SlotNo -> Block TestBlockHeader era)
-> Lens' (Block TestBlockHeader era) SlotNo
forall a b. (a -> b) -> a -> b
$
      \b :: Block TestBlockHeader era
b@Block {TestBlockHeader
blockHeader :: forall h era. Block h era -> h
blockHeader :: TestBlockHeader
blockHeader} SlotNo
tbhSlot -> Block TestBlockHeader era
b {blockHeader = blockHeader {tbhSlot}}
  protVerBlockHeaderL :: Lens' (Block TestBlockHeader era) ProtVer
protVerBlockHeaderL =
    (Block TestBlockHeader era -> ProtVer)
-> (Block TestBlockHeader era
    -> ProtVer -> Block TestBlockHeader era)
-> Lens' (Block TestBlockHeader era) ProtVer
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (TestBlockHeader -> ProtVer
tbhProtVer (TestBlockHeader -> ProtVer)
-> (Block TestBlockHeader era -> TestBlockHeader)
-> Block TestBlockHeader era
-> ProtVer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Block TestBlockHeader era -> TestBlockHeader
forall h era. Block h era -> h
blockHeader) ((Block TestBlockHeader era
  -> ProtVer -> Block TestBlockHeader era)
 -> Lens' (Block TestBlockHeader era) ProtVer)
-> (Block TestBlockHeader era
    -> ProtVer -> Block TestBlockHeader era)
-> Lens' (Block TestBlockHeader era) ProtVer
forall a b. (a -> b) -> a -> b
$
      \b :: Block TestBlockHeader era
b@Block {TestBlockHeader
blockHeader :: forall h era. Block h era -> h
blockHeader :: TestBlockHeader
blockHeader} ProtVer
tbhProtVer -> Block TestBlockHeader era
b {blockHeader = blockHeader {tbhProtVer}}

mkTestBlockHeaderNoNonce :: EraBlockHeader h era => Block h era -> TestBlockHeader
mkTestBlockHeaderNoNonce :: forall h era.
EraBlockHeader h era =>
Block h era -> TestBlockHeader
mkTestBlockHeaderNoNonce Block h era
block =
  TestBlockHeader
    { tbhIssuer :: KeyHash BlockIssuer
tbhIssuer = Block h era
block Block h era
-> Getting
     (KeyHash BlockIssuer) (Block h era) (KeyHash BlockIssuer)
-> KeyHash BlockIssuer
forall s a. s -> Getting a s a -> a
^. Getting (KeyHash BlockIssuer) (Block h era) (KeyHash BlockIssuer)
SimpleGetter (Block h era) (KeyHash BlockIssuer)
forall h era.
EraBlockHeader h era =>
SimpleGetter (Block h era) (KeyHash BlockIssuer)
blockIssuerBlockHeaderG
    , tbhHSize :: Int
tbhHSize = Block h era
block Block h era -> Getting Int (Block h era) Int -> Int
forall s a. s -> Getting a s a -> a
^. Getting Int (Block h era) Int
SimpleGetter (Block h era) Int
forall h era.
EraBlockHeader h era =>
SimpleGetter (Block h era) Int
blockHeaderSizeBlockHeaderG
    , tbhBSize :: Word32
tbhBSize = Block h era
block Block h era -> Getting Word32 (Block h era) Word32 -> Word32
forall s a. s -> Getting a s a -> a
^. Getting Word32 (Block h era) Word32
forall h era. EraBlockHeader h era => Lens' (Block h era) Word32
Lens' (Block h era) Word32
blockBodySizeBlockHeaderL
    , tbhBHash :: Hash HASH EraIndependentBlockBody
tbhBHash = Block h era
block Block h era
-> Getting
     (Hash HASH EraIndependentBlockBody)
     (Block h era)
     (Hash HASH EraIndependentBlockBody)
-> Hash HASH EraIndependentBlockBody
forall s a. s -> Getting a s a -> a
^. Getting
  (Hash HASH EraIndependentBlockBody)
  (Block h era)
  (Hash HASH EraIndependentBlockBody)
forall h era.
EraBlockHeader h era =>
Lens' (Block h era) (Hash HASH EraIndependentBlockBody)
Lens' (Block h era) (Hash HASH EraIndependentBlockBody)
blockBodyHashBlockHeaderL
    , tbhSlot :: SlotNo
tbhSlot = Block h era
block Block h era -> Getting SlotNo (Block h era) SlotNo -> SlotNo
forall s a. s -> Getting a s a -> a
^. Getting SlotNo (Block h era) SlotNo
forall h era. EraBlockHeader h era => Lens' (Block h era) SlotNo
Lens' (Block h era) SlotNo
slotNoBlockHeaderL
    , tbhPrevNonce :: Maybe Nonce
tbhPrevNonce = Maybe Nonce
forall a. Maybe a
Nothing
    , tbhProtVer :: ProtVer
tbhProtVer = Block h era
block Block h era -> Getting ProtVer (Block h era) ProtVer -> ProtVer
forall s a. s -> Getting a s a -> a
^. Getting ProtVer (Block h era) ProtVer
forall h era. EraBlockHeader h era => Lens' (Block h era) ProtVer
Lens' (Block h era) ProtVer
protVerBlockHeaderL
    }