{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}

module Test.Cardano.Ledger.Core.Binary (
  decoderEquivalenceSpec,
  decoderEquivalenceEraSpec,
  txSizeSpec,
  decoderEquivalenceCoreEraTypesSpec,
  Mem,
) where

import Cardano.Ledger.Core
import Cardano.Ledger.MemoBytes (Mem)
import Lens.Micro
import Test.Cardano.Ledger.Binary (decoderEquivalenceSpec)
import Test.Cardano.Ledger.Common
import Test.Cardano.Ledger.Core.Arbitrary ()
import Test.Cardano.Ledger.Core.Binary.Annotator

txSizeSpec ::
  forall era.
  ( EraTx era
  , Arbitrary (Tx era)
  , SafeToHash (TxWits era)
  ) =>
  Spec
txSizeSpec :: forall era.
(EraTx era, Arbitrary (Tx era), SafeToHash (TxWits era)) =>
Spec
txSizeSpec =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Transaction size" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    String -> (Tx era -> Expectation) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"should match the size of the cbor encoding" ((Tx era -> Expectation) -> Spec)
-> (Tx era -> Expectation) -> Spec
forall a b. (a -> b) -> a -> b
$ \(Tx era
tx :: Tx era) -> do
      let txSize :: Integer
txSize = Tx era -> Integer
forall era.
(EraTx era, SafeToHash (TxWits era)) =>
Tx era -> Integer
sizeTxForFeeCalculation Tx era
tx
      Integer
txSize Integer -> Integer -> Expectation
forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation
`shouldBe` Tx era
tx Tx era -> Getting Integer (Tx era) Integer -> Integer
forall s a. s -> Getting a s a -> a
^. Getting Integer (Tx era) Integer
forall era. EraTx era => SimpleGetter (Tx era) Integer
SimpleGetter (Tx era) Integer
sizeTxF