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

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

import Cardano.Ledger.BaseTypes
import Cardano.Ledger.Dijkstra (DijkstraEra)
import Cardano.Ledger.Dijkstra.Tx (Tx (..))
import Test.Cardano.Ledger.Conformance.ExecSpecRule.Dijkstra ()
import Test.Cardano.Ledger.Conformance.Imp.Core
import Test.Cardano.Ledger.Dijkstra.Imp.CertSpec qualified as CERT
import Test.Cardano.Ledger.Dijkstra.Imp.CertsSpec qualified as CERTS
import Test.Cardano.Ledger.Dijkstra.Imp.LedgerSpec qualified as LEDGER
import Test.Cardano.Ledger.Dijkstra.Imp.UtxoSpec qualified as UTXO
import Test.Cardano.Ledger.Dijkstra.Imp.UtxowSpec qualified as UTXOW
import Test.Cardano.Ledger.Dijkstra.ImpTest
import Test.Cardano.Ledger.Imp.Common hiding (Args)

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 DijkstraEra) (SpecWith (ImpInit (LedgerSpec DijkstraEra)) -> Spec)
-> SpecWith (ImpInit (LedgerSpec DijkstraEra)) -> Spec
forall a b. (a -> b) -> a -> b
$
      forall era.
(ShelleyEraImp era, ShelleyEraImp era) =>
Version
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
modifyImpInitProtVer @DijkstraEra (forall (v :: Natural).
(KnownNat v, MinVersion <= v, v <= MaxVersion) =>
Version
natVersion @11) (SpecWith (ImpInit (LedgerSpec DijkstraEra))
 -> SpecWith (ImpInit (LedgerSpec DijkstraEra)))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall a b. (a -> b) -> a -> b
$
        (forall t.
 Globals
 -> TRC (EraRule "LEDGER" DijkstraEra)
 -> Either
      (NonEmpty (PredicateFailure (EraRule "LEDGER" DijkstraEra)))
      (State (EraRule "LEDGER" DijkstraEra),
       [Event (EraRule "LEDGER" DijkstraEra)])
 -> ImpM t ())
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
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" DijkstraEra)
-> Either
     (NonEmpty (PredicateFailure (EraRule "LEDGER" DijkstraEra)))
     (State (EraRule "LEDGER" DijkstraEra),
      [Event (EraRule "LEDGER" DijkstraEra)])
-> ImpM t ()
forall t.
Globals
-> TRC (EraRule "LEDGER" DijkstraEra)
-> Either
     (NonEmpty (PredicateFailure (EraRule "LEDGER" DijkstraEra)))
     (State (EraRule "LEDGER" DijkstraEra),
      [Event (EraRule "LEDGER" DijkstraEra)])
-> ImpM t ()
forall era t.
(HasCallStack, ExecSpecTopLevelRule "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 DijkstraEra))
 -> SpecWith (ImpInit (LedgerSpec DijkstraEra)))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall a b. (a -> b) -> a -> b
$ do
          (forall t.
 Globals
 -> TRC (EraRule "NEWEPOCH" DijkstraEra)
 -> State (EraRule "NEWEPOCH" DijkstraEra)
 -> ImpM t ())
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
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" DijkstraEra)
-> State (EraRule "NEWEPOCH" DijkstraEra)
-> ImpM t ()
forall t.
Globals
-> TRC (EraRule "NEWEPOCH" DijkstraEra)
-> State (EraRule "NEWEPOCH" DijkstraEra)
-> ImpM t ()
forall era t.
(ExecSpecTopLevelRule "NEWEPOCH" era,
 ToExpr (Event (EraRule "NEWEPOCH" era))) =>
Globals
-> TRC (EraRule "NEWEPOCH" era)
-> State (EraRule "NEWEPOCH" era)
-> ImpM t ()
epochBoundaryConformanceHook (SpecWith (ImpInit (LedgerSpec DijkstraEra))
 -> SpecWith (ImpInit (LedgerSpec DijkstraEra)))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall a b. (a -> b) -> a -> b
$ do
            String
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"LEDGER" SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
LEDGER.spec
            String
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"CERT" SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
CERT.spec
            String
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"CERTS" SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
CERTS.spec
            String
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"UTXOW" SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
UTXOW.spec
            String
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
-> SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
xdescribe String
"UTXO" SpecWith (ImpInit (LedgerSpec DijkstraEra))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
UTXO.spec