{-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE ScopedTypeVariables #-} module Test.Cardano.Ledger.Conway.Proposals where import Cardano.Ledger.Conway import Cardano.Ledger.Conway.Governance import Control.DeepSeq (force) import Control.Exception (AssertionFailed (..), evaluate) import Data.Either (isRight) import Data.Foldable as F (foldl', toList) import qualified Data.Map.Strict as Map import Data.MapExtras (fromElems) import Data.Maybe (fromMaybe) import Data.Sequence (fromList) import qualified Data.Sequence as Seq import qualified Data.Sequence.Strict as SSeq import qualified Data.Set as Set import Test.Cardano.Ledger.Common import Test.Cardano.Ledger.Conway.Arbitrary ( ProposalsForEnactment (..), ProposalsNewActions (..), ) spec :: Spec spec :: Spec spec = do String -> Spec -> Spec forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Proposals" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do String -> Spec -> Spec forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Construction" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do String -> (ProposalsNewActions ConwayEra -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Adding new nodes keeps Proposals consistent" ((ProposalsNewActions ConwayEra -> Expectation) -> Spec) -> (ProposalsNewActions ConwayEra -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(ProposalsNewActions Proposals ConwayEra ps [GovActionState ConwayEra] actions :: ProposalsNewActions ConwayEra) -> let ps' :: Proposals ConwayEra ps' = (Proposals ConwayEra -> GovActionState ConwayEra -> Proposals ConwayEra) -> Proposals ConwayEra -> [GovActionState ConwayEra] -> Proposals ConwayEra forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b F.foldl' (\Proposals ConwayEra p GovActionState ConwayEra action -> Proposals ConwayEra -> Maybe (Proposals ConwayEra) -> Proposals ConwayEra forall a. a -> Maybe a -> a fromMaybe (String -> Proposals ConwayEra forall a. HasCallStack => String -> a error String "Unable to add action") (Maybe (Proposals ConwayEra) -> Proposals ConwayEra) -> Maybe (Proposals ConwayEra) -> Proposals ConwayEra forall a b. (a -> b) -> a -> b $ GovActionState ConwayEra -> Proposals ConwayEra -> Maybe (Proposals ConwayEra) forall era. (EraPParams era, HasCallStack) => GovActionState era -> Proposals era -> Maybe (Proposals era) proposalsAddAction GovActionState ConwayEra action Proposals ConwayEra p) Proposals ConwayEra ps [GovActionState ConwayEra] actions actionsMap :: Map GovActionId (GovActionState ConwayEra) actionsMap = (Map GovActionId (GovActionState ConwayEra) -> GovActionState ConwayEra -> Map GovActionId (GovActionState ConwayEra)) -> Map GovActionId (GovActionState ConwayEra) -> [GovActionState ConwayEra] -> Map GovActionId (GovActionState ConwayEra) forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b F.foldl' (\Map GovActionId (GovActionState ConwayEra) accum GovActionState ConwayEra gas -> GovActionId -> GovActionState ConwayEra -> Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) forall k a. Ord k => k -> a -> Map k a -> Map k a Map.insert (GovActionState ConwayEra -> GovActionId forall era. GovActionState era -> GovActionId gasId GovActionState ConwayEra gas) GovActionState ConwayEra gas Map GovActionId (GovActionState ConwayEra) accum) Map GovActionId (GovActionState ConwayEra) forall k a. Map k a Map.empty [GovActionState ConwayEra] actions in Map GovActionId (GovActionState ConwayEra) actionsMap Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` (Map GovActionId (GovActionState ConwayEra) actionsMap Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) forall k a b. Ord k => Map k a -> Map k b -> Map k a `Map.intersection` Proposals ConwayEra -> Map GovActionId (GovActionState ConwayEra) forall era. Proposals era -> Map GovActionId (GovActionState era) proposalsActionsMap Proposals ConwayEra ps') String -> Spec -> Spec forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Removal" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do String -> (Proposals ConwayEra -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Removing leaf nodes keeps Proposals consistent" ((Proposals ConwayEra -> Expectation) -> Spec) -> (Proposals ConwayEra -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(Proposals ConwayEra ps :: Proposals ConwayEra) -> do let gais :: Set GovActionId gais = [GovActionId] -> Set GovActionId forall a. Ord a => [a] -> Set a Set.fromList ([GovActionId] -> Set GovActionId) -> [GovActionId] -> Set GovActionId forall a b. (a -> b) -> a -> b $ StrictSeq GovActionId -> [GovActionId] forall a. StrictSeq a -> [a] forall (t :: * -> *) a. Foldable t => t a -> [a] toList (StrictSeq GovActionId -> [GovActionId]) -> StrictSeq GovActionId -> [GovActionId] forall a b. (a -> b) -> a -> b $ Int -> StrictSeq GovActionId -> StrictSeq GovActionId forall a. Int -> StrictSeq a -> StrictSeq a SSeq.takeLast Int 4 (StrictSeq GovActionId -> StrictSeq GovActionId) -> StrictSeq GovActionId -> StrictSeq GovActionId forall a b. (a -> b) -> a -> b $ Proposals ConwayEra -> StrictSeq GovActionId forall era. Proposals era -> StrictSeq GovActionId proposalsIds Proposals ConwayEra ps ps' :: Proposals ConwayEra ps' = (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> Proposals ConwayEra forall a b. (a, b) -> a fst ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> Proposals ConwayEra) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> Proposals ConwayEra forall a b. (a -> b) -> a -> b $ Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) proposalsRemoveWithDescendants Set GovActionId gais Proposals ConwayEra ps Proposals ConwayEra -> Int forall era. Proposals era -> Int proposalsSize Proposals ConwayEra ps' Int -> Int -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Proposals ConwayEra -> Int forall era. Proposals era -> Int proposalsSize Proposals ConwayEra ps Int -> Int -> Int forall a. Num a => a -> a -> a - Set GovActionId -> Int forall a. Set a -> Int Set.size Set GovActionId gais String -> (Proposals ConwayEra -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Removing root nodes keeps Proposals consistent" ((Proposals ConwayEra -> Expectation) -> Spec) -> (Proposals ConwayEra -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(Proposals ConwayEra ps :: Proposals ConwayEra) -> do let gais :: Set GovActionId gais = [GovActionId] -> Set GovActionId forall a. Ord a => [a] -> Set a Set.fromList ([GovActionId] -> Set GovActionId) -> [GovActionId] -> Set GovActionId forall a b. (a -> b) -> a -> b $ StrictSeq GovActionId -> [GovActionId] forall a. StrictSeq a -> [a] forall (t :: * -> *) a. Foldable t => t a -> [a] toList (StrictSeq GovActionId -> [GovActionId]) -> StrictSeq GovActionId -> [GovActionId] forall a b. (a -> b) -> a -> b $ Int -> StrictSeq GovActionId -> StrictSeq GovActionId forall a. Int -> StrictSeq a -> StrictSeq a SSeq.take Int 4 (StrictSeq GovActionId -> StrictSeq GovActionId) -> StrictSeq GovActionId -> StrictSeq GovActionId forall a b. (a -> b) -> a -> b $ Proposals ConwayEra -> StrictSeq GovActionId forall era. Proposals era -> StrictSeq GovActionId proposalsIds Proposals ConwayEra ps ps' :: Proposals ConwayEra ps' = (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> Proposals ConwayEra forall a b. (a, b) -> a fst ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> Proposals ConwayEra) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> Proposals ConwayEra forall a b. (a -> b) -> a -> b $ Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) proposalsRemoveWithDescendants Set GovActionId gais Proposals ConwayEra ps Proposals ConwayEra -> Int forall era. Proposals era -> Int proposalsSize Proposals ConwayEra ps' Int -> (Int -> Bool) -> Expectation forall a. (HasCallStack, Show a) => a -> (a -> Bool) -> Expectation `shouldSatisfy` (Int -> Int -> Bool forall a. Ord a => a -> a -> Bool <= Proposals ConwayEra -> Int forall era. Proposals era -> Int proposalsSize Proposals ConwayEra ps) String -> (ProposalsNewActions ConwayEra -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Removing non-member nodes throws an AssertionFailure" ((ProposalsNewActions ConwayEra -> Expectation) -> Spec) -> (ProposalsNewActions ConwayEra -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(ProposalsNewActions Proposals ConwayEra ps [GovActionState ConwayEra] actions :: ProposalsNewActions ConwayEra) -> ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) forall a. a -> IO a evaluate ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra))) -> ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra))) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) forall a. NFData a => a -> a force) (Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) proposalsRemoveWithDescendants ([GovActionId] -> Set GovActionId forall a. Ord a => [a] -> Set a Set.fromList ([GovActionId] -> Set GovActionId) -> [GovActionId] -> Set GovActionId forall a b. (a -> b) -> a -> b $ GovActionState ConwayEra -> GovActionId forall era. GovActionState era -> GovActionId gasId (GovActionState ConwayEra -> GovActionId) -> [GovActionState ConwayEra] -> [GovActionId] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [GovActionState ConwayEra] actions) Proposals ConwayEra ps) IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> Selector AssertionFailed -> Expectation forall e a. (HasCallStack, Exception e) => IO a -> Selector e -> Expectation `shouldThrow` \AssertionFailed {} -> Bool True String -> Spec -> Spec forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "Enactment" (Spec -> Spec) -> Spec -> Spec forall a b. (a -> b) -> a -> b $ do String -> ((ProposalsForEnactment ConwayEra, Voter, Vote) -> Bool) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Adding votes preserves consistency" (((ProposalsForEnactment ConwayEra, Voter, Vote) -> Bool) -> Spec) -> ((ProposalsForEnactment ConwayEra, Voter, Vote) -> Bool) -> Spec forall a b. (a -> b) -> a -> b $ \( ProposalsForEnactment {Proposals ConwayEra pfeProposals :: Proposals ConwayEra pfeProposals :: forall era. ProposalsForEnactment era -> Proposals era pfeProposals, Seq (GovActionState ConwayEra) pfeToEnact :: Seq (GovActionState ConwayEra) pfeToEnact :: forall era. ProposalsForEnactment era -> Seq (GovActionState era) pfeToEnact} :: ProposalsForEnactment ConwayEra , Voter voter :: Voter , Vote vote :: Vote ) -> do case Seq (GovActionState ConwayEra) pfeToEnact of GovActionState ConwayEra gas Seq.:<| Seq (GovActionState ConwayEra) _gass -> Either String (GovRelation TreeMaybe ConwayEra) -> Bool forall a b. Either a b -> Bool isRight (Either String (GovRelation TreeMaybe ConwayEra) -> Bool) -> (Proposals ConwayEra -> Either String (GovRelation TreeMaybe ConwayEra)) -> Proposals ConwayEra -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c . Proposals ConwayEra -> Either String (GovRelation TreeMaybe ConwayEra) forall era. Era era => Proposals era -> Either String (GovRelation TreeMaybe era) toGovRelationTreeEither (Proposals ConwayEra -> Bool) -> Proposals ConwayEra -> Bool forall a b. (a -> b) -> a -> b $ Voter -> Vote -> GovActionId -> Proposals ConwayEra -> Proposals ConwayEra forall era. Voter -> Vote -> GovActionId -> Proposals era -> Proposals era proposalsAddVote Voter voter Vote vote (GovActionState ConwayEra -> GovActionId forall era. GovActionState era -> GovActionId gasId GovActionState ConwayEra gas) Proposals ConwayEra pfeProposals Seq (GovActionState ConwayEra) _ -> Bool True String -> (ProposalsForEnactment ConwayEra -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Enacting exhaustive lineages reduces Proposals to their roots" ((ProposalsForEnactment ConwayEra -> Expectation) -> Spec) -> (ProposalsForEnactment ConwayEra -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \( ProposalsForEnactment {Proposals ConwayEra pfeProposals :: forall era. ProposalsForEnactment era -> Proposals era pfeProposals :: Proposals ConwayEra pfeProposals, Seq (GovActionState ConwayEra) pfeToEnact :: forall era. ProposalsForEnactment era -> Seq (GovActionState era) pfeToEnact :: Seq (GovActionState ConwayEra) pfeToEnact, Set GovActionId pfeToRemove :: Set GovActionId pfeToRemove :: forall era. ProposalsForEnactment era -> Set GovActionId pfeToRemove, Set GovActionId pfeToRetain :: Set GovActionId pfeToRetain :: forall era. ProposalsForEnactment era -> Set GovActionId pfeToRetain} :: ProposalsForEnactment ConwayEra ) -> do let (Proposals ConwayEra ps', Map GovActionId (GovActionState ConwayEra) enacted, Map GovActionId (GovActionState ConwayEra) removedDueToEnactment, Map GovActionId (GovActionState ConwayEra) expiredRemoved) = Seq (GovActionState ConwayEra) -> Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) proposalsApplyEnactment Seq (GovActionState ConwayEra) pfeToEnact Set GovActionId forall a. Set a Set.empty Proposals ConwayEra pfeProposals Map GovActionId (GovActionState ConwayEra) expiredRemoved Map GovActionId (GovActionState ConwayEra) -> (Map GovActionId (GovActionState ConwayEra) -> Bool) -> Expectation forall a. (HasCallStack, Show a) => a -> (a -> Bool) -> Expectation `shouldSatisfy` Map GovActionId (GovActionState ConwayEra) -> Bool forall k a. Map k a -> Bool Map.null Map GovActionId (GovActionState ConwayEra) enacted Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` (GovActionState ConwayEra -> GovActionId) -> Seq (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) forall (f :: * -> *) k v. (Foldable f, Ord k) => (v -> k) -> f v -> Map k v fromElems GovActionState ConwayEra -> GovActionId forall era. GovActionState era -> GovActionId gasId Seq (GovActionState ConwayEra) pfeToEnact Map GovActionId (GovActionState ConwayEra) -> Set GovActionId forall k a. Map k a -> Set k Map.keysSet Map GovActionId (GovActionState ConwayEra) removedDueToEnactment Set GovActionId -> Set GovActionId -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Set GovActionId pfeToRemove Proposals ConwayEra -> Int forall era. Proposals era -> Int proposalsSize Proposals ConwayEra ps' Int -> Int -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Set GovActionId -> Int forall a. Set a -> Int Set.size Set GovActionId pfeToRetain String -> (ProposalsNewActions ConwayEra -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Enacting non-member nodes throws an AssertionFailure" ((ProposalsNewActions ConwayEra -> Expectation) -> Spec) -> (ProposalsNewActions ConwayEra -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(ProposalsNewActions Proposals ConwayEra ps [GovActionState ConwayEra] actions :: ProposalsNewActions ConwayEra) -> ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall a. a -> IO a evaluate ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra))) -> ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra))) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall a. NFData a => a -> a force) (Seq (GovActionState ConwayEra) -> Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) proposalsApplyEnactment ([GovActionState ConwayEra] -> Seq (GovActionState ConwayEra) forall a. [a] -> Seq a fromList [GovActionState ConwayEra] actions) Set GovActionId forall a. Set a Set.empty Proposals ConwayEra ps) IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> Selector AssertionFailed -> Expectation forall e a. (HasCallStack, Exception e) => IO a -> Selector e -> Expectation `shouldThrow` \AssertionFailed {} -> Bool True String -> (ProposalsForEnactment ConwayEra -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Expiring compliments of exhaustive lineages keeps proposals consistent" ((ProposalsForEnactment ConwayEra -> Expectation) -> Spec) -> (ProposalsForEnactment ConwayEra -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \( ProposalsForEnactment {Proposals ConwayEra pfeProposals :: forall era. ProposalsForEnactment era -> Proposals era pfeProposals :: Proposals ConwayEra pfeProposals, Seq (GovActionState ConwayEra) pfeToEnact :: forall era. ProposalsForEnactment era -> Seq (GovActionState era) pfeToEnact :: Seq (GovActionState ConwayEra) pfeToEnact, Set GovActionId pfeToRemove :: forall era. ProposalsForEnactment era -> Set GovActionId pfeToRemove :: Set GovActionId pfeToRemove, Set GovActionId pfeToRetain :: forall era. ProposalsForEnactment era -> Set GovActionId pfeToRetain :: Set GovActionId pfeToRetain} :: ProposalsForEnactment ConwayEra ) -> do let (Proposals ConwayEra ps', Map GovActionId (GovActionState ConwayEra) enacted, Map GovActionId (GovActionState ConwayEra) removedDueToEnactment, Map GovActionId (GovActionState ConwayEra) expiredRemoved) = Seq (GovActionState ConwayEra) -> Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) proposalsApplyEnactment Seq (GovActionState ConwayEra) forall a. Seq a Seq.Empty Set GovActionId pfeToRemove Proposals ConwayEra pfeProposals Map GovActionId (GovActionState ConwayEra) enacted Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Map GovActionId (GovActionState ConwayEra) forall a. Monoid a => a mempty Map GovActionId (GovActionState ConwayEra) removedDueToEnactment Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Map GovActionId (GovActionState ConwayEra) forall a. Monoid a => a mempty Map GovActionId (GovActionState ConwayEra) -> Set GovActionId forall k a. Map k a -> Set k Map.keysSet Map GovActionId (GovActionState ConwayEra) expiredRemoved Set GovActionId -> Set GovActionId -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Set GovActionId pfeToRemove Proposals ConwayEra ps' Proposals ConwayEra -> Proposals ConwayEra -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) -> Proposals ConwayEra forall a b. (a, b) -> a fst (Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) proposalsRemoveWithDescendants Set GovActionId pfeToRemove Proposals ConwayEra pfeProposals) let enactMap :: Map GovActionId (GovActionState ConwayEra) enactMap = (GovActionState ConwayEra -> GovActionId) -> Seq (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) forall (f :: * -> *) k v. (Foldable f, Ord k) => (v -> k) -> f v -> Map k v fromElems GovActionState ConwayEra -> GovActionId forall era. GovActionState era -> GovActionId gasId Seq (GovActionState ConwayEra) pfeToEnact let (Proposals ConwayEra emptyProposals, Map GovActionId (GovActionState ConwayEra) enactedMap) = Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) proposalsRemoveWithDescendants (Map GovActionId (GovActionState ConwayEra) -> Set GovActionId forall k a. Map k a -> Set k Map.keysSet Map GovActionId (GovActionState ConwayEra) enactMap) Proposals ConwayEra ps' Proposals ConwayEra -> Int forall era. Proposals era -> Int proposalsSize Proposals ConwayEra emptyProposals Int -> Int -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Set GovActionId -> Int forall a. Set a -> Int Set.size Set GovActionId pfeToRetain Map GovActionId (GovActionState ConwayEra) enactedMap Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Map GovActionId (GovActionState ConwayEra) enactMap String -> (ProposalsNewActions ConwayEra -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Expiring non-member nodes throws an AssertionFailure" ((ProposalsNewActions ConwayEra -> Expectation) -> Spec) -> (ProposalsNewActions ConwayEra -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(ProposalsNewActions Proposals ConwayEra ps [GovActionState ConwayEra] actions :: ProposalsNewActions ConwayEra) -> ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall a. a -> IO a evaluate ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra))) -> ((Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra))) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall a. NFData a => a -> a force) (Seq (GovActionState ConwayEra) -> Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) proposalsApplyEnactment Seq (GovActionState ConwayEra) forall a. Seq a Seq.Empty ([GovActionId] -> Set GovActionId forall a. Ord a => [a] -> Set a Set.fromList ([GovActionId] -> Set GovActionId) -> [GovActionId] -> Set GovActionId forall a b. (a -> b) -> a -> b $ GovActionState ConwayEra -> GovActionId forall era. GovActionState era -> GovActionId gasId (GovActionState ConwayEra -> GovActionId) -> [GovActionState ConwayEra] -> [GovActionId] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [GovActionState ConwayEra] actions) Proposals ConwayEra ps) IO (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) -> Selector AssertionFailed -> Expectation forall e a. (HasCallStack, Exception e) => IO a -> Selector e -> Expectation `shouldThrow` \AssertionFailed {} -> Bool True String -> (ProposalsForEnactment ConwayEra -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Enacting and expiring conflicting proposals does not lead to removal due to enactment" ((ProposalsForEnactment ConwayEra -> Expectation) -> Spec) -> (ProposalsForEnactment ConwayEra -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \( ProposalsForEnactment {Proposals ConwayEra pfeProposals :: forall era. ProposalsForEnactment era -> Proposals era pfeProposals :: Proposals ConwayEra pfeProposals, Seq (GovActionState ConwayEra) pfeToEnact :: forall era. ProposalsForEnactment era -> Seq (GovActionState era) pfeToEnact :: Seq (GovActionState ConwayEra) pfeToEnact, Set GovActionId pfeToRemove :: forall era. ProposalsForEnactment era -> Set GovActionId pfeToRemove :: Set GovActionId pfeToRemove, Set GovActionId pfeToRetain :: forall era. ProposalsForEnactment era -> Set GovActionId pfeToRetain :: Set GovActionId pfeToRetain} :: ProposalsForEnactment ConwayEra ) -> do let (Proposals ConwayEra ps', Map GovActionId (GovActionState ConwayEra) enacted, Map GovActionId (GovActionState ConwayEra) enactedRemoved, Map GovActionId (GovActionState ConwayEra) expiredRemoved) = Seq (GovActionState ConwayEra) -> Set GovActionId -> Proposals ConwayEra -> (Proposals ConwayEra, Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra), Map GovActionId (GovActionState ConwayEra)) forall era. EraPParams era => Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) proposalsApplyEnactment Seq (GovActionState ConwayEra) pfeToEnact Set GovActionId pfeToRemove Proposals ConwayEra pfeProposals Map GovActionId (GovActionState ConwayEra) -> Set GovActionId forall k a. Map k a -> Set k Map.keysSet Map GovActionId (GovActionState ConwayEra) expiredRemoved Set GovActionId -> Set GovActionId -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Set GovActionId pfeToRemove Map GovActionId (GovActionState ConwayEra) enactedRemoved Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Map GovActionId (GovActionState ConwayEra) forall a. Monoid a => a mempty Map GovActionId (GovActionState ConwayEra) enacted Map GovActionId (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` (GovActionState ConwayEra -> GovActionId) -> Seq (GovActionState ConwayEra) -> Map GovActionId (GovActionState ConwayEra) forall (f :: * -> *) k v. (Foldable f, Ord k) => (v -> k) -> f v -> Map k v fromElems GovActionState ConwayEra -> GovActionId forall era. GovActionState era -> GovActionId gasId Seq (GovActionState ConwayEra) pfeToEnact Proposals ConwayEra -> Int forall era. Proposals era -> Int proposalsSize Proposals ConwayEra ps' Int -> Int -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Set GovActionId -> Int forall a. Set a -> Int Set.size Set GovActionId pfeToRetain