{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Main where

import Cardano.Ledger.Alonzo (AlonzoEra)
import qualified Test.Cardano.Ledger.Alonzo.Binary.CanonicalSpec as Canonical
import qualified Test.Cardano.Ledger.Alonzo.Binary.CddlSpec as CddlSpec
import qualified Test.Cardano.Ledger.Alonzo.Binary.CostModelsSpec as CostModelsSpec
import qualified Test.Cardano.Ledger.Alonzo.Binary.TxWitsSpec as TxWitsSpec
import qualified Test.Cardano.Ledger.Alonzo.BinarySpec as BinarySpec
import qualified Test.Cardano.Ledger.Alonzo.GoldenSpec as GoldenSpec
import qualified Test.Cardano.Ledger.Alonzo.GoldenTranslation as GoldenTranslation
import qualified Test.Cardano.Ledger.Alonzo.Imp as Imp
import qualified Test.Cardano.Ledger.Alonzo.Imp.TxInfoSpec as TxInfo
import Test.Cardano.Ledger.Alonzo.ImpTest ()
import Test.Cardano.Ledger.Common
import Test.Cardano.Ledger.Core.JSON (roundTripJsonEraSpec)
import Test.Cardano.Ledger.Era
import qualified Test.Cardano.Ledger.Shelley.Imp as Shelley
import Test.Cardano.Ledger.Shelley.JSON (roundTripJsonShelleyEraSpec)

instance EraSpec AlonzoEra where
  eraImpSpec :: Proxy AlonzoEra -> Spec
eraImpSpec Proxy AlonzoEra
era = do
    Proxy AlonzoEra -> Spec
forall era (proxy :: * -> *).
(ShelleyEraImp era, ShelleyEraAccounts era) =>
proxy era -> Spec
Shelley.shelleyEraSpecificSpec Proxy AlonzoEra
era
    Proxy AlonzoEra -> Spec
forall era (proxy :: * -> *).
(AlonzoEraImp era, ShelleyEraTxCert era) =>
proxy era -> Spec
Imp.alonzoEraSpecificSpec Proxy AlonzoEra
era
    Proxy AlonzoEra -> Spec
forall era (proxy :: * -> *).
(AlonzoEraImp era, Event (EraRule "RUPD" era) ~ RupdEvent) =>
proxy era -> Spec
Imp.spec Proxy AlonzoEra
era

main :: IO ()
IO ()
main =
  forall era. EraSpec era => Spec -> IO ()
ledgerEraTestMain @AlonzoEra (Spec -> IO ()) -> Spec -> IO ()
forall a b. (a -> b) -> a -> b
$ do
    Spec
BinarySpec.spec
    Spec
Canonical.spec
    Spec
CddlSpec.spec
    forall era. (HasCallStack, EraTest era) => Spec
roundTripJsonEraSpec @AlonzoEra
    forall era. ShelleyEraTest era => Spec
roundTripJsonShelleyEraSpec @AlonzoEra
    Spec
GoldenTranslation.tests
    Spec
GoldenSpec.spec
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"CostModels" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall era. (AlonzoEraPParams era, AlonzoEraScript era) => Spec
CostModelsSpec.spec @AlonzoEra
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"TxWits" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall era.
(EraPlutusContext era, Arbitrary (NativeScript era)) =>
Spec
TxWitsSpec.spec @AlonzoEra
    Spec
TxInfo.spec