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

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

import Cardano.Ledger.Alonzo.Scripts (CostModels)
import Cardano.Ledger.Alonzo.TxWits (Redeemers)
import Cardano.Ledger.Conway.Governance (GovAction, ProposalProcedure, VotingProcedure)
import Cardano.Ledger.Core
import Cardano.Ledger.Dijkstra (DijkstraEra)
import Cardano.Ledger.Dijkstra.HuddleSpec (dijkstraCDDL)
import Cardano.Ledger.Dijkstra.Scripts (AccountBalanceInterval, AccountBalanceIntervals)
import Cardano.Ledger.Dijkstra.Tx (Tx (..))
import Cardano.Ledger.Plutus.Data (Data, Datum)
import Test.Cardano.Ledger.Alonzo.Arbitrary (genDatumPresent, genNonEmptyRedeemers)
import Test.Cardano.Ledger.Binary.Cuddle (
  noTwiddle,
  specWithHuddle,
 )
import Test.Cardano.Ledger.Common
import Test.Cardano.Ledger.Core.Binary (
  fullAnnCddlSpec,
  fullAnnGenCddlSpec,
  fullCddlSpec,
  fullGenCddlSpec,
 )
import Test.Cardano.Ledger.Dijkstra.Arbitrary (genNonEmptyAccountBalanceIntervals)
import Test.Cardano.Ledger.Dijkstra.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 @DijkstraEra
    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
dijkstraCDDL (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
      -- BlockBody
      String -> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix transaction" (SpecWith HuddleEnv -> SpecWith HuddleEnv)
-> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a b. (a -> b) -> a -> b
$
        forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a,
 DecCBOR (Annotator a), HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullAnnCddlSpec @(BlockBody DijkstraEra) Version
v Text
"block_body"
      -- AccountBalanceInterval
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a, HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullCddlSpec @(AccountBalanceInterval DijkstraEra) Version
v Text
"account_balance_interval"
      -- AccountBalanceIntervals
      forall a.
(Eq a, Show a, EncCBOR a, DecCBOR a, HasCallStack) =>
Gen a -> Version -> Text -> SpecWith HuddleEnv
fullGenCddlSpec @(AccountBalanceIntervals DijkstraEra)
        Gen (AccountBalanceIntervals DijkstraEra)
forall era. Gen (AccountBalanceIntervals era)
genNonEmptyAccountBalanceIntervals
        Version
v
        Text
"account_balance_intervals"
      -- Value
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a, HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullCddlSpec @(Value DijkstraEra) Version
v Text
"value"
      -- TxBody TopTx
      String -> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix TxBody" (SpecWith HuddleEnv -> SpecWith HuddleEnv)
-> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a b. (a -> b) -> a -> b
$ do
        forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a,
 DecCBOR (Annotator a), HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullAnnCddlSpec @(TxBody TopTx DijkstraEra) Version
v Text
"transaction_body"
      -- TxBody SubTx
      String -> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix TxBody" (SpecWith HuddleEnv -> SpecWith HuddleEnv)
-> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a b. (a -> b) -> a -> b
$ do
        forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a,
 DecCBOR (Annotator a), HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullAnnCddlSpec @(TxBody SubTx DijkstraEra) Version
v Text
"sub_transaction_body"
      -- TxAuxData
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a,
 DecCBOR (Annotator a), HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullAnnCddlSpec @(TxAuxData DijkstraEra) Version
v Text
"auxiliary_data"
      -- NativeScript
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a,
 DecCBOR (Annotator a), HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullAnnCddlSpec @(NativeScript DijkstraEra) Version
v Text
"native_script"
      -- Data
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a,
 DecCBOR (Annotator a), HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullAnnCddlSpec @(Data DijkstraEra) Version
v Text
"plutus_data"
      -- TxOut
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a, HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullCddlSpec @(TxOut DijkstraEra) Version
v Text
"transaction_output"
      -- Script
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a,
 DecCBOR (Annotator a), HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullAnnCddlSpec @(Script DijkstraEra) Version
v Text
"script"
      -- Datum
      forall a.
(Eq a, Show a, EncCBOR a, DecCBOR a, HasCallStack) =>
Gen a -> Version -> Text -> SpecWith HuddleEnv
fullGenCddlSpec @(Datum DijkstraEra) Gen (Datum DijkstraEra)
forall era. Era era => Gen (Datum era)
genDatumPresent Version
v Text
"datum_option"
      -- TxWits
      String -> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix plutus_v4_script" (SpecWith HuddleEnv -> SpecWith HuddleEnv)
-> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a b. (a -> b) -> a -> b
$ do
        forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a,
 DecCBOR (Annotator a), HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullAnnCddlSpec @(TxWits DijkstraEra) Version
v Text
"transaction_witness_set"
      -- PParamsUpdate
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a, HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullCddlSpec @(PParamsUpdate DijkstraEra) Version
v Text
"protocol_param_update"
      -- CostModels
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a, HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullCddlSpec @CostModels Version
v Text
"cost_models"
      -- Redeemers
      forall a.
(Eq a, Show a, EncCBOR a, DecCBOR a, DecCBOR (Annotator a),
 HasCallStack) =>
Gen a -> Version -> Text -> SpecWith HuddleEnv
fullAnnGenCddlSpec @(Redeemers DijkstraEra) Gen (Redeemers DijkstraEra)
forall era.
(AlonzoEraScript era, Arbitrary (PlutusPurpose AsIx era)) =>
Gen (Redeemers era)
genNonEmptyRedeemers Version
v Text
"redeemers"
      -- Tx
      String -> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"fix Transaction" (SpecWith HuddleEnv -> SpecWith HuddleEnv)
-> SpecWith HuddleEnv -> SpecWith HuddleEnv
forall a b. (a -> b) -> a -> b
$ do
        forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a,
 DecCBOR (Annotator a), HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullAnnCddlSpec @(Tx TopTx DijkstraEra) Version
v Text
"transaction"
      -- VotingProcedure
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a, HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullCddlSpec @(VotingProcedure DijkstraEra) Version
v Text
"voting_procedure"
      -- ProposalProcedure
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a, HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullCddlSpec @(ProposalProcedure DijkstraEra) Version
v Text
"proposal_procedure"
      -- GovAction
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a, HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullCddlSpec @(GovAction DijkstraEra) Version
v Text
"gov_action"
      -- TxCert
      forall a.
(Eq a, Show a, Arbitrary a, EncCBOR a, DecCBOR a, HasCallStack) =>
Version -> Text -> SpecWith HuddleEnv
fullCddlSpec @(TxCert DijkstraEra) Version
v Text
"certificate"