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

module Test.Cardano.Ledger.Shelley.Imp (spec, shelleyToBabbageSpec) where

import Cardano.Ledger.Core (EraRule)
import Cardano.Ledger.Shelley.Rules (RupdEvent)
import Cardano.Ledger.Shelley.State (ShelleyEraAccounts)
import Control.State.Transition (Event)
import Test.Cardano.Ledger.Imp.Common
import qualified Test.Cardano.Ledger.Shelley.Imp.DelegSpec as DELEG
import qualified Test.Cardano.Ledger.Shelley.Imp.EpochSpec as EPOCH
import qualified Test.Cardano.Ledger.Shelley.Imp.LedgerSpec as LEDGER
import qualified Test.Cardano.Ledger.Shelley.Imp.PoolSpec as POOL
import qualified Test.Cardano.Ledger.Shelley.Imp.UtxoSpec as UTXO
import qualified Test.Cardano.Ledger.Shelley.Imp.UtxowSpec as UTXOW
import Test.Cardano.Ledger.Shelley.ImpTest
import qualified Test.Cardano.Ledger.Shelley.UnitTests.InstantStakeTest as Instant

spec ::
  forall proxy era.
  ( ShelleyEraImp era
  , Event (EraRule "RUPD" era) ~ RupdEvent
  ) =>
  proxy era ->
  Spec
spec :: forall (proxy :: * -> *) era.
(ShelleyEraImp era, Event (EraRule "RUPD" era) ~ RupdEvent) =>
proxy era -> Spec
spec proxy era
era = do
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"ShelleyEra 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.
ShelleyEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
DELEG.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
ShelleyEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
EPOCH.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
ShelleyEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
LEDGER.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
(ShelleyEraImp era, Event (EraRule "RUPD" era) ~ RupdEvent) =>
SpecWith (ImpInit (LedgerSpec era))
POOL.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
ShelleyEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
UTXOW.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
ShelleyEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
UTXO.spec
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"ShelleyEraPureTests" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    forall era. ShelleyEraImp era => Spec
Instant.spec @era

shelleyToBabbageSpec ::
  ( ShelleyEraImp era
  , ShelleyEraAccounts era
  ) =>
  proxy era ->
  Spec
shelleyToBabbageSpec :: forall era (proxy :: * -> *).
(ShelleyEraImp era, ShelleyEraAccounts era) =>
proxy era -> Spec
shelleyToBabbageSpec proxy era
era = 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
  String
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"ShelleyEra Specific" (SpecWith (ImpInit (LedgerSpec era))
 -> SpecWith (ImpInit (LedgerSpec era)))
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
forall a b. (a -> b) -> a -> b
$
    SpecWith (ImpInit (LedgerSpec era))
forall era.
(ShelleyEraImp era, ShelleyEraAccounts era) =>
SpecWith (ImpInit (LedgerSpec era))
DELEG.shelleyToBabbageSpec