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

module Test.Cardano.Ledger.Babbage.Imp (spec) where

import Cardano.Ledger.Babbage (BabbageEra)
import Cardano.Ledger.Babbage.Core
import Cardano.Ledger.Babbage.State
import Cardano.Ledger.Shelley.Rules
import qualified Test.Cardano.Ledger.Alonzo.Imp as AlonzoImp
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
import qualified Test.Cardano.Ledger.Shelley.Imp as ShelleyImp

spec ::
  forall era.
  ( BabbageEraImp era
  , EraSpecificSpec era
  , Event (EraRule "RUPD" era) ~ RupdEvent
  ) =>
  Spec
spec :: forall era.
(BabbageEraImp era, EraSpecificSpec era,
 Event (EraRule "RUPD" era) ~ RupdEvent) =>
Spec
spec = do
  forall era.
(AlonzoEraImp era, EraSpecificSpec era,
 Event (EraRule "RUPD" era) ~ RupdEvent) =>
Spec
AlonzoImp.spec @era
  forall era.
ShelleyEraImp era =>
SpecWith (ImpInit (LedgerSpec era)) -> Spec
withEachEraVersion @era (SpecWith (ImpInit (LedgerSpec era)) -> Spec)
-> SpecWith (ImpInit (LedgerSpec era)) -> Spec
forall a b. (a -> b) -> a -> b
$
    String
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"BabbageImpSpec - era generic tests" (SpecWith (ImpInit (LedgerSpec era))
 -> SpecWith (ImpInit (LedgerSpec era)))
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
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
      forall era.
BabbageEraImp era =>
SpecWith (ImpInit (LedgerSpec era))
Utxos.spec @era

babbageEraSpecificSpec ::
  forall era.
  ( BabbageEraImp era
  , ShelleyEraAccounts era
  , Event (EraRule "NEWEPOCH" era) ~ ShelleyNewEpochEvent era
  ) =>
  SpecWith (ImpInit (LedgerSpec era))
babbageEraSpecificSpec :: forall era.
(BabbageEraImp era, ShelleyEraAccounts era,
 Event (EraRule "NEWEPOCH" era) ~ ShelleyNewEpochEvent era) =>
SpecWith (ImpInit (LedgerSpec era))
babbageEraSpecificSpec = do
  String
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Babbage era specific Imp spec" (SpecWith (ImpInit (LedgerSpec era))
 -> SpecWith (ImpInit (LedgerSpec era)))
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
forall a b. (a -> b) -> a -> b
$
    String
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"POOL" SpecWith (ImpInit (LedgerSpec era))
forall era.
(BabbageEraImp era, ShelleyEraAccounts era,
 Event (EraRule "NEWEPOCH" era) ~ ShelleyNewEpochEvent era) =>
SpecWith (ImpInit (LedgerSpec era))
Pool.babbageEraSpecificSpec

instance EraSpecificSpec BabbageEra where
  eraSpecificSpec :: SpecWith (ImpInit (LedgerSpec BabbageEra))
eraSpecificSpec =
    SpecWith (ImpInit (LedgerSpec BabbageEra))
forall era.
(ShelleyEraImp era, ShelleyEraAccounts era) =>
SpecWith (ImpInit (LedgerSpec era))
ShelleyImp.shelleyEraSpecificSpec
      SpecWith (ImpInit (LedgerSpec BabbageEra))
-> SpecWith (ImpInit (LedgerSpec BabbageEra))
-> SpecWith (ImpInit (LedgerSpec BabbageEra))
forall a b.
SpecM (ImpInit (LedgerSpec BabbageEra)) a
-> SpecM (ImpInit (LedgerSpec BabbageEra)) b
-> SpecM (ImpInit (LedgerSpec BabbageEra)) b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SpecWith (ImpInit (LedgerSpec BabbageEra))
forall era.
(AlonzoEraImp era, ShelleyEraTxCert era) =>
SpecWith (ImpInit (LedgerSpec era))
AlonzoImp.alonzoEraSpecificSpec
      SpecWith (ImpInit (LedgerSpec BabbageEra))
-> SpecWith (ImpInit (LedgerSpec BabbageEra))
-> SpecWith (ImpInit (LedgerSpec BabbageEra))
forall a b.
SpecM (ImpInit (LedgerSpec BabbageEra)) a
-> SpecM (ImpInit (LedgerSpec BabbageEra)) b
-> SpecM (ImpInit (LedgerSpec BabbageEra)) b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SpecWith (ImpInit (LedgerSpec BabbageEra))
forall era.
(BabbageEraImp era, ShelleyEraAccounts era,
 Event (EraRule "NEWEPOCH" era) ~ ShelleyNewEpochEvent era) =>
SpecWith (ImpInit (LedgerSpec era))
babbageEraSpecificSpec