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

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

import Cardano.Ledger.Babbage (BabbageEra)
import qualified Test.Cardano.Ledger.Alonzo.Imp as AlonzoImp
import Test.Cardano.Ledger.Alonzo.ImpTest
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 :: forall era. (BabbageEraImp era, EraSpecificSpec era) => Spec
spec :: forall era. (BabbageEraImp era, EraSpecificSpec era) => Spec
spec = do
  forall era. (AlonzoEraImp era, EraSpecificSpec era) => 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

instance EraSpecificSpec BabbageEra where
  eraSpecificSpec :: SpecWith (ImpInit (LedgerSpec BabbageEra))
eraSpecificSpec =
    SpecWith (ImpInit (LedgerSpec BabbageEra))
forall era.
(AlonzoEraImp era, ShelleyEraTxCert era) =>
SpecWith (ImpInit (LedgerSpec era))
AlonzoImp.alonzoEraSpecificSpec