{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Test.Cardano.Ledger.Babbage.Binary.CddlSpec (spec) where
import Cardano.Ledger.Allegra.Scripts
import Cardano.Ledger.Alonzo.Scripts (CostModels)
import Cardano.Ledger.Alonzo.TxWits (Redeemers)
import Cardano.Ledger.Babbage (BabbageEra)
import Cardano.Ledger.Babbage.HuddleSpec (babbageCDDL)
import Cardano.Ledger.Block (Block (Block))
import Cardano.Ledger.Core
import Cardano.Ledger.Plutus.Data (Data, Datum)
import Cardano.Protocol.Crypto (StandardCrypto)
import qualified Cardano.Protocol.Praos.BlockHeader as Praos
import Test.Cardano.Ledger.Babbage.Arbitrary ()
import Test.Cardano.Ledger.Babbage.Binary.Annotator ()
import Test.Cardano.Ledger.Binary.Cuddle (
huddleDecoderEquivalenceSpec,
huddleRoundTripAnnCborSpec,
huddleRoundTripCborSpec,
huddleRoundTripGenValidate,
noTwiddle,
specWithHuddle,
)
import Test.Cardano.Ledger.Common
import Test.Cardano.Ledger.Core.Arbitrary (genEraProtVer)
import Test.Cardano.Protocol.Praos.BlockHeader.Arbitrary ()
genPraosHeader :: Gen (Praos.Header StandardCrypto)
= do
h <- Gen (Header StandardCrypto)
forall a. Arbitrary a => Gen a
arbitrary
pv <- genEraProtVer @BabbageEra
pure $ Praos.Header ((Praos.headerBody h) {Praos.hbProtVer = pv}) (Praos.headerSig h)
genPraosBlock :: Gen (Block (Praos.Header StandardCrypto) BabbageEra)
genPraosBlock :: Gen (Block (Header StandardCrypto) BabbageEra)
genPraosBlock = Header StandardCrypto
-> BlockBody BabbageEra -> Block (Header StandardCrypto) BabbageEra
Header StandardCrypto
-> AlonzoBlockBody BabbageEra
-> Block (Header StandardCrypto) BabbageEra
forall h era. h -> BlockBody era -> Block h era
Block (Header StandardCrypto
-> AlonzoBlockBody BabbageEra
-> Block (Header StandardCrypto) BabbageEra)
-> Gen (Header StandardCrypto)
-> Gen
(AlonzoBlockBody BabbageEra
-> Block (Header StandardCrypto) BabbageEra)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Header StandardCrypto)
genPraosHeader Gen
(AlonzoBlockBody BabbageEra
-> Block (Header StandardCrypto) BabbageEra)
-> Gen (AlonzoBlockBody BabbageEra)
-> Gen (Block (Header StandardCrypto) BabbageEra)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Int -> Int)
-> Gen (AlonzoBlockBody BabbageEra)
-> Gen (AlonzoBlockBody BabbageEra)
forall a. (Int -> Int) -> Gen a -> Gen a
scale (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
2) Gen (AlonzoBlockBody BabbageEra)
forall a. Arbitrary a => Gen a
arbitrary
spec :: Spec
spec :: Spec
spec =
String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"CDDL" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
let v :: Version
v = forall era. Era era => Version
eraProtVerHigh @BabbageEra
String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Huddle" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ Huddle -> SpecWith HuddleEnv -> Spec
specWithHuddle Huddle
babbageCDDL (SpecWith HuddleEnv -> Spec)
-> (SpecWith HuddleEnv -> SpecWith HuddleEnv)
-> SpecWith HuddleEnv
-> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SpecWith HuddleEnv -> SpecWith HuddleEnv
noTwiddle (SpecWith HuddleEnv -> Spec) -> SpecWith HuddleEnv -> Spec
forall a b. (a -> b) -> a -> b
$ do
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Value BabbageEra) Version
v Text
"coin"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(TxBody TopTx BabbageEra) Version
v Text
"transaction_body"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(TxBody TopTx BabbageEra) Version
v Text
"transaction_body"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(TxAuxData BabbageEra) Version
v Text
"auxiliary_data"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(TxAuxData BabbageEra) Version
v Text
"auxiliary_data"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(Timelock BabbageEra) Version
v Text
"native_script"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Timelock BabbageEra) Version
v Text
"native_script"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(Data BabbageEra) Version
v Text
"plutus_data"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Data BabbageEra) Version
v Text
"plutus_data"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(TxOut BabbageEra) Version
v Text
"transaction_output"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(Script BabbageEra) Version
v Text
"script"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Script BabbageEra) Version
v Text
"script"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Datum BabbageEra) Version
v Text
"datum_option"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(TxWits BabbageEra) Version
v Text
"transaction_witness_set"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(TxWits BabbageEra) Version
v Text
"transaction_witness_set"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(PParamsUpdate BabbageEra) Version
v Text
"protocol_param_update"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @CostModels Version
v Text
"cost_models"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(Redeemers BabbageEra) Version
v Text
"redeemers"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Redeemers BabbageEra) Version
v Text
"redeemers"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(Tx TopTx BabbageEra) Version
v Text
"transaction"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Tx TopTx BabbageEra) Version
v Text
"transaction"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(Praos.Header StandardCrypto) Version
v Text
"header"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Praos.Header StandardCrypto) Version
v Text
"header"
forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Praos.HeaderBody StandardCrypto) Version
v Text
"header_body"
forall a.
(DecCBOR a, Show a, EncCBOR a) =>
Gen a -> Version -> Text -> SpecWith HuddleEnv
huddleRoundTripGenValidate @(Block (Praos.Header StandardCrypto) BabbageEra) Gen (Block (Header StandardCrypto) BabbageEra)
genPraosBlock Version
v Text
"block"
String -> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"DecCBOR instances equivalence via CDDL" (SpecWith HuddleEnv -> SpecWith HuddleEnv)
-> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a b. (a -> b) -> a -> b
$ do
forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(TxBody TopTx BabbageEra) Version
v Text
"transaction_body"
forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(TxAuxData BabbageEra) Version
v Text
"auxiliary_data"
forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(Timelock BabbageEra) Version
v Text
"native_script"
forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(Data BabbageEra) Version
v Text
"plutus_data"
forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(Script BabbageEra) Version
v Text
"script"
forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(TxWits BabbageEra) Version
v Text
"transaction_witness_set"
forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(Redeemers BabbageEra) Version
v Text
"redeemers"
forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(Tx TopTx BabbageEra) Version
v Text
"transaction"
forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(Praos.Header StandardCrypto) Version
v Text
"header"