{-# LANGUAGE TypeApplications #-}

import Cardano.Crypto.Libsodium (sodiumInit)
import Cardano.Ledger.Core
import Cardano.Ledger.Shelley.Rules (ShelleyLEDGER)
import System.Environment (lookupEnv)
import System.IO (hSetEncoding, stdout, utf8)
import Test.Cardano.Ledger.Shelley.ConcreteCryptoTypes (C)
import Test.Cardano.Ledger.Shelley.PropertyTests (commonTests)
import qualified Test.Cardano.Ledger.Shelley.Rewards as Rewards (tests)
import qualified Test.Cardano.Ledger.Shelley.Rules.AdaPreservation as AdaPreservation
import qualified Test.Cardano.Ledger.Shelley.Rules.ClassifyTraces as ClassifyTraces (
  onlyValidChainSignalsAreGenerated,
  relevantCasesAreCovered,
 )
import qualified Test.Cardano.Ledger.Shelley.Rules.Deposits as Deposits (tests)
import qualified Test.Cardano.Ledger.Shelley.RulesTests as RulesTests (
  chainExamples,
  multisigExamples,
  testTickF,
 )
import qualified Test.Cardano.Ledger.Shelley.SafeHash as SafeHash (safeHashTest)
import qualified Test.Cardano.Ledger.Shelley.Serialisation as Serialisation
import qualified Test.Cardano.Ledger.Shelley.UnitTests as UnitTests (unitTests)
import qualified Test.Cardano.Ledger.Shelley.WitVKeys as WitVKeys (tests)
import Test.Tasty
import Test.Tasty.QuickCheck (QuickCheckMaxRatio (..))

import Test.Cardano.Ledger.Shelley.Serialisation.EraIndepGenerators ()
import Test.QuickCheck (Args (maxSuccess), stdArgs)

main :: IO ()
IO ()
main = do
  Handle -> TextEncoding -> IO ()
hSetEncoding Handle
stdout TextEncoding
utf8
  IO ()
sodiumInit
  Maybe String
nightly <- String -> IO (Maybe String)
lookupEnv String
"NIGHTLY"
  TestTree -> IO ()
defaultMain forall a b. (a -> b) -> a -> b
$ case Maybe String
nightly of
    Maybe String
Nothing -> TestTree
defaultTests
    Just String
_ -> TestTree
nightlyTests

defaultTests :: TestTree
defaultTests :: TestTree
defaultTests =
  String -> [TestTree] -> TestTree
testGroup
    String
"Shelley tests"
    [ forall era.
(EraGen era, EraGov era, HasTrace (CHAIN era) (GenEnv era)) =>
TestTree
Deposits.tests @C
    , ( forall v. IsOption v => v -> TestTree -> TestTree
localOption
          (Int -> QuickCheckMaxRatio
QuickCheckMaxRatio Int
50)
          (forall era.
(EraGen era, ChainProperty era,
 HasTrace (CHAIN era) (GenEnv era)) =>
Int -> TestTree
ClassifyTraces.relevantCasesAreCovered @C (Args -> Int
maxSuccess Args
stdArgs))
      )
    , forall era ledger.
(EraGen era, TestingLedger era ledger, ChainProperty era,
 HasTrace (CHAIN era) (GenEnv era),
 GovState era ~ ShelleyGovState era) =>
Int -> TestTree
AdaPreservation.tests @C @(ShelleyLEDGER C) (Args -> Int
maxSuccess Args
stdArgs)
    , forall era.
(EraGen era, HasTrace (CHAIN era) (GenEnv era), EraGov era) =>
TestTree
ClassifyTraces.onlyValidChainSignalsAreGenerated @C
    , forall c.
(Crypto c, DSignable c (Hash c EraIndependentTxBody)) =>
TestTree
WitVKeys.tests @(EraCrypto C)
    , TestTree
Rewards.tests
    , TestTree
Serialisation.tests
    , TestTree
RulesTests.chainExamples
    , TestTree
RulesTests.multisigExamples
    , TestTree
RulesTests.testTickF
    , TestTree
UnitTests.unitTests
    , TestTree
SafeHash.safeHashTest
    ]

nightlyTests :: TestTree
nightlyTests :: TestTree
nightlyTests =
  String -> [TestTree] -> TestTree
testGroup
    String
"Shelley tests - nightly"
    forall a b. (a -> b) -> a -> b
$ TestTree
Serialisation.tests forall a. a -> [a] -> [a]
: forall era ledger.
(EraGen era, ChainProperty era, HasTrace (CHAIN era) (GenEnv era),
 HasTrace ledger (GenEnv era), Embed (EraRule "DELEGS" era) ledger,
 Embed (EraRule "UTXOW" era) ledger,
 Environment ledger ~ LedgerEnv era, BaseEnv ledger ~ Globals,
 BaseM ledger ~ ReaderT Globals Identity,
 State ledger ~ LedgerState era, Signal ledger ~ Tx era,
 GovState era ~ ShelleyGovState era) =>
[TestTree]
commonTests @C @(ShelleyLEDGER C)