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
        ]