{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}

module Test.Cardano.Ledger.Conway.Spec (spec) where

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.Babbage.TxInfoSpec as BabbageTxInfo
import Test.Cardano.Ledger.Common
import qualified Test.Cardano.Ledger.Conway.Binary.Golden as Golden
import qualified Test.Cardano.Ledger.Conway.Binary.Regression as Regression
import qualified Test.Cardano.Ledger.Conway.BinarySpec as Binary
import qualified Test.Cardano.Ledger.Conway.CommitteeRatifySpec as CommitteeRatify
import qualified Test.Cardano.Ledger.Conway.DRepRatifySpec as DRepRatify
import Test.Cardano.Ledger.Conway.ImpTest (ConwayEraImp)
import qualified Test.Cardano.Ledger.Conway.Proposals as Proposals
import qualified Test.Cardano.Ledger.Conway.SPORatifySpec as SPORatifySpec
import Test.Cardano.Ledger.Core.JSON (roundTripJsonEraSpec)

spec :: forall era. ConwayEraImp era => Spec
spec :: forall era. ConwayEraImp era => Spec
spec =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Conway features" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    forall era. ConwayEraTest era => Spec
Proposals.spec @era
    forall era. ConwayEraImp era => Spec
Binary.spec @era
    forall era. ConwayEraTest era => Spec
DRepRatify.spec @era
    forall era. ConwayEraTest era => Spec
CommitteeRatify.spec @era
    forall era. ConwayEraTest era => Spec
SPORatifySpec.spec @era
    forall era. (HasCallStack, EraTest era) => Spec
roundTripJsonEraSpec @era
    forall era. ConwayEraTest era => Spec
Golden.spec @era
    forall era. ConwayEraTest era => Spec
Golden.goldenListRedeemers @era
    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 @era
    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 @era
    forall era. EraTx era => Spec
Regression.spec @era
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"TxInfo" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      forall era. BabbageEraImp era => Spec
BabbageTxInfo.spec @era