module Main where

import Hydra.Prelude

import Hydra.API.ClientInputSpec qualified
import Hydra.API.HTTPServerSpec qualified
import Hydra.API.ServerOutputSpec qualified
import Hydra.API.ServerSpec qualified
import Hydra.BehaviorSpec qualified
import Hydra.CBORSpec qualified
import Hydra.Chain.BlockfrostSpec qualified
import Hydra.Chain.Direct.HandlersSpec qualified
import Hydra.Chain.Direct.ScriptRegistrySpec qualified
import Hydra.Chain.Direct.StateSpec qualified
import Hydra.Chain.Direct.TimeHandleSpec qualified
import Hydra.Chain.Direct.TxSpec qualified
import Hydra.Chain.Direct.TxTraceSpec qualified
import Hydra.Chain.Direct.WalletSpec qualified
import Hydra.Chain.ScriptRegistrySpec qualified
import Hydra.ConfigSpec qualified
import Hydra.CryptoSpec qualified
import Hydra.Events.RotationSpec qualified
import Hydra.Events.S3Spec qualified
import Hydra.Events.SQLiteBasedSpec qualified
import Hydra.Events.UDPSpec qualified
import Hydra.HeadLogic.OutcomeSpec qualified
import Hydra.HeadLogicSnapshotSpec qualified
import Hydra.HeadLogicSpec qualified
import Hydra.JSONSchemaSpec qualified
import Hydra.Ledger.Cardano.TimeSpec qualified
import Hydra.Ledger.CardanoSpec qualified
import Hydra.Ledger.SimpleSpec qualified
import Hydra.Logging.MonitoringSpec qualified
import Hydra.LoggingSpec qualified
import Hydra.Model.MockChainSpec qualified
import Hydra.ModelSpec qualified
import Hydra.Network.AuthenticateSpec qualified
import Hydra.NetworkSpec qualified
import Hydra.NetworkVersionsSpec qualified
import Hydra.Node.InputQueueSpec qualified
import Hydra.Node.RunSpec qualified
import Hydra.Node.UtilSpec qualified
import Hydra.NodeSpec qualified
import Hydra.OffChainAgreementSpec qualified
import Hydra.OffChainLeaderSpec qualified
import Hydra.OptionsSpec qualified
import Hydra.PartySpec qualified
import Hydra.PersistentQueueSpec qualified
import Hydra.UtilsSpec qualified
import Test.Hydra.TastyMain (defaultMainHydra, testSpec, testSpecs)
import Test.Tasty (DependencyType (AllFinish), after, dependentTestGroup)

main :: IO ()
IO ()
main =
  TestName -> [IO TestTree] -> IO ()
defaultMainHydra
    TestName
"hydra-node"
    [ TestName -> Spec -> IO TestTree
testSpec TestName
"API.ClientInput" Spec
Hydra.API.ClientInputSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"API.HTTPServer" Spec
Hydra.API.HTTPServerSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"API.ServerOutput" Spec
Hydra.API.ServerOutputSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"API.Server" Spec
Hydra.API.ServerSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Behavior" Spec
Hydra.BehaviorSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"CBOR" Spec
Hydra.CBORSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Chain.Blockfrost" Spec
Hydra.Chain.BlockfrostSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Chain.Direct.Handlers" Spec
Hydra.Chain.Direct.HandlersSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Chain.Direct.ScriptRegistry" Spec
Hydra.Chain.Direct.ScriptRegistrySpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Chain.Direct.State" Spec
Hydra.Chain.Direct.StateSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Chain.Direct.TimeHandle" Spec
Hydra.Chain.Direct.TimeHandleSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Chain.Direct.Tx" Spec
Hydra.Chain.Direct.TxSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Chain.Direct.TxTrace" Spec
Hydra.Chain.Direct.TxTraceSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Chain.Direct.Wallet" Spec
Hydra.Chain.Direct.WalletSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Chain.ScriptRegistry" Spec
Hydra.Chain.ScriptRegistrySpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Config" Spec
Hydra.ConfigSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Crypto" Spec
Hydra.CryptoSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Events.Rotation" Spec
Hydra.Events.RotationSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Events.S3" Spec
Hydra.Events.S3Spec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Events.SQLiteBased" Spec
Hydra.Events.SQLiteBasedSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Events.UDP" Spec
Hydra.Events.UDPSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"HeadLogic.Outcome" Spec
Hydra.HeadLogic.OutcomeSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"HeadLogicSnapshot" Spec
Hydra.HeadLogicSnapshotSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"HeadLogic" Spec
Hydra.HeadLogicSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"JSONSchema" Spec
Hydra.JSONSchemaSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Ledger.Cardano" Spec
Hydra.Ledger.CardanoSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Ledger.Cardano.Time" Spec
Hydra.Ledger.Cardano.TimeSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Ledger.Simple" Spec
Hydra.Ledger.SimpleSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Logging.Monitoring" Spec
Hydra.Logging.MonitoringSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Logging" Spec
Hydra.LoggingSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Model.MockChain" Spec
Hydra.Model.MockChainSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Model" Spec
Hydra.ModelSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Network.Authenticate" Spec
Hydra.Network.AuthenticateSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Network" Spec
Hydra.NetworkSpec.spec
    , -- Runs last: these tests spawn etcd clusters and are the slowest here.
      --
      -- 'dependentTestGroup' runs them one at a time. They must not overlap
      -- (see 'Hydra.NetworkSpec.etcdSpec'), and it is the only mechanism that
      -- works here: hspec's 'sequential' is discarded by tasty-hspec, and
      -- tasty honours 'NumThreads' only at the top level, where setting it to
      -- 1 would serialise the whole suite. See
      -- https://github.com/UnkindPartition/tasty/issues/406.
      --
      -- 'testSpecs' rather than 'testSpec' because the group only sequences
      -- its direct children, so the tests have to be the children themselves
      -- rather than sit one level down inside a nested group.
      DependencyType -> TestName -> TestTree -> TestTree
after DependencyType
AllFinish TestName
"$2 != \"Network.Etcd\"" (TestTree -> TestTree)
-> ([TestTree] -> TestTree) -> [TestTree] -> TestTree
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TestName -> DependencyType -> [TestTree] -> TestTree
dependentTestGroup TestName
"Network.Etcd" DependencyType
AllFinish
        ([TestTree] -> TestTree) -> IO [TestTree] -> IO TestTree
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Spec -> IO [TestTree]
testSpecs Spec
Hydra.NetworkSpec.etcdSpec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"NetworkVersions" Spec
Hydra.NetworkVersionsSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Node.InputQueue" Spec
Hydra.Node.InputQueueSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Node.Run" Spec
Hydra.Node.RunSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Node.Util" Spec
Hydra.Node.UtilSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Node" Spec
Hydra.NodeSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"OffChainAgreement" Spec
Hydra.OffChainAgreementSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"OffChainLeader" Spec
Hydra.OffChainLeaderSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Options" Spec
Hydra.OptionsSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Party" Spec
Hydra.PartySpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"PersistentQueue" Spec
Hydra.PersistentQueueSpec.spec
    , TestName -> Spec -> IO TestTree
testSpec TestName
"Utils" Spec
Hydra.UtilsSpec.spec
    ]