{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module Test.Cardano.Chain.Block.Size (
tests,
) where
import Cardano.Chain.Block
import Cardano.Ledger.Binary hiding (label)
import Cardano.Prelude
import qualified Data.ByteString as BS
import Data.String (IsString (..))
import Hedgehog (Gen, LabelName, failure, footnote, label, success)
import Test.Cardano.Chain.Block.Gen
import Test.Cardano.Chain.Common.Gen
import qualified Test.Cardano.Chain.Genesis.Gen as Genesis
import qualified Test.Cardano.Chain.Slotting.Gen as Slotting
import qualified Test.Cardano.Chain.Update.Gen as Update
import qualified Test.Cardano.Crypto.Gen as Crypto
import Test.Cardano.Prelude
import Test.Options (TSGroup, TSProperty, eachOfTS)
encodedSizeTest ::
forall a.
Show a =>
(a -> Encoding) ->
(Proxy a -> Size) ->
Gen a ->
TSProperty
encodedSizeTest :: forall a.
Show a =>
(a -> Encoding) -> (Proxy a -> Size) -> Gen a -> TSProperty
encodedSizeTest a -> Encoding
encode Proxy a -> Size
encodedSize Gen a
gen = TestLimit -> Gen a -> (a -> PropertyT IO ()) -> TSProperty
forall a.
(Show a, HasCallStack) =>
TestLimit -> Gen a -> (a -> PropertyT IO ()) -> TSProperty
eachOfTS
TestLimit
300
Gen a
gen
((a -> PropertyT IO ()) -> TSProperty)
-> (a -> PropertyT IO ()) -> TSProperty
forall a b. (a -> b) -> a -> b
$ \a
a -> case Size -> Either Size (Range Natural)
szSimplify (Proxy a -> Size
encodedSize (Proxy a
forall {k} (t :: k). Proxy t
Proxy :: Proxy a)) of
Right rng :: Range Natural
rng@Range {Natural
lo :: Natural
lo :: forall b. Range b -> b
lo, Natural
hi :: Natural
hi :: forall b. Range b -> b
hi} ->
let size :: Natural
size :: Natural
size = Int -> Natural
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Natural) -> Int -> Natural
forall a b. (a -> b) -> a -> b
$ ByteString -> Int
BS.length (Version -> Encoding -> ByteString
forall a. EncCBOR a => Version -> a -> ByteString
serialize' Version
byronProtVer (a -> Encoding
encode a
a))
in if
| Natural
size Natural -> Natural -> Bool
forall a. Ord a => a -> a -> Bool
< Natural
lo -> do
[Char] -> PropertyT IO ()
forall (m :: * -> *). MonadTest m => [Char] -> m ()
footnote ([Char] -> PropertyT IO ()) -> [Char] -> PropertyT IO ()
forall a b. (a -> b) -> a -> b
$ [Char]
"actual size not greater or equal the minimal size: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Natural -> [Char]
forall a b. (Show a, ConvertText [Char] b) => a -> b
show Natural
size [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" ≱ " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Natural -> [Char]
forall a b. (Show a, ConvertText [Char] b) => a -> b
show Natural
lo
PropertyT IO ()
forall (m :: * -> *) a. (MonadTest m, HasCallStack) => m a
failure
| Natural
size Natural -> Natural -> Bool
forall a. Ord a => a -> a -> Bool
> Natural
hi -> do
[Char] -> PropertyT IO ()
forall (m :: * -> *). MonadTest m => [Char] -> m ()
footnote ([Char] -> PropertyT IO ()) -> [Char] -> PropertyT IO ()
forall a b. (a -> b) -> a -> b
$ [Char]
"actual size not smaller or equal the maximal size: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Natural -> [Char]
forall a b. (Show a, ConvertText [Char] b) => a -> b
show Natural
size [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" ≰ " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Natural -> [Char]
forall a b. (Show a, ConvertText [Char] b) => a -> b
show Natural
hi
PropertyT IO ()
forall (m :: * -> *) a. (MonadTest m, HasCallStack) => m a
failure
| Bool
otherwise -> do
LabelName -> PropertyT IO ()
forall (m :: * -> *).
(MonadTest m, HasCallStack) =>
LabelName -> m ()
label (Range Natural -> Natural -> LabelName
classifySize Range Natural
rng Natural
size)
PropertyT IO ()
forall (m :: * -> *). MonadTest m => m ()
success
Left Size
_ -> do
[Char] -> PropertyT IO ()
forall (m :: * -> *). MonadTest m => [Char] -> m ()
footnote [Char]
"a thunk in size expression"
PropertyT IO ()
forall (m :: * -> *) a. (MonadTest m, HasCallStack) => m a
failure
where
classifySize :: Range Natural -> Natural -> LabelName
classifySize :: Range Natural -> Natural -> LabelName
classifySize Range {Natural
lo :: forall b. Range b -> b
lo :: Natural
lo, Natural
hi :: forall b. Range b -> b
hi :: Natural
hi} Natural
size =
[Char] -> LabelName
forall a. IsString a => [Char] -> a
fromString
([Char] -> LabelName) -> [Char] -> LabelName
forall a b. (a -> b) -> a -> b
$ [Char]
"lo: "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Natural -> [Char]
forall a b. (Show a, ConvertText [Char] b) => a -> b
show Natural
lo
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" hi: "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Natural -> [Char]
forall a b. (Show a, ConvertText [Char] b) => a -> b
show Natural
hi
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" size: "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Natural -> [Char]
forall a b. (Show a, ConvertText [Char] b) => a -> b
show Natural
s
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" - "
[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Natural -> [Char]
forall a b. (Show a, ConvertText [Char] b) => a -> b
show (Natural
s Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
+ Natural
bucket)
where
bucket :: Natural
bucket =
if Natural
hi Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
- Natural
lo Natural -> Natural -> Bool
forall a. Ord a => a -> a -> Bool
>= Natural
5
then (Natural
hi Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
- Natural
lo) Natural -> Natural -> Natural
forall a. Integral a => a -> a -> a
`div` Natural
5
else Natural
1
s :: Natural
s = Natural
lo Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
+ Natural
bucket Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
* ((Natural
size Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
- Natural
lo) Natural -> Natural -> Natural
forall a. Integral a => a -> a -> a
`div` Natural
bucket)
encodedSizeTestEncCBOR ::
forall a.
(EncCBOR a, Show a) =>
Gen a ->
TSProperty
encodedSizeTestEncCBOR :: forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR =
(a -> Encoding) -> (Proxy a -> Size) -> Gen a -> TSProperty
forall a.
Show a =>
(a -> Encoding) -> (Proxy a -> Size) -> Gen a -> TSProperty
encodedSizeTest a -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Proxy a -> Size
forall a. EncCBOR a => Proxy a -> Size
szGreedy
ts_prop_sizeProtocolMagicId :: TSProperty
ts_prop_sizeProtocolMagicId :: TSProperty
ts_prop_sizeProtocolMagicId =
Gen ProtocolMagicId -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen ProtocolMagicId
Crypto.genProtocolMagicId
ts_prop_sizeEpochAndSlotCount :: TSProperty
ts_prop_sizeEpochAndSlotCount :: TSProperty
ts_prop_sizeEpochAndSlotCount =
Gen EpochAndSlotCount -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR (Gen EpochSlots
Slotting.genEpochSlots Gen EpochSlots
-> (EpochSlots -> Gen EpochAndSlotCount) -> Gen EpochAndSlotCount
forall a b.
GenT Identity a -> (a -> GenT Identity b) -> GenT Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= EpochSlots -> Gen EpochAndSlotCount
Slotting.genEpochAndSlotCount)
ts_prop_sizeChainDifficulty :: TSProperty
ts_prop_sizeChainDifficulty :: TSProperty
ts_prop_sizeChainDifficulty = Gen ChainDifficulty -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen ChainDifficulty
genChainDifficulty
ts_prop_sizeHeaderHash :: TSProperty
= Gen HeaderHash -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen HeaderHash
genHeaderHash
ts_prop_sizeSlotNumber :: TSProperty
ts_prop_sizeSlotNumber :: TSProperty
ts_prop_sizeSlotNumber = Gen SlotNumber -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen SlotNumber
Slotting.genSlotNumber
ts_prop_sizeProtocolVersion :: TSProperty
ts_prop_sizeProtocolVersion :: TSProperty
ts_prop_sizeProtocolVersion = Gen ProtocolVersion -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen ProtocolVersion
Update.genProtocolVersion
ts_prop_sizeApplicationName :: TSProperty
ts_prop_sizeApplicationName :: TSProperty
ts_prop_sizeApplicationName = Gen ApplicationName -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen ApplicationName
Update.genApplicationName
ts_prop_sizeSoftwareVersion :: TSProperty
ts_prop_sizeSoftwareVersion :: TSProperty
ts_prop_sizeSoftwareVersion = Gen SoftwareVersion -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen SoftwareVersion
Update.genSoftwareVersion
ts_prop_sizeProof :: TSProperty
ts_prop_sizeProof :: TSProperty
ts_prop_sizeProof = Gen Proof -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR (Gen ProtocolMagicId
Crypto.genProtocolMagicId Gen ProtocolMagicId -> (ProtocolMagicId -> Gen Proof) -> Gen Proof
forall a b.
GenT Identity a -> (a -> GenT Identity b) -> GenT Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ProtocolMagicId -> Gen Proof
genProof)
ts_prop_sizeVerificationKey :: TSProperty
ts_prop_sizeVerificationKey :: TSProperty
ts_prop_sizeVerificationKey = Gen VerificationKey -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen VerificationKey
Crypto.genVerificationKey
ts_prop_sizeToSign :: TSProperty
ts_prop_sizeToSign :: TSProperty
ts_prop_sizeToSign =
Gen ToSign -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR
(Gen ToSign -> TSProperty) -> Gen ToSign -> TSProperty
forall a b. (a -> b) -> a -> b
$ ((,) (ProtocolMagicId -> EpochSlots -> (ProtocolMagicId, EpochSlots))
-> Gen ProtocolMagicId
-> GenT Identity (EpochSlots -> (ProtocolMagicId, EpochSlots))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen ProtocolMagicId
Crypto.genProtocolMagicId GenT Identity (EpochSlots -> (ProtocolMagicId, EpochSlots))
-> Gen EpochSlots -> GenT Identity (ProtocolMagicId, EpochSlots)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen EpochSlots
Slotting.genEpochSlots)
GenT Identity (ProtocolMagicId, EpochSlots)
-> ((ProtocolMagicId, EpochSlots) -> Gen ToSign) -> Gen ToSign
forall a b.
GenT Identity a -> (a -> GenT Identity b) -> GenT Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ProtocolMagicId -> EpochSlots -> Gen ToSign)
-> (ProtocolMagicId, EpochSlots) -> Gen ToSign
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ProtocolMagicId -> EpochSlots -> Gen ToSign
genToSign
ts_prop_sizeBlockVersions :: TSProperty
ts_prop_sizeBlockVersions :: TSProperty
ts_prop_sizeBlockVersions =
((ProtocolVersion, SoftwareVersion) -> Encoding)
-> (Proxy (ProtocolVersion, SoftwareVersion) -> Size)
-> Gen (ProtocolVersion, SoftwareVersion)
-> TSProperty
forall a.
Show a =>
(a -> Encoding) -> (Proxy a -> Size) -> Gen a -> TSProperty
encodedSizeTest
((ProtocolVersion -> SoftwareVersion -> Encoding)
-> (ProtocolVersion, SoftwareVersion) -> Encoding
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ProtocolVersion -> SoftwareVersion -> Encoding
encCBORBlockVersions)
((Proxy ProtocolVersion -> Proxy SoftwareVersion -> Size)
-> Proxy (ProtocolVersion, SoftwareVersion) -> Size
forall a b c. (Proxy a -> Proxy b -> c) -> Proxy (a, b) -> c
uncurryP Proxy ProtocolVersion -> Proxy SoftwareVersion -> Size
encCBORBlockVersionsSize)
((,) (ProtocolVersion
-> SoftwareVersion -> (ProtocolVersion, SoftwareVersion))
-> Gen ProtocolVersion
-> GenT
Identity (SoftwareVersion -> (ProtocolVersion, SoftwareVersion))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen ProtocolVersion
Update.genProtocolVersion GenT
Identity (SoftwareVersion -> (ProtocolVersion, SoftwareVersion))
-> Gen SoftwareVersion -> Gen (ProtocolVersion, SoftwareVersion)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen SoftwareVersion
Update.genSoftwareVersion)
ts_prop_sizeEpochNumber :: TSProperty
ts_prop_sizeEpochNumber :: TSProperty
ts_prop_sizeEpochNumber =
Gen EpochNumber -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen EpochNumber
Slotting.genEpochNumber
ts_prop_sizeEpochNumberSignature :: TSProperty
ts_prop_sizeEpochNumberSignature :: TSProperty
ts_prop_sizeEpochNumberSignature =
Gen (Signature EpochSlots) -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR
(Gen (Signature EpochSlots) -> TSProperty)
-> Gen (Signature EpochSlots) -> TSProperty
forall a b. (a -> b) -> a -> b
$ Gen ProtocolMagicId
Crypto.genProtocolMagicId
Gen ProtocolMagicId
-> (ProtocolMagicId -> Gen (Signature EpochSlots))
-> Gen (Signature EpochSlots)
forall a b.
GenT Identity a -> (a -> GenT Identity b) -> GenT Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ProtocolMagicId -> Gen EpochSlots -> Gen (Signature EpochSlots))
-> Gen EpochSlots -> ProtocolMagicId -> Gen (Signature EpochSlots)
forall a b c. (a -> b -> c) -> b -> a -> c
flip ProtocolMagicId -> Gen EpochSlots -> Gen (Signature EpochSlots)
forall a.
EncCBOR a =>
ProtocolMagicId -> Gen a -> Gen (Signature a)
Crypto.genSignature Gen EpochSlots
Slotting.genEpochSlots
ts_prop_sizeToSignSignature :: TSProperty
ts_prop_sizeToSignSignature :: TSProperty
ts_prop_sizeToSignSignature =
Gen (Signature ToSign) -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR (Gen (Signature ToSign) -> TSProperty)
-> Gen (Signature ToSign) -> TSProperty
forall a b. (a -> b) -> a -> b
$ do
ProtocolMagicId
pm <- Gen ProtocolMagicId
Crypto.genProtocolMagicId
EpochSlots
es <- Gen EpochSlots
Slotting.genEpochSlots
ProtocolMagicId -> Gen ToSign -> Gen (Signature ToSign)
forall a.
EncCBOR a =>
ProtocolMagicId -> Gen a -> Gen (Signature a)
Crypto.genSignature ProtocolMagicId
pm (ProtocolMagicId -> EpochSlots -> Gen ToSign
genToSign ProtocolMagicId
pm EpochSlots
es)
ts_prop_sizeBlockSignature :: TSProperty
ts_prop_sizeBlockSignature :: TSProperty
ts_prop_sizeBlockSignature =
Gen BlockSignature -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR
(Gen BlockSignature -> TSProperty)
-> Gen BlockSignature -> TSProperty
forall a b. (a -> b) -> a -> b
$ ((,) (ProtocolMagicId -> EpochSlots -> (ProtocolMagicId, EpochSlots))
-> Gen ProtocolMagicId
-> GenT Identity (EpochSlots -> (ProtocolMagicId, EpochSlots))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen ProtocolMagicId
Crypto.genProtocolMagicId GenT Identity (EpochSlots -> (ProtocolMagicId, EpochSlots))
-> Gen EpochSlots -> GenT Identity (ProtocolMagicId, EpochSlots)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen EpochSlots
Slotting.genEpochSlots)
GenT Identity (ProtocolMagicId, EpochSlots)
-> ((ProtocolMagicId, EpochSlots) -> Gen BlockSignature)
-> Gen BlockSignature
forall a b.
GenT Identity a -> (a -> GenT Identity b) -> GenT Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ProtocolMagicId -> EpochSlots -> Gen BlockSignature)
-> (ProtocolMagicId, EpochSlots) -> Gen BlockSignature
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ProtocolMagicId -> EpochSlots -> Gen BlockSignature
genBlockSignature
ts_prop_sizeHeader :: TSProperty
=
((EpochSlots, Header) -> Encoding)
-> (Proxy (EpochSlots, Header) -> Size)
-> Gen (EpochSlots, Header)
-> TSProperty
forall a.
Show a =>
(a -> Encoding) -> (Proxy a -> Size) -> Gen a -> TSProperty
encodedSizeTest
((EpochSlots -> Header -> Encoding)
-> (EpochSlots, Header) -> Encoding
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry EpochSlots -> Header -> Encoding
encCBORHeader)
((Proxy EpochSlots -> Proxy Header -> Size)
-> Proxy (EpochSlots, Header) -> Size
forall a b c. (Proxy a -> Proxy b -> c) -> Proxy (a, b) -> c
uncurryP Proxy EpochSlots -> Proxy Header -> Size
forall a. Proxy EpochSlots -> Proxy (AHeader a) -> Size
encCBORHeaderSize)
(Gen (EpochSlots, Header) -> TSProperty)
-> Gen (EpochSlots, Header) -> TSProperty
forall a b. (a -> b) -> a -> b
$ do
ProtocolMagicId
protocolMagicId <- Gen ProtocolMagicId
Crypto.genProtocolMagicId
EpochSlots
epochSlots <- Gen EpochSlots
Slotting.genEpochSlots
Header
header <- ProtocolMagicId -> EpochSlots -> Gen Header
genHeader ProtocolMagicId
protocolMagicId EpochSlots
epochSlots
(EpochSlots, Header) -> Gen (EpochSlots, Header)
forall a. a -> GenT Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (EpochSlots
epochSlots, Header
header)
ts_prop_sizeGenesisHash :: TSProperty
ts_prop_sizeGenesisHash :: TSProperty
ts_prop_sizeGenesisHash = Gen GenesisHash -> TSProperty
forall a. (EncCBOR a, Show a) => Gen a -> TSProperty
encodedSizeTestEncCBOR Gen GenesisHash
Genesis.genGenesisHash
ts_prop_sizeABoundaryHeader :: TSProperty
=
((ProtocolMagicId, ABoundaryHeader ()) -> Encoding)
-> (Proxy (ProtocolMagicId, ABoundaryHeader ()) -> Size)
-> Gen (ProtocolMagicId, ABoundaryHeader ())
-> TSProperty
forall a.
Show a =>
(a -> Encoding) -> (Proxy a -> Size) -> Gen a -> TSProperty
encodedSizeTest
((ProtocolMagicId -> ABoundaryHeader () -> Encoding)
-> (ProtocolMagicId, ABoundaryHeader ()) -> Encoding
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ProtocolMagicId -> ABoundaryHeader () -> Encoding
forall a. ProtocolMagicId -> ABoundaryHeader a -> Encoding
encCBORABoundaryHeader)
((Proxy ProtocolMagicId -> Proxy (ABoundaryHeader ()) -> Size)
-> Proxy (ProtocolMagicId, ABoundaryHeader ()) -> Size
forall a b c. (Proxy a -> Proxy b -> c) -> Proxy (a, b) -> c
uncurryP Proxy ProtocolMagicId -> Proxy (ABoundaryHeader ()) -> Size
forall a.
Proxy ProtocolMagicId -> Proxy (ABoundaryHeader a) -> Size
encCBORABoundaryHeaderSize)
( (,)
(ProtocolMagicId
-> ABoundaryHeader () -> (ProtocolMagicId, ABoundaryHeader ()))
-> Gen ProtocolMagicId
-> GenT
Identity
(ABoundaryHeader () -> (ProtocolMagicId, ABoundaryHeader ()))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen ProtocolMagicId
Crypto.genProtocolMagicId
GenT
Identity
(ABoundaryHeader () -> (ProtocolMagicId, ABoundaryHeader ()))
-> GenT Identity (ABoundaryHeader ())
-> Gen (ProtocolMagicId, ABoundaryHeader ())
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> GenT Identity (ABoundaryHeader ())
genBoundaryHeader
)
ts_prop_sizeABlockOrBoundaryHdr :: TSProperty
ts_prop_sizeABlockOrBoundaryHdr :: TSProperty
ts_prop_sizeABlockOrBoundaryHdr =
(ABlockOrBoundaryHdr ByteString -> Encoding)
-> (Proxy (ABlockOrBoundaryHdr ByteString) -> Size)
-> Gen (ABlockOrBoundaryHdr ByteString)
-> TSProperty
forall a.
Show a =>
(a -> Encoding) -> (Proxy a -> Size) -> Gen a -> TSProperty
encodedSizeTest
ABlockOrBoundaryHdr ByteString -> Encoding
encCBORABlockOrBoundaryHdr
Proxy (ABlockOrBoundaryHdr ByteString) -> Size
forall a. Proxy (ABlockOrBoundaryHdr a) -> Size
encCBORABlockOrBoundaryHdrSize
(Gen (ABlockOrBoundaryHdr ByteString) -> TSProperty)
-> Gen (ABlockOrBoundaryHdr ByteString) -> TSProperty
forall a b. (a -> b) -> a -> b
$ ((,) (ProtocolMagicId -> EpochSlots -> (ProtocolMagicId, EpochSlots))
-> Gen ProtocolMagicId
-> GenT Identity (EpochSlots -> (ProtocolMagicId, EpochSlots))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen ProtocolMagicId
Crypto.genProtocolMagicId GenT Identity (EpochSlots -> (ProtocolMagicId, EpochSlots))
-> Gen EpochSlots -> GenT Identity (ProtocolMagicId, EpochSlots)
forall a b.
GenT Identity (a -> b) -> GenT Identity a -> GenT Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen EpochSlots
Slotting.genEpochSlots)
GenT Identity (ProtocolMagicId, EpochSlots)
-> ((ProtocolMagicId, EpochSlots)
-> Gen (ABlockOrBoundaryHdr ByteString))
-> Gen (ABlockOrBoundaryHdr ByteString)
forall a b.
GenT Identity a -> (a -> GenT Identity b) -> GenT Identity b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (ProtocolMagicId
-> EpochSlots -> Gen (ABlockOrBoundaryHdr ByteString))
-> (ProtocolMagicId, EpochSlots)
-> Gen (ABlockOrBoundaryHdr ByteString)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ProtocolMagicId
-> EpochSlots -> Gen (ABlockOrBoundaryHdr ByteString)
genABlockOrBoundaryHdr
uncurryP :: (Proxy a -> Proxy b -> c) -> Proxy (a, b) -> c
uncurryP :: forall a b c. (Proxy a -> Proxy b -> c) -> Proxy (a, b) -> c
uncurryP Proxy a -> Proxy b -> c
f Proxy (a, b)
p = Proxy a -> Proxy b -> c
f ((a, b) -> a
forall a b. (a, b) -> a
fst ((a, b) -> a) -> Proxy (a, b) -> Proxy a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy (a, b)
p) ((a, b) -> b
forall a b. (a, b) -> b
snd ((a, b) -> b) -> Proxy (a, b) -> Proxy b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Proxy (a, b)
p)
tests :: TSGroup
tests :: TSGroup
tests = $$discoverPropArg