{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Main where

import Cardano.Ledger.Allegra (AllegraEra)
import Cardano.Ledger.Alonzo (AlonzoEra)
import Cardano.Ledger.Mary (MaryEra)
import Cardano.Ledger.Shelley (ShelleyEra)
import Cardano.Protocol.Crypto (StandardCrypto)
import Cardano.Protocol.TPraos.BHeader (BHeader)
import Test.Cardano.Ledger.Common
import qualified Test.Cardano.Protocol.Binary.BinarySpec as Binary
import qualified Test.Cardano.Protocol.Binary.CddlSpec as Cddl
import Test.Cardano.Protocol.Binary.RoundTrip
import Test.Cardano.Protocol.TPraos.Arbitrary ()

main :: IO ()
IO ()
main =
  Spec -> IO ()
ledgerTestMain forall a b. (a -> b) -> a -> b
$
    forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"TPraos" forall a b. (a -> b) -> a -> b
$ do
      Spec
Cddl.spec
      Spec
Binary.spec
      forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"RoundTrip" forall a b. (a -> b) -> a -> b
$ do
        forall h era.
(Eq h, Show h, DecCBOR h, DecCBOR (Annotator h), EncCBOR h,
 EraSegWits era, DecCBOR (TxSeq era), Arbitrary (Block h era)) =>
Spec
roundTripBlockSpec @(BHeader StandardCrypto) @ShelleyEra
        forall h era.
(Eq h, Show h, DecCBOR h, DecCBOR (Annotator h), EncCBOR h,
 EraSegWits era, DecCBOR (TxSeq era), Arbitrary (Block h era)) =>
Spec
roundTripBlockSpec @(BHeader StandardCrypto) @AllegraEra
        forall h era.
(Eq h, Show h, DecCBOR h, DecCBOR (Annotator h), EncCBOR h,
 EraSegWits era, DecCBOR (TxSeq era), Arbitrary (Block h era)) =>
Spec
roundTripBlockSpec @(BHeader StandardCrypto) @MaryEra
        forall h era.
(Eq h, Show h, DecCBOR h, DecCBOR (Annotator h), EncCBOR h,
 EraSegWits era, DecCBOR (TxSeq era), Arbitrary (Block h era)) =>
Spec
roundTripBlockSpec @(BHeader StandardCrypto) @AlonzoEra