{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE TypeApplications #-}

module Test.Cardano.Ledger.Conformance.Imp.Conway (spec) where

import Cardano.Ledger.BaseTypes
import Cardano.Ledger.Conway (ConwayEra)
import Test.Cardano.Ledger.Conformance.Imp.Conway.Ratify qualified as RatifySpec
import Test.Cardano.Ledger.Conformance.Imp.Core
import Test.Cardano.Ledger.Conway.Imp.BbodySpec qualified as Bbody
import Test.Cardano.Ledger.Conway.Imp.CertsSpec qualified as Certs
import Test.Cardano.Ledger.Conway.Imp.DelegSpec qualified as Deleg
import Test.Cardano.Ledger.Conway.Imp.EnactSpec qualified as Enact
import Test.Cardano.Ledger.Conway.Imp.EpochSpec qualified as Epoch
import Test.Cardano.Ledger.Conway.Imp.GovCertSpec qualified as GovCert
import Test.Cardano.Ledger.Conway.Imp.GovSpec qualified as Gov
import Test.Cardano.Ledger.Conway.Imp.LedgerSpec qualified as Ledger
import Test.Cardano.Ledger.Conway.Imp.RatifySpec qualified as Ratify
import Test.Cardano.Ledger.Conway.Imp.UtxoSpec qualified as Utxo
import Test.Cardano.Ledger.Conway.Imp.UtxosSpec qualified as Utxos
import Test.Cardano.Ledger.Conway.ImpTest
import Test.Cardano.Ledger.Imp.Common hiding (Args)
import UnliftIO (evaluateDeep)

spec :: Spec
spec :: Spec
spec = do
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Imp" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    forall t. ImpSpec t => SpecWith (ImpInit t) -> Spec
withImpInit @(LedgerSpec ConwayEra) (SpecWith (ImpInit (LedgerSpec ConwayEra)) -> Spec)
-> SpecWith (ImpInit (LedgerSpec ConwayEra)) -> Spec
forall a b. (a -> b) -> a -> b
$
      forall era.
(ShelleyEraImp era, ShelleyEraImp era) =>
Version
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
modifyImpInitProtVer @ConwayEra (forall (v :: Natural).
(KnownNat v, MinVersion <= v, v <= MaxVersion) =>
Version
natVersion @10) (SpecWith (ImpInit (LedgerSpec ConwayEra))
 -> SpecWith (ImpInit (LedgerSpec ConwayEra)))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a b. (a -> b) -> a -> b
$
        (forall t.
 Globals
 -> TRC (EraRule "LEDGER" ConwayEra)
 -> Either
      (NonEmpty (PredicateFailure (EraRule "LEDGER" ConwayEra)))
      (State (EraRule "LEDGER" ConwayEra),
       [Event (EraRule "LEDGER" ConwayEra)])
 -> ImpM t ())
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era.
(forall t.
 Globals
 -> TRC (EraRule "LEDGER" era)
 -> Either
      (NonEmpty (PredicateFailure (EraRule "LEDGER" era)))
      (State (EraRule "LEDGER" era), [Event (EraRule "LEDGER" era)])
 -> ImpM t ())
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
modifyImpInitPostSubmitTxHook Globals
-> TRC (EraRule "LEDGER" ConwayEra)
-> Either
     (NonEmpty (PredicateFailure (EraRule "LEDGER" ConwayEra)))
     (State (EraRule "LEDGER" ConwayEra),
      [Event (EraRule "LEDGER" ConwayEra)])
-> ImpM t ()
forall t.
Globals
-> TRC (EraRule "LEDGER" ConwayEra)
-> Either
     (NonEmpty (PredicateFailure (EraRule "LEDGER" ConwayEra)))
     (State (EraRule "LEDGER" ConwayEra),
      [Event (EraRule "LEDGER" ConwayEra)])
-> ImpM t ()
forall era t.
(ConwayEraImp era, ExecSpecRule "LEDGER" era,
 ExecContext "LEDGER" era ~ ConwayLedgerExecContext era,
 SpecTranslate (ExecContext "LEDGER" era) (TxWits era),
 HasCallStack, SpecRep (TxWits era) ~ TxWitnesses,
 SpecRep (TxBody TopTx era) ~ TxBody,
 SpecTranslate TxId (TxBody TopTx era),
 SpecTranslate (ConwayLedgerExecContext era) (Tx TopTx era),
 ToExpr (SpecRep (Tx TopTx era)),
 SpecNormalize (SpecState "LEDGER" era),
 Eq (SpecState "LEDGER" era)) =>
Globals
-> TRC (EraRule "LEDGER" era)
-> Either
     (NonEmpty (PredicateFailure (EraRule "LEDGER" era)))
     (State (EraRule "LEDGER" era), [Event (EraRule "LEDGER" era)])
-> ImpM t ()
submitTxConformanceHook (SpecWith (ImpInit (LedgerSpec ConwayEra))
 -> SpecWith (ImpInit (LedgerSpec ConwayEra)))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a b. (a -> b) -> a -> b
$ do
          (forall t.
 Globals
 -> TRC (EraRule "NEWEPOCH" ConwayEra)
 -> State (EraRule "NEWEPOCH" ConwayEra)
 -> ImpM t ())
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era.
(forall t.
 Globals
 -> TRC (EraRule "NEWEPOCH" era)
 -> State (EraRule "NEWEPOCH" era)
 -> ImpM t ())
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
modifyImpInitPostEpochBoundaryHook Globals
-> TRC (EraRule "NEWEPOCH" ConwayEra)
-> State (EraRule "NEWEPOCH" ConwayEra)
-> ImpM t ()
forall t.
Globals
-> TRC (EraRule "NEWEPOCH" ConwayEra)
-> State (EraRule "NEWEPOCH" ConwayEra)
-> ImpM t ()
forall era t.
(ShelleyEraImp era, ExecSpecRule "NEWEPOCH" era,
 ExecContext "NEWEPOCH" era ~ (),
 ToExpr (Event (EraRule "NEWEPOCH" era))) =>
Globals
-> TRC (EraRule "NEWEPOCH" era)
-> State (EraRule "NEWEPOCH" era)
-> ImpM t ()
epochBoundaryConformanceHook (SpecWith (ImpInit (LedgerSpec ConwayEra))
 -> SpecWith (ImpInit (LedgerSpec ConwayEra)))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a b. (a -> b) -> a -> b
$ do
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Basic" (SpecWith (ImpInit (LedgerSpec ConwayEra))
 -> SpecWith (ImpInit (LedgerSpec ConwayEra)))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a b. (a -> b) -> a -> b
$ do
              String
-> ImpM (LedgerSpec ConwayEra) ()
-> SpecWith (Arg (ImpM (LedgerSpec ConwayEra) ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Submit constitution" (ImpM (LedgerSpec ConwayEra) ()
 -> SpecWith (Arg (ImpM (LedgerSpec ConwayEra) ())))
-> ImpM (LedgerSpec ConwayEra) ()
-> SpecWith (Arg (ImpM (LedgerSpec ConwayEra) ()))
forall a b. (a -> b) -> a -> b
$ do
                _ <- forall era.
ConwayEraImp era =>
StrictMaybe (GovPurposeId 'ConstitutionPurpose)
-> ImpTestM era GovActionId
submitConstitution @ConwayEra StrictMaybe (GovPurposeId 'ConstitutionPurpose)
forall a. StrictMaybe a
SNothing
                passNEpochs 2
              String
-> ImpM (LedgerSpec ConwayEra) ()
-> SpecWith (Arg (ImpM (LedgerSpec ConwayEra) ()))
forall a.
(HasCallStack, Example a) =>
String -> a -> SpecWith (Arg a)
it String
"Can elect a basic committee" (ImpM (LedgerSpec ConwayEra) ()
 -> SpecWith (Arg (ImpM (LedgerSpec ConwayEra) ())))
-> ImpM (LedgerSpec ConwayEra) ()
-> SpecWith (Arg (ImpM (LedgerSpec ConwayEra) ()))
forall a b. (a -> b) -> a -> b
$ do
                ImpM
  (LedgerSpec ConwayEra)
  (Credential DRepRole, Credential HotCommitteeRole,
   GovPurposeId 'CommitteePurpose)
-> ImpM (LedgerSpec ConwayEra) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ImpM
   (LedgerSpec ConwayEra)
   (Credential DRepRole, Credential HotCommitteeRole,
    GovPurposeId 'CommitteePurpose)
 -> ImpM (LedgerSpec ConwayEra) ())
-> ImpM
     (LedgerSpec ConwayEra)
     (Credential DRepRole, Credential HotCommitteeRole,
      GovPurposeId 'CommitteePurpose)
-> ImpM (LedgerSpec ConwayEra) ()
forall a b. (a -> b) -> a -> b
$ (Credential DRepRole, Credential HotCommitteeRole,
 GovPurposeId 'CommitteePurpose)
-> ImpM
     (LedgerSpec ConwayEra)
     (Credential DRepRole, Credential HotCommitteeRole,
      GovPurposeId 'CommitteePurpose)
forall (m :: * -> *) a. (MonadIO m, NFData a) => a -> m a
evaluateDeep ((Credential DRepRole, Credential HotCommitteeRole,
  GovPurposeId 'CommitteePurpose)
 -> ImpM
      (LedgerSpec ConwayEra)
      (Credential DRepRole, Credential HotCommitteeRole,
       GovPurposeId 'CommitteePurpose))
-> ImpM
     (LedgerSpec ConwayEra)
     (Credential DRepRole, Credential HotCommitteeRole,
      GovPurposeId 'CommitteePurpose)
-> ImpM
     (LedgerSpec ConwayEra)
     (Credential DRepRole, Credential HotCommitteeRole,
      GovPurposeId 'CommitteePurpose)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ImpM
  (LedgerSpec ConwayEra)
  (Credential DRepRole, Credential HotCommitteeRole,
   GovPurposeId 'CommitteePurpose)
forall era.
(HasCallStack, ConwayEraImp era) =>
ImpTestM
  era
  (Credential DRepRole, Credential HotCommitteeRole,
   GovPurposeId 'CommitteePurpose)
electBasicCommittee
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"BBODY" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era))
Bbody.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"CERTS" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era))
Certs.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"DELEG" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era))
Deleg.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"ENACT" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era.
(ConwayEraImp era,
 Event (EraRule "HARDFORK" era) ~ ConwayHardForkEvent era,
 Event (EraRule "EPOCH" era) ~ ConwayEpochEvent era,
 Event (EraRule "NEWEPOCH" era) ~ ConwayNewEpochEvent era) =>
SpecWith (ImpInit (LedgerSpec era))
Enact.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"EPOCH" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era.
(ConwayEraImp era,
 Event (EraRule "NEWEPOCH" era) ~ ConwayNewEpochEvent era,
 Event (EraRule "EPOCH" era) ~ ConwayEpochEvent era) =>
SpecWith (ImpInit (LedgerSpec era))
Epoch.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"GOV" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era))
Gov.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"GOVCERT" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era))
GovCert.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"LEDGER" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era))
Ledger.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"RATIFY" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era.
(HasCallStack, ConwayEraImp era) =>
SpecWith (ImpInit (LedgerSpec era))
Ratify.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"UTXO" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era))
Utxo.spec
            String
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
-> SpecWith (ImpInit (LedgerSpec ConwayEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"UTXOS" SpecWith (ImpInit (LedgerSpec ConwayEra))
forall era. ConwayEraImp era => SpecWith (ImpInit (LedgerSpec era))
Utxos.spec
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Imp (only spec)" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    RatifySpec.spec