{-# LANGUAGE NamedFieldPuns     #-}

{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications   #-}

module Test.Ouroboros.Network.PeerSelection.Cardano.LocalRootPeers (tests) where

import Data.Map.Strict qualified as Map

import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable)
import Ouroboros.Network.PeerSelection.State.LocalRootPeers
           (LocalRootPeers (..))
import Ouroboros.Network.PeerSelection.State.LocalRootPeers qualified as LocalRootPeers
import Test.Ouroboros.Network.PeerSelection.Cardano.Instances ()
import Test.Ouroboros.Network.PeerSelection.Instances (PeerAddr)
import Test.Ouroboros.Network.PeerSelection.LocalRootPeers ()
import Test.QuickCheck
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.QuickCheck (testProperty)

tests :: TestTree
tests :: TestTree
tests =
  TestName -> [TestTree] -> TestTree
testGroup TestName
"Ouroboros.Network.PeerSelection.Cardano"
  [ TestName -> [TestTree] -> TestTree
testGroup TestName
"LocalRootPeers"
    [ TestName
-> (LocalRootPeers PeerTrustable PeerAddr -> Property) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"clampToTrustable" LocalRootPeers PeerTrustable PeerAddr -> Property
prop_clampToTrustable
    ]
  ]

prop_clampToTrustable :: LocalRootPeers PeerTrustable PeerAddr -> Property
prop_clampToTrustable :: LocalRootPeers PeerTrustable PeerAddr -> Property
prop_clampToTrustable LocalRootPeers PeerTrustable PeerAddr
localRootPeers =

    let trustedPeers :: Set PeerAddr
trustedPeers = LocalRootPeers PeerTrustable PeerAddr -> Set PeerAddr
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr -> Set peeraddr
LocalRootPeers.keysSet
                     (LocalRootPeers PeerTrustable PeerAddr -> Set PeerAddr)
-> LocalRootPeers PeerTrustable PeerAddr -> Set PeerAddr
forall a b. (a -> b) -> a -> b
$ LocalRootPeers PeerTrustable PeerAddr
-> LocalRootPeers PeerTrustable PeerAddr
forall peeraddr.
Ord peeraddr =>
LocalRootPeers PeerTrustable peeraddr
-> LocalRootPeers PeerTrustable peeraddr
LocalRootPeers.clampToTrustable LocalRootPeers PeerTrustable PeerAddr
localRootPeers

     in TestName -> Bool -> Property
forall prop. Testable prop => TestName -> prop -> Property
counterexample (Map PeerAddr (LocalRootConfig PeerTrustable) -> TestName
forall a. Show a => a -> TestName
show (Map PeerAddr (LocalRootConfig PeerTrustable) -> TestName)
-> Map PeerAddr (LocalRootConfig PeerTrustable) -> TestName
forall a b. (a -> b) -> a -> b
$ Map PeerAddr (LocalRootConfig PeerTrustable)
-> Set PeerAddr -> Map PeerAddr (LocalRootConfig PeerTrustable)
forall k a. Ord k => Map k a -> Set k -> Map k a
Map.restrictKeys (LocalRootPeers PeerTrustable PeerAddr
-> Map PeerAddr (LocalRootConfig PeerTrustable)
forall extraFlags peeraddr.
LocalRootPeers extraFlags peeraddr
-> Map peeraddr (LocalRootConfig extraFlags)
LocalRootPeers.toMap LocalRootPeers PeerTrustable PeerAddr
localRootPeers) Set PeerAddr
trustedPeers)
      (Bool -> Property) -> Bool -> Property
forall a b. (a -> b) -> a -> b
$ (PeerAddr -> Bool) -> Set PeerAddr -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (PeerAddr -> LocalRootPeers PeerTrustable PeerAddr -> Bool
forall peeraddr.
Ord peeraddr =>
peeraddr -> LocalRootPeers PeerTrustable peeraddr -> Bool
`LocalRootPeers.isPeerTrustable` LocalRootPeers PeerTrustable PeerAddr
localRootPeers) Set PeerAddr
trustedPeers