{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Main where

import Cardano.Ledger.Alonzo (AlonzoEra)
import Data.Proxy (Proxy (..))
import System.Environment (lookupEnv)
import qualified Test.Cardano.Ledger.Alonzo.ChainTrace as ChainTrace
import qualified Test.Cardano.Ledger.Alonzo.Golden as Golden
import Test.Cardano.Ledger.Alonzo.ImpTest ()
import Test.Cardano.Ledger.Common
import qualified Test.Cardano.Ledger.Shelley.PropertyTests as Shelley
import qualified Test.Cardano.Ledger.Shelley.Rules.AdaPreservation as AdaPreservation
import qualified Test.Cardano.Ledger.Shelley.Rules.IncrementalStake as IncrementalStake

main :: IO ()
IO ()
main = do
  Maybe String
nightly <- String -> IO (Maybe String)
lookupEnv String
"NIGHTLY"
  Spec -> IO ()
ledgerTestMain (Spec -> IO ()) -> Spec -> IO ()
forall a b. (a -> b) -> a -> b
$ case Maybe String
nightly of
    Maybe String
Nothing -> Spec
defaultTests
    Just String
_ -> Spec
nightlyTests

defaultTests :: Spec
defaultTests :: Spec
defaultTests =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Alonzo tests" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    forall era.
(EraGen era, EraStake era, ChainProperty era,
 HasTrace (CHAIN era) (GenEnv MockCrypto era),
 GovState era ~ ShelleyGovState era,
 State (EraRule "LEDGER" era) ~ LedgerState era,
 Signal (EraRule "LEDGER" era) ~ Tx era,
 Environment (EraRule "LEDGER" era) ~ LedgerEnv era,
 BaseM (EraRule "LEDGER" era) ~ ShelleyBase,
 STS (EraRule "LEDGER" era)) =>
Int -> Spec
AdaPreservation.tests @AlonzoEra Int
50
    Spec
Golden.tests

nightlyTests :: Spec
nightlyTests :: Spec
nightlyTests =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Alonzo tests - nightly" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Shelley common tests" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$
      [Spec] -> Spec
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_ ([Spec] -> Spec) -> [Spec] -> Spec
forall a b. (a -> b) -> a -> b
$
        forall era.
(EraGen era, EraStake era, ShelleyEraAccounts era, ApplyBlock era,
 GetLedgerView era, Embed (EraRule "BBODY" era) (CHAIN era),
 Embed (EraRule "TICK" era) (CHAIN era),
 Embed (EraRule "TICKN" era) (CHAIN era),
 HasTrace (EraRule "LEDGERS" era) (GenEnv MockCrypto era),
 State (EraRule "TICKN" era) ~ TicknState,
 Environment (EraRule "LEDGERS" era) ~ ShelleyLedgersEnv era,
 Environment (EraRule "TICKN" era) ~ TicknEnv,
 Signal (EraRule "LEDGERS" era) ~ Seq (Tx era),
 Signal (EraRule "TICKN" era) ~ Bool,
 BaseM (EraRule "LEDGERS" era) ~ ShelleyBase,
 AtMostEra "Alonzo" era, GovState era ~ ShelleyGovState era,
 InstantStake era ~ ShelleyInstantStake era,
 BaseEnv (EraRule "LEDGER" era) ~ Globals,
 HasTrace (EraRule "LEDGER" era) (GenEnv MockCrypto era),
 State (EraRule "TICK" era) ~ NewEpochState era,
 State (EraRule "LEDGER" era) ~ LedgerState era,
 BaseM (EraRule "LEDGER" era) ~ ShelleyBase,
 State (EraRule "BBODY" era) ~ ShelleyBbodyState era,
 Environment (EraRule "LEDGER" era) ~ LedgerEnv era,
 Environment (EraRule "TICK" era) ~ (),
 Signal (EraRule "LEDGER" era) ~ Tx era,
 State (EraRule "LEDGERS" era) ~ LedgerState era,
 Environment (EraRule "BBODY" era) ~ BbodyEnv era,
 Signal (EraRule "TICK" era) ~ SlotNo,
 Signal (EraRule "BBODY" era) ~ Block BHeaderView era) =>
[Spec]
Shelley.commonTests @AlonzoEra
    Proxy AlonzoEra -> Spec
forall era.
(EraGen era, EraGov era, EraStake era, ShelleyEraAccounts era,
 HasTrace (CHAIN era) (GenEnv MockCrypto era)) =>
Proxy era -> Spec
IncrementalStake.incrStakeComparisonTest (Proxy AlonzoEra
forall {k} (t :: k). Proxy t
Proxy :: Proxy AlonzoEra)
    Spec
ChainTrace.tests