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 ]