{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Test.Cardano.Ledger.Conway.Binary.CddlSpec (spec) where

import Cardano.Ledger.Allegra.Scripts
import Cardano.Ledger.Alonzo.Scripts (CostModels)
import Cardano.Ledger.Alonzo.TxWits (Redeemers)
import Cardano.Ledger.Conway (ConwayEra)
import Cardano.Ledger.Conway.Governance (GovAction, ProposalProcedure, VotingProcedure)
import Cardano.Ledger.Conway.HuddleSpec (conwayCDDL)
import Cardano.Ledger.Core
import Cardano.Ledger.Plutus.Data (Data, Datum)
import Test.Cardano.Ledger.Alonzo.Arbitrary (genNonEmptyRedeemers)
import Test.Cardano.Ledger.Binary.Cuddle (
  huddleAntiCborSpec,
  huddleDecoderEquivalenceSpec,
  huddleRoundTripAnnCborSpec,
  huddleRoundTripArbitraryValidate,
  huddleRoundTripCborSpec,
  huddleRoundTripGenValidate,
  specWithHuddle,
 )
import Test.Cardano.Ledger.Common
import Test.Cardano.Ledger.Conway.Arbitrary ()
import Test.Cardano.Ledger.Conway.Binary.Annotator ()

spec :: Spec
spec :: Spec
spec = do
  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 @ConwayEra
    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 (CTreeRoot MonoReferenced) -> Spec
specWithHuddle Huddle
conwayCDDL (SpecWith (CTreeRoot MonoReferenced) -> Spec)
-> SpecWith (CTreeRoot MonoReferenced) -> Spec
forall a b. (a -> b) -> a -> b
$ do
      -- Value
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(Value ConwayEra) Version
v Text
"positive_coin"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(Value ConwayEra) Version
v Text
"value"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(Value ConwayEra) Version
v Text
"value"
      forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(Value ConwayEra) Version
v Text
"value"
      -- TxBody
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripAnnCborSpec @(TxBody TopTx ConwayEra) Version
v Text
"transaction_body"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(TxBody TopTx ConwayEra) Version
v Text
"transaction_body"
      String
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix problems with fields" (SpecWith (CTreeRoot MonoReferenced)
 -> SpecWith (CTreeRoot MonoReferenced))
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a b. (a -> b) -> a -> b
$ do
        forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(TxBody TopTx ConwayEra) Version
v Text
"transaction_body"
        forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(TxBody TopTx ConwayEra) Version
v Text
"transaction_body"
      -- AuxData
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripAnnCborSpec @(TxAuxData ConwayEra) Version
v Text
"auxiliary_data"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(TxAuxData ConwayEra) Version
v Text
"auxiliary_data"
      String
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix chain_code, metadatum" (SpecWith (CTreeRoot MonoReferenced)
 -> SpecWith (CTreeRoot MonoReferenced))
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a b. (a -> b) -> a -> b
$ do
        forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(TxAuxData ConwayEra) Version
v Text
"auxiliary_data"
        forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(TxAuxData ConwayEra) Version
v Text
"auxiliary_data"
      -- NativeScript
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripAnnCborSpec @(Timelock ConwayEra) Version
v Text
"native_script"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(Timelock ConwayEra) Version
v Text
"native_script"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(Timelock ConwayEra) Version
v Text
"native_script"
      forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(Timelock ConwayEra) Version
v Text
"native_script"
      -- Data
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripAnnCborSpec @(Data ConwayEra) Version
v Text
"plutus_data"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(Data ConwayEra) Version
v Text
"plutus_data"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(Data ConwayEra) Version
v Text
"plutus_data"
      forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(Data ConwayEra) Version
v Text
"plutus_data"
      -- TxOut
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(TxOut ConwayEra) Version
v Text
"transaction_output"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(TxOut ConwayEra) Version
v Text
"transaction_output"
      forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(TxOut ConwayEra) Version
v Text
"transaction_output"
      -- Script
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripAnnCborSpec @(Script ConwayEra) Version
v Text
"script"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(Script ConwayEra) Version
v Text
"script"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(Script ConwayEra) Version
v Text
"script"
      forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(Script ConwayEra) Version
v Text
"script"
      -- Datum
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(Datum ConwayEra) Version
v Text
"datum_option"
      forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(Datum ConwayEra) Version
v Text
"datum_option"
      -- TODO NoDatum is encoded as an empty bytestring
      String
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix NoDatum" (SpecWith (CTreeRoot MonoReferenced)
 -> SpecWith (CTreeRoot MonoReferenced))
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a b. (a -> b) -> a -> b
$ forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(Datum ConwayEra) Version
v Text
"datum_option"
      -- TxWits
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripAnnCborSpec @(TxWits ConwayEra) Version
v Text
"transaction_witness_set"
      String
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix chain_code" (SpecWith (CTreeRoot MonoReferenced)
 -> SpecWith (CTreeRoot MonoReferenced))
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a b. (a -> b) -> a -> b
$
        forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(TxWits ConwayEra) Version
v Text
"transaction_witness_set"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(TxWits ConwayEra) Version
v Text
"transaction_witness_set"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(TxWits ConwayEra) Version
v Text
"transaction_witness_set"
      -- PParamsUpdate
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(PParamsUpdate ConwayEra) Version
v Text
"protocol_param_update"
      forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(PParamsUpdate ConwayEra) Version
v Text
"protocol_param_update"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(PParamsUpdate ConwayEra) Version
v Text
"protocol_param_update"
      -- CostModels
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @CostModels Version
v Text
"cost_models"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @CostModels Version
v Text
"cost_models"
      -- Redeemers
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripAnnCborSpec @(Redeemers ConwayEra) Version
v Text
"redeemers"
      forall a.
(DecCBOR a, Show a, EncCBOR a) =>
Gen a -> Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripGenValidate @(Redeemers ConwayEra) Gen (Redeemers ConwayEra)
forall era.
(AlonzoEraScript era, Arbitrary (PlutusPurpose AsIx era)) =>
Gen (Redeemers era)
genNonEmptyRedeemers Version
v Text
"redeemers"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(Redeemers ConwayEra) Version
v Text
"redeemers"
      forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(Redeemers ConwayEra) Version
v Text
"redeemers"
      -- Tx
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripAnnCborSpec @(Tx TopTx ConwayEra) Version
v Text
"transaction"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(Tx TopTx ConwayEra) Version
v Text
"transaction"
      String
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix txbody" (SpecWith (CTreeRoot MonoReferenced)
 -> SpecWith (CTreeRoot MonoReferenced))
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a b. (a -> b) -> a -> b
$ do
        forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(Tx TopTx ConwayEra) Version
v Text
"transaction"
        forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(Tx TopTx ConwayEra) Version
v Text
"transaction"
      -- VotingProcedure
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(VotingProcedure ConwayEra) Version
v Text
"voting_procedure"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(VotingProcedure ConwayEra) Version
v Text
"voting_procedure"
      forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(VotingProcedure ConwayEra) Version
v Text
"voting_procedure"
      -- ProposalProcedure
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(ProposalProcedure ConwayEra) Version
v Text
"proposal_procedure"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(ProposalProcedure ConwayEra) Version
v Text
"proposal_procedure"
      String
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix protver decoder" (SpecWith (CTreeRoot MonoReferenced)
 -> SpecWith (CTreeRoot MonoReferenced))
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a b. (a -> b) -> a -> b
$
        forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(ProposalProcedure ConwayEra) Version
v Text
"proposal_procedure"
      -- GovAction
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(GovAction ConwayEra) Version
v Text
"gov_action"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(GovAction ConwayEra) Version
v Text
"gov_action"
      String
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix protver decoder" (SpecWith (CTreeRoot MonoReferenced)
 -> SpecWith (CTreeRoot MonoReferenced))
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a b. (a -> b) -> a -> b
$
        forall a.
DecCBOR a =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleAntiCborSpec @(GovAction ConwayEra) Version
v Text
"gov_action"
      -- TxCert
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripCborSpec @(TxCert ConwayEra) Version
v Text
"certificate"
      forall a.
(DecCBOR a, EncCBOR a, Arbitrary a, Show a) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleRoundTripArbitraryValidate @(TxCert ConwayEra) Version
v Text
"certificate"
      String
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"DecCBOR instances equivalence via CDDL" (SpecWith (CTreeRoot MonoReferenced)
 -> SpecWith (CTreeRoot MonoReferenced))
-> SpecWith (CTreeRoot MonoReferenced)
-> SpecWith (CTreeRoot MonoReferenced)
forall a b. (a -> b) -> a -> b
$ do
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleDecoderEquivalenceSpec @(TxBody TopTx ConwayEra) Version
v Text
"transaction_body"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleDecoderEquivalenceSpec @(TxAuxData ConwayEra) Version
v Text
"auxiliary_data"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleDecoderEquivalenceSpec @(Timelock ConwayEra) Version
v Text
"native_script"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleDecoderEquivalenceSpec @(Data ConwayEra) Version
v Text
"plutus_data"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleDecoderEquivalenceSpec @(Script ConwayEra) Version
v Text
"script"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleDecoderEquivalenceSpec @(TxWits ConwayEra) Version
v Text
"transaction_witness_set"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleDecoderEquivalenceSpec @(Redeemers ConwayEra) Version
v Text
"redeemers"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith (CTreeRoot MonoReferenced)
huddleDecoderEquivalenceSpec @(Tx TopTx ConwayEra) Version
v Text
"transaction"