module Test.Cardano.Network.OrphanInstances.Tests (tests) where

import Data.Aeson
import Data.Aeson.Types (parse)

import Ouroboros.Network.Diffusion.Topology
import Ouroboros.Network.PeerSelection.LedgerPeers.Type (AfterSlot (..),
           UseLedgerPeers (..))

import Cardano.Network.OrphanInstances ()
import Cardano.Network.PeerSelection.Bootstrap
import Cardano.Network.PeerSelection.PeerTrustable
import Cardano.Network.Protocol.Handshake.Test hiding (tests)
import Cardano.Slotting.Slot (SlotNo (..))

import Test.Cardano.Network.PeerSelection.Instances ()
import Test.Tasty
import Test.Tasty.QuickCheck

tests :: TestTree
tests :: TestTree
tests = TestName -> [TestTree] -> TestTree
testGroup TestName
"Cardano.Network.OrphanInstances"
        [ TestName -> (ArbitraryNodeToNodeVersion -> Property) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"NodeToNodeVersion" ArbitraryNodeToNodeVersion -> Property
prop_json_NodeToNodeVersion
        , TestName -> (ArbitraryNodeToClientVersion -> Property) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"NodeToClientVersion" ArbitraryNodeToClientVersion -> Property
prop_json_NodeToClientVersion
        , TestName
-> (NetworkTopology UseBootstrapPeers PeerTrustable -> Property)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"NetworkTopology" NetworkTopology UseBootstrapPeers PeerTrustable -> Property
prop_json_NetworkTopology
        ]


prop_json_NetworkTopology :: NetworkTopology UseBootstrapPeers PeerTrustable -> Property
prop_json_NetworkTopology :: NetworkTopology UseBootstrapPeers PeerTrustable -> Property
prop_json_NetworkTopology NetworkTopology UseBootstrapPeers PeerTrustable
topo =
  (NetworkTopology UseBootstrapPeers PeerTrustable
 -> Parser (NetworkTopology UseBootstrapPeers PeerTrustable))
-> NetworkTopology UseBootstrapPeers PeerTrustable
-> Result (NetworkTopology UseBootstrapPeers PeerTrustable)
forall a b. (a -> Parser b) -> a -> Result b
parse (Value -> Parser (NetworkTopology UseBootstrapPeers PeerTrustable)
forall a. FromJSON a => Value -> Parser a
parseJSON (Value -> Parser (NetworkTopology UseBootstrapPeers PeerTrustable))
-> (NetworkTopology UseBootstrapPeers PeerTrustable -> Value)
-> NetworkTopology UseBootstrapPeers PeerTrustable
-> Parser (NetworkTopology UseBootstrapPeers PeerTrustable)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NetworkTopology UseBootstrapPeers PeerTrustable -> Value
forall a. ToJSON a => a -> Value
toJSON) NetworkTopology UseBootstrapPeers PeerTrustable
topo
    Result (NetworkTopology UseBootstrapPeers PeerTrustable)
-> Result (NetworkTopology UseBootstrapPeers PeerTrustable)
-> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== NetworkTopology UseBootstrapPeers PeerTrustable
-> Result (NetworkTopology UseBootstrapPeers PeerTrustable)
forall a. a -> Result a
Data.Aeson.Success (NetworkTopology UseBootstrapPeers PeerTrustable
-> NetworkTopology UseBootstrapPeers PeerTrustable
forall {extraConfig} {extraFlags}.
NetworkTopology extraConfig extraFlags
-> NetworkTopology extraConfig extraFlags
translate NetworkTopology UseBootstrapPeers PeerTrustable
topo)
  where
    translate :: NetworkTopology extraConfig extraFlags
-> NetworkTopology extraConfig extraFlags
translate
      nt :: NetworkTopology extraConfig extraFlags
nt@(NetworkTopology {useLedgerPeers :: forall extraConfig extraFlags.
NetworkTopology extraConfig extraFlags -> UseLedgerPeers
useLedgerPeers = UseLedgerPeers (After (SlotNo Word64
0))})
      = NetworkTopology extraConfig extraFlags
nt {useLedgerPeers = UseLedgerPeers Always}
    translate NetworkTopology extraConfig extraFlags
nt = NetworkTopology extraConfig extraFlags
nt


prop_json_NodeToNodeVersion
  :: ArbitraryNodeToNodeVersion
  -> Property
prop_json_NodeToNodeVersion :: ArbitraryNodeToNodeVersion -> Property
prop_json_NodeToNodeVersion (ArbitraryNodeToNodeVersion NodeToNodeVersion
v) =
  case ByteString -> Either TestName NodeToNodeVersion
forall a. FromJSON a => ByteString -> Either TestName a
eitherDecode (NodeToNodeVersion -> ByteString
forall a. ToJSON a => a -> ByteString
encode NodeToNodeVersion
v) of
    Right NodeToNodeVersion
v' -> NodeToNodeVersion
v NodeToNodeVersion -> NodeToNodeVersion -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== NodeToNodeVersion
v'
    Left  TestName
e  -> TestName -> Bool -> Property
forall prop. Testable prop => TestName -> prop -> Property
counterexample TestName
e Bool
False


prop_json_NodeToClientVersion
  :: ArbitraryNodeToClientVersion
  -> Property
prop_json_NodeToClientVersion :: ArbitraryNodeToClientVersion -> Property
prop_json_NodeToClientVersion (ArbitraryNodeToClientVersion NodeToClientVersion
v) =
  case ByteString -> Either TestName NodeToClientVersion
forall a. FromJSON a => ByteString -> Either TestName a
eitherDecode (NodeToClientVersion -> ByteString
forall a. ToJSON a => a -> ByteString
encode NodeToClientVersion
v) of
    Right NodeToClientVersion
v' -> NodeToClientVersion
v NodeToClientVersion -> NodeToClientVersion -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== NodeToClientVersion
v'
    Left  TestName
e  -> TestName -> Bool -> Property
forall prop. Testable prop => TestName -> prop -> Property
counterexample TestName
e Bool
False