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

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

import Cardano.Ledger.Core
import Cardano.Ledger.Mary (MaryEra)
import Cardano.Ledger.Shelley.Rules
import qualified Test.Cardano.Ledger.Allegra.Imp as AllegraImp
import Test.Cardano.Ledger.Imp.Common
import qualified Test.Cardano.Ledger.Mary.Imp.UtxoSpec as Utxo
import Test.Cardano.Ledger.Mary.ImpTest
import qualified Test.Cardano.Ledger.Shelley.Imp as ShelleyImp

spec ::
  forall era.
  ( MaryEraImp era
  , EraSpecificSpec era
  , Event (EraRule "RUPD" era) ~ RupdEvent
  ) =>
  Spec
spec :: forall era.
(MaryEraImp era, EraSpecificSpec era,
 Event (EraRule "RUPD" era) ~ RupdEvent) =>
Spec
spec = do
  forall era.
(ShelleyEraImp era, EraSpecificSpec era,
 Event (EraRule "RUPD" era) ~ RupdEvent) =>
Spec
AllegraImp.spec @era
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"MaryImpSpec" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$
    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
$
      SpecWith (ImpInit (LedgerSpec era))
forall era.
(HasCallStack, MaryEraImp era) =>
SpecWith (ImpInit (LedgerSpec era))
Utxo.spec

instance EraSpecificSpec MaryEra where
  eraSpecificSpec :: SpecWith (ImpInit (LedgerSpec MaryEra))
eraSpecificSpec = SpecWith (ImpInit (LedgerSpec MaryEra))
forall era.
(ShelleyEraImp era, ShelleyEraAccounts era) =>
SpecWith (ImpInit (LedgerSpec era))
ShelleyImp.shelleyEraSpecificSpec