{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Cardano.Ledger.Dijkstra.Imp where

import qualified Cardano.Ledger.Conway.Rules as Conway
import Cardano.Ledger.Dijkstra
import Cardano.Ledger.Dijkstra.Core
import qualified Cardano.Ledger.Shelley.Rules as Shelley
import Control.State.Transition (Event)
import Data.Proxy
import Test.Cardano.Ledger.Common
import qualified Test.Cardano.Ledger.Conway.Imp as ConwayImp
import qualified Test.Cardano.Ledger.Dijkstra.Imp.BbodySpec as BBODY
import qualified Test.Cardano.Ledger.Dijkstra.Imp.CertSpec as CERT
import qualified Test.Cardano.Ledger.Dijkstra.Imp.EntitiesSpec as ENTITIES
import qualified Test.Cardano.Ledger.Dijkstra.Imp.LedgerSpec as LEDGER
import qualified Test.Cardano.Ledger.Dijkstra.Imp.MempoolSpec as MEMPOOL
import qualified Test.Cardano.Ledger.Dijkstra.Imp.PoolSpec as POOL
import qualified Test.Cardano.Ledger.Dijkstra.Imp.SnapSpec as SNAP
import qualified Test.Cardano.Ledger.Dijkstra.Imp.SubGovSpec as SUBGOV
import qualified Test.Cardano.Ledger.Dijkstra.Imp.SubLedgerSpec as SUBLEDGER
import qualified Test.Cardano.Ledger.Dijkstra.Imp.SubUtxoSpec as SUBUTXO
import qualified Test.Cardano.Ledger.Dijkstra.Imp.SubUtxowSpec as SUBUTXOW
import qualified Test.Cardano.Ledger.Dijkstra.Imp.UtxoSpec as UTXO
import qualified Test.Cardano.Ledger.Dijkstra.Imp.UtxowSpec as UTXOW
import Test.Cardano.Ledger.Dijkstra.ImpTest

spec ::
  ( DijkstraEraImp era
  , Event (EraRule "EPOCH" era) ~ Conway.ConwayEpochEvent era
  , Event (EraRule "NEWEPOCH" era) ~ Conway.ConwayNewEpochEvent era
  , Event (EraRule "HARDFORK" era) ~ Conway.ConwayHardForkEvent era
  , Event (EraRule "RUPD" era) ~ Shelley.RupdEvent
  ) =>
  proxy era ->
  Spec
spec :: forall era (proxy :: * -> *).
(DijkstraEraImp era,
 Event (EraRule "EPOCH" era) ~ ConwayEpochEvent era,
 Event (EraRule "NEWEPOCH" era) ~ ConwayNewEpochEvent era,
 Event (EraRule "HARDFORK" era) ~ ConwayHardForkEvent era,
 Event (EraRule "RUPD" era) ~ RupdEvent) =>
proxy era -> Spec
spec proxy era
era = do
  proxy era -> Spec
forall era (proxy :: * -> *).
(ConwayEraImp era,
 Event (EraRule "HARDFORK" era) ~ ConwayHardForkEvent era,
 Event (EraRule "EPOCH" era) ~ ConwayEpochEvent era,
 Event (EraRule "NEWEPOCH" era) ~ ConwayNewEpochEvent era,
 Event (EraRule "RUPD" era) ~ RupdEvent) =>
proxy era -> Spec
ConwayImp.spec proxy era
era
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"DijkstraEra Onwards" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ proxy era -> SpecWith (ImpInit (LedgerSpec era)) -> Spec
forall (proxy :: * -> *) era.
ShelleyEraImp era =>
proxy era -> SpecWith (ImpInit (LedgerSpec era)) -> Spec
withImpInitEachEraVersion proxy era
era (SpecWith (ImpInit (LedgerSpec era)) -> Spec)
-> SpecWith (ImpInit (LedgerSpec era)) -> Spec
forall a b. (a -> b) -> a -> b
$ do
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
BBODY.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
LEDGER.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
MEMPOOL.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
SUBLEDGER.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
CERT.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
ENTITIES.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
SUBGOV.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
POOL.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
SNAP.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
UTXOW.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
UTXO.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
SUBUTXO.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
DijkstraEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
SUBUTXOW.spec

dijkstraOnlySpec :: Spec
dijkstraOnlySpec :: Spec
dijkstraOnlySpec =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"DijkstraEra Specific" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ Proxy DijkstraEra
-> SpecWith (ImpInit (LedgerSpec DijkstraEra)) -> Spec
forall (proxy :: * -> *) era.
ShelleyEraImp era =>
proxy era -> SpecWith (ImpInit (LedgerSpec era)) -> Spec
withImpInitEachEraVersion (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @DijkstraEra) (SpecWith (ImpInit (LedgerSpec DijkstraEra)) -> Spec)
-> SpecWith (ImpInit (LedgerSpec DijkstraEra)) -> Spec
forall a b. (a -> b) -> a -> b
$ do
    POOL.dijkstraOnlySpec