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

module Test.Cardano.Ledger.Alonzo.Imp where

import Cardano.Ledger.Alonzo (AlonzoEra)
import Cardano.Ledger.Shelley.Core (ShelleyEraTxCert)
import qualified Test.Cardano.Ledger.Alonzo.Imp.UtxoSpec as Utxo
import qualified Test.Cardano.Ledger.Alonzo.Imp.UtxosSpec as Utxos
import qualified Test.Cardano.Ledger.Alonzo.Imp.UtxowSpec as Utxow
import Test.Cardano.Ledger.Alonzo.ImpTest
import Test.Cardano.Ledger.Imp.Common
import qualified Test.Cardano.Ledger.Mary.Imp as MaryImp
import qualified Test.Cardano.Ledger.Shelley.Imp as ShelleyImp

spec ::
  forall era.
  ( AlonzoEraImp era
  , EraSpecificSpec era
  ) =>
  Spec
spec :: forall era. (AlonzoEraImp era, EraSpecificSpec era) => Spec
spec = do
  forall era. (MaryEraImp era, EraSpecificSpec era) => Spec
MaryImp.spec @era
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"AlonzoImpSpec" (Spec -> Spec)
-> (SpecWith (ImpInit (LedgerSpec era)) -> Spec)
-> SpecWith (ImpInit (LedgerSpec era))
-> Spec
forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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
$ do
    SpecWith (ImpInit (LedgerSpec era))
forall era. AlonzoEraImp era => SpecWith (ImpInit (LedgerSpec era))
Utxo.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era. AlonzoEraImp era => SpecWith (ImpInit (LedgerSpec era))
Utxos.spec
    SpecWith (ImpInit (LedgerSpec era))
forall era. AlonzoEraImp era => SpecWith (ImpInit (LedgerSpec era))
Utxow.spec

alonzoEraSpecificSpec ::
  forall era.
  (AlonzoEraImp era, ShelleyEraTxCert era) =>
  SpecWith (ImpInit (LedgerSpec era))
alonzoEraSpecificSpec :: forall era.
(AlonzoEraImp era, ShelleyEraTxCert era) =>
SpecWith (ImpInit (LedgerSpec era))
alonzoEraSpecificSpec = do
  String
-> SpecWith (ImpInit (LedgerSpec era))
-> SpecWith (ImpInit (LedgerSpec era))
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Alonzo 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
"Certificates without deposits" (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, ShelleyEraTxCert era) =>
SpecWith (ImpInit (LedgerSpec era))
Utxow.alonzoEraSpecificSpec

instance EraSpecificSpec AlonzoEra where
  eraSpecificSpec :: SpecWith (ImpInit (LedgerSpec AlonzoEra))
eraSpecificSpec =
    SpecWith (ImpInit (LedgerSpec AlonzoEra))
forall era.
(ShelleyEraImp era,
 InjectRuleFailure "LEDGER" ShelleyDelegsPredFailure era) =>
SpecWith (ImpInit (LedgerSpec era))
ShelleyImp.shelleyEraSpecificSpec SpecWith (ImpInit (LedgerSpec AlonzoEra))
-> SpecWith (ImpInit (LedgerSpec AlonzoEra))
-> SpecWith (ImpInit (LedgerSpec AlonzoEra))
forall a b.
SpecM (ImpInit (LedgerSpec AlonzoEra)) a
-> SpecM (ImpInit (LedgerSpec AlonzoEra)) b
-> SpecM (ImpInit (LedgerSpec AlonzoEra)) b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> SpecWith (ImpInit (LedgerSpec AlonzoEra))
forall era.
(AlonzoEraImp era, ShelleyEraTxCert era) =>
SpecWith (ImpInit (LedgerSpec era))
alonzoEraSpecificSpec