{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}

module Test.Cardano.Ledger.Babbage.Imp (
  spec,
  Alonzo.shelleyToBabbageSpec,
  Alonzo.alonzoToConwaySpec,
  babbageOnlySpec,
) where

import Cardano.Ledger.Babbage.Core
import Cardano.Ledger.Babbage.State
import qualified Cardano.Ledger.Shelley.Rules as Shelley
import qualified Test.Cardano.Ledger.Alonzo.Imp as Alonzo
import Test.Cardano.Ledger.Alonzo.ImpTest
import qualified Test.Cardano.Ledger.Babbage.Imp.PoolSpec as POOL
import qualified Test.Cardano.Ledger.Babbage.Imp.UtxoSpec as UTXO
import qualified Test.Cardano.Ledger.Babbage.Imp.UtxosSpec as UTXOS
import qualified Test.Cardano.Ledger.Babbage.Imp.UtxowSpec as UTXOW
import Test.Cardano.Ledger.Babbage.ImpTest (BabbageEraImp)
import Test.Cardano.Ledger.Imp.Common

spec ::
  ( BabbageEraImp era
  , Shelley.Event (EraRule "RUPD" era) ~ Shelley.RupdEvent
  ) =>
  proxy era ->
  Spec
spec :: forall era (proxy :: * -> *).
(BabbageEraImp era, Event (EraRule "RUPD" era) ~ RupdEvent) =>
proxy era -> Spec
spec proxy era
era = do
  proxy era -> Spec
forall era (proxy :: * -> *).
(AlonzoEraImp era, Event (EraRule "RUPD" era) ~ RupdEvent) =>
proxy era -> Spec
Alonzo.spec proxy era
era
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"BabbageEra 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.
(AlonzoEraImp era, BabbageEraTxBody era,
 InjectRuleFailure "LEDGER" BabbageUtxoPredFailure era) =>
SpecWith (ImpInit (LedgerSpec era))
UTXO.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
BabbageEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
UTXOW.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era.
BabbageEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
UTXOS.spec

babbageOnlySpec ::
  ( BabbageEraImp era
  , ShelleyEraAccounts era
  , Shelley.Event (EraRule "NEWEPOCH" era) ~ Shelley.ShelleyNewEpochEvent era
  ) =>
  proxy era ->
  Spec
babbageOnlySpec :: forall era (proxy :: * -> *).
(BabbageEraImp era, ShelleyEraAccounts era,
 Event (EraRule "NEWEPOCH" era) ~ ShelleyNewEpochEvent era) =>
proxy era -> Spec
babbageOnlySpec proxy era
era = do
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"BabbageEra Specific" (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
    POOL.babbageEraSpecificSpec