{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}

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

import Cardano.Ledger.Allegra.Scripts
import Cardano.Ledger.Alonzo (AlonzoEra)
import Cardano.Ledger.Alonzo.HuddleSpec (alonzoCDDL)
import Cardano.Ledger.Alonzo.Scripts (CostModels)
import Cardano.Ledger.Alonzo.TxWits (AlonzoTxWits, Redeemers)
import Cardano.Ledger.Core
import Cardano.Ledger.MempoolTx (MempoolTx)
import Cardano.Ledger.Plutus.Data (Data)
import Test.Cardano.Ledger.Alonzo.Binary.Annotator ()
import Test.Cardano.Ledger.Binary.Cuddle (
  huddleDecoderEquivalenceSpec,
  huddleRoundTripAnnCborSpec,
  huddleRoundTripCborSpec,
  noTwiddle,
  specWithHuddle,
 )
import Test.Cardano.Ledger.Common

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 @AlonzoEra
    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
alonzoCDDL (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 AlonzoEra) Version
v Text
"coin"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(TxBody TopTx AlonzoEra) Version
v Text
"transaction_body"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(TxBody TopTx AlonzoEra) Version
v Text
"transaction_body"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(TxAuxData AlonzoEra) Version
v Text
"auxiliary_data"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(TxAuxData AlonzoEra) Version
v Text
"auxiliary_data"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(Timelock AlonzoEra) Version
v Text
"native_script"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Timelock AlonzoEra) Version
v Text
"native_script"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(Data AlonzoEra) Version
v Text
"plutus_data"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Data AlonzoEra) Version
v Text
"plutus_data"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(TxOut AlonzoEra) Version
v Text
"transaction_output"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(AlonzoTxWits AlonzoEra) Version
v Text
"transaction_witness_set"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(AlonzoTxWits AlonzoEra) Version
v Text
"transaction_witness_set"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(PParamsUpdate AlonzoEra) Version
v Text
"protocol_param_update"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(Redeemers AlonzoEra) Version
v Text
"redeemers"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(Redeemers AlonzoEra) Version
v Text
"redeemers"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripAnnCborSpec @(MempoolTx AlonzoEra) Version
v Text
"transaction"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @(MempoolTx AlonzoEra) Version
v Text
"transaction"
      forall a.
(HasCallStack, Eq a, Show a, EncCBOR a, DecCBOR a) =>
Version -> Text -> SpecWith HuddleEnv
huddleRoundTripCborSpec @CostModels Version
v Text
"cost_models"
      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 AlonzoEra) Version
v Text
"transaction_body"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(TxAuxData AlonzoEra) Version
v Text
"auxiliary_data"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(Timelock AlonzoEra) Version
v Text
"native_script"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(Data AlonzoEra) Version
v Text
"plutus_data"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(AlonzoTxWits AlonzoEra) Version
v Text
"transaction_witness_set"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(Redeemers AlonzoEra) Version
v Text
"redeemers"
        forall a.
(HasCallStack, Eq a, Show a, DecCBOR a, DecCBOR (Annotator a)) =>
Version -> Text -> SpecWith HuddleEnv
huddleDecoderEquivalenceSpec @(MempoolTx AlonzoEra) Version
v Text
"transaction"