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 = TestName -> (RawSeed -> SafeHash EraIndependentTxBody -> SafeHash EraIndependentTxBody -> Property) -> TestTree forall a. Testable a => TestName -> a -> TestTree testProperty TestName "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 Any -> WitVKey 'Witness forall (kr :: KeyRole). SafeHash EraIndependentTxBody -> KeyPair kr -> WitVKey 'Witness mkWitnessVKey SafeHash EraIndependentTxBody h1 KeyPair Any forall {kd :: KeyRole}. KeyPair kd kp w2 :: WitVKey 'Witness w2 = SafeHash EraIndependentTxBody -> KeyPair Any -> WitVKey 'Witness forall (kr :: KeyRole). SafeHash EraIndependentTxBody -> KeyPair kr -> WitVKey 'Witness mkWitnessVKey SafeHash EraIndependentTxBody h2 KeyPair Any 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 ]