module Test.Cardano.Ledger.Shelley.WitVKeys (tests) where

import Cardano.Ledger.Core
import Data.List (nub, sort)
import Data.Set as Set (fromList, singleton)
import Test.Cardano.Ledger.Core.KeyPair (mkWitnessVKey)
import Test.Cardano.Ledger.Shelley.Serialisation.EraIndepGenerators ()
import Test.Cardano.Ledger.Shelley.Utils (RawSeed, mkKeyPair')
import Test.QuickCheck (conjoin, (===), (==>))
import Test.Tasty (TestTree)
import Test.Tasty.QuickCheck (testProperty)
import qualified Test.Tasty.QuickCheck as TQC

tests :: TestTree
tests :: TestTree
tests = String
-> (RawSeed
    -> SafeHash EraIndependentTxBody
    -> SafeHash EraIndependentTxBody
    -> Property)
-> TestTree
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> TestTree
testProperty String
"WitVKey does not brake containers due to invalid Ord" RawSeed
-> SafeHash EraIndependentTxBody
-> SafeHash EraIndependentTxBody
-> Property
witVKeysProp

witVKeysProp ::
  RawSeed ->
  SafeHash EraIndependentTxBody ->
  SafeHash EraIndependentTxBody ->
  TQC.Property
witVKeysProp :: RawSeed
-> SafeHash EraIndependentTxBody
-> SafeHash EraIndependentTxBody
-> Property
witVKeysProp RawSeed
seed SafeHash EraIndependentTxBody
h1 SafeHash EraIndependentTxBody
h2 =
  let kp :: KeyPair kd
kp = RawSeed -> KeyPair kd
forall (kd :: KeyRole). RawSeed -> KeyPair kd
mkKeyPair' RawSeed
seed
      w1 :: WitVKey Witness
w1 = SafeHash EraIndependentTxBody
-> KeyPair (ZonkAny 0) -> WitVKey Witness
forall (kr :: KeyRole).
SafeHash EraIndependentTxBody -> KeyPair kr -> WitVKey Witness
mkWitnessVKey SafeHash EraIndependentTxBody
h1 KeyPair (ZonkAny 0)
forall {kd :: KeyRole}. KeyPair kd
kp
      w2 :: WitVKey Witness
w2 = SafeHash EraIndependentTxBody
-> KeyPair (ZonkAny 1) -> WitVKey Witness
forall (kr :: KeyRole).
SafeHash EraIndependentTxBody -> KeyPair kr -> WitVKey Witness
mkWitnessVKey SafeHash EraIndependentTxBody
h2 KeyPair (ZonkAny 1)
forall {kd :: KeyRole}. KeyPair kd
kp
   in [Property] -> Property
forall prop. Testable prop => [prop] -> Property
conjoin
        [ [WitVKey Witness] -> [WitVKey Witness]
forall a. Ord a => [a] -> [a]
sort [WitVKey Witness
w1, WitVKey Witness
w2] [WitVKey Witness] -> [WitVKey Witness] -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== [WitVKey Witness] -> [WitVKey Witness]
forall a. Ord a => [a] -> [a]
sort [WitVKey Witness
w2, WitVKey Witness
w1]
        , [WitVKey Witness] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([WitVKey Witness] -> [WitVKey Witness]
forall a. Eq a => [a] -> [a]
nub [WitVKey Witness
w1, WitVKey Witness
w2]) Int -> Int -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Set (WitVKey Witness) -> Int
forall a. Set a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([WitVKey Witness] -> Set (WitVKey Witness)
forall a. Ord a => [a] -> Set a
Set.fromList [WitVKey Witness
w1, WitVKey Witness
w2])
        , WitVKey Witness
w1 WitVKey Witness -> WitVKey Witness -> Bool
forall a. Eq a => a -> a -> Bool
/= WitVKey Witness
w2 Bool -> Property -> Property
forall prop. Testable prop => Bool -> prop -> Property
==> Set (WitVKey Witness) -> Int
forall a. Set a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (WitVKey Witness -> Set (WitVKey Witness)
forall a. a -> Set a
Set.singleton WitVKey Witness
w1 Set (WitVKey Witness)
-> Set (WitVKey Witness) -> Set (WitVKey Witness)
forall a. Semigroup a => a -> a -> a
<> WitVKey Witness -> Set (WitVKey Witness)
forall a. a -> Set a
Set.singleton WitVKey Witness
w2) Int -> Int -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Int
2
        ]