{-# LANGUAGE TypeApplications #-}

module Test.Consensus.Shelley.SupportedNetworkProtocolVersion (tests) where

import Data.Proxy
import Data.SOP.BasicFunctors
import Data.SOP.Constraint
import Data.SOP.Strict
import Data.Typeable (Typeable)
import Ouroboros.Consensus.Cardano.Block
import Ouroboros.Consensus.Node.NetworkProtocolVersion
  ( SupportedNetworkProtocolVersion
  )
import Ouroboros.Consensus.Shelley.Ledger.SupportsProtocol ()
import Test.Tasty
import Test.Tasty.HUnit
import Test.Util.SupportedNetworkProtocolVersion

tests :: TestTree
tests :: TestTree
tests =
  TestName -> Assertion -> TestTree
testCase TestName
"Shelley exhaustive network protocol versions"
    (Assertion -> TestTree)
-> (NP Proxy (CardanoShelleyEras StandardCrypto) -> Assertion)
-> NP Proxy (CardanoShelleyEras StandardCrypto)
-> TestTree
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Assertion] -> Assertion
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
t (m a) -> m ()
sequence_
    ([Assertion] -> Assertion)
-> (NP Proxy (CardanoShelleyEras StandardCrypto) -> [Assertion])
-> NP Proxy (CardanoShelleyEras StandardCrypto)
-> Assertion
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NP (K Assertion) (CardanoShelleyEras StandardCrypto) -> [Assertion]
NP (K Assertion) (CardanoShelleyEras StandardCrypto)
-> CollapseTo NP Assertion
forall (xs :: [*]) a.
SListIN NP xs =>
NP (K a) xs -> CollapseTo NP a
forall k l (h :: (k -> *) -> l -> *) (xs :: l) a.
(HCollapse h, SListIN h xs) =>
h (K a) xs -> CollapseTo h a
hcollapse
    (NP (K Assertion) (CardanoShelleyEras StandardCrypto)
 -> [Assertion])
-> (NP Proxy (CardanoShelleyEras StandardCrypto)
    -> NP (K Assertion) (CardanoShelleyEras StandardCrypto))
-> NP Proxy (CardanoShelleyEras StandardCrypto)
-> [Assertion]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy (And Typeable SupportedNetworkProtocolVersion)
-> (forall a.
    And Typeable SupportedNetworkProtocolVersion a =>
    Proxy a -> K Assertion a)
-> NP Proxy (CardanoShelleyEras StandardCrypto)
-> NP (K Assertion) (CardanoShelleyEras StandardCrypto)
forall {k} {l} (h :: (k -> *) -> l -> *) (c :: k -> Constraint)
       (xs :: l) (proxy :: (k -> Constraint) -> *) (f :: k -> *)
       (f' :: k -> *).
(AllN (Prod h) c xs, HAp h) =>
proxy c
-> (forall (a :: k). c a => f a -> f' a) -> h f xs -> h f' xs
hcmap
      (forall {k} (t :: k). Proxy t
forall (t :: * -> Constraint). Proxy t
Proxy @(And Typeable SupportedNetworkProtocolVersion))
      (Assertion -> K Assertion a
forall k a (b :: k). a -> K a b
K (Assertion -> K Assertion a)
-> (Proxy a -> Assertion) -> Proxy a -> K Assertion a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy a -> Assertion
forall blk.
(Typeable blk, SupportedNetworkProtocolVersion blk) =>
Proxy blk -> Assertion
exhaustiveSupportedNetworkProtocolVersions)
    (NP Proxy (CardanoShelleyEras StandardCrypto) -> TestTree)
-> NP Proxy (CardanoShelleyEras StandardCrypto) -> TestTree
forall a b. (a -> b) -> a -> b
$ NP Proxy (CardanoShelleyEras StandardCrypto)
shelleyBlocks
 where
  shelleyBlocks :: NP Proxy (CardanoShelleyEras StandardCrypto)
  shelleyBlocks :: NP Proxy (CardanoShelleyEras StandardCrypto)
shelleyBlocks = (forall a. Proxy a) -> NP Proxy (CardanoShelleyEras StandardCrypto)
forall (xs :: [*]) (f :: * -> *).
SListIN NP xs =>
(forall a. f a) -> NP f xs
forall k l (h :: (k -> *) -> l -> *) (xs :: l) (f :: k -> *).
(HPure h, SListIN h xs) =>
(forall (a :: k). f a) -> h f xs
hpure Proxy a
forall a. Proxy a
forall {k} (t :: k). Proxy t
Proxy