{-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE ScopedTypeVariables #-} module Test.Cardano.Ledger.Conway.Proposals where 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 (..), ) import Test.Cardano.Ledger.Conway.Era (ConwayEraTest) spec :: forall era. ConwayEraTest era => Spec spec :: forall era. ConwayEraTest era => 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 era -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Adding new nodes keeps Proposals consistent" ((ProposalsNewActions era -> Expectation) -> Spec) -> (ProposalsNewActions era -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(ProposalsNewActions Proposals era ps [GovActionState era] actions :: ProposalsNewActions era) -> let ps' :: Proposals era ps' = (Proposals era -> GovActionState era -> Proposals era) -> Proposals era -> [GovActionState era] -> Proposals era 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 era p GovActionState era action -> Proposals era -> Maybe (Proposals era) -> Proposals era forall a. a -> Maybe a -> a fromMaybe (String -> Proposals era forall a. HasCallStack => String -> a error String "Unable to add action") (Maybe (Proposals era) -> Proposals era) -> Maybe (Proposals era) -> Proposals era forall a b. (a -> b) -> a -> b $ GovActionState era -> Proposals era -> Maybe (Proposals era) forall era. (EraPParams era, HasCallStack) => GovActionState era -> Proposals era -> Maybe (Proposals era) proposalsAddAction GovActionState era action Proposals era p) Proposals era ps [GovActionState era] actions actionsMap :: Map GovActionId (GovActionState era) actionsMap = (Map GovActionId (GovActionState era) -> GovActionState era -> Map GovActionId (GovActionState era)) -> Map GovActionId (GovActionState era) -> [GovActionState era] -> Map GovActionId (GovActionState era) 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 era) accum GovActionState era gas -> GovActionId -> GovActionState era -> Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) forall k a. Ord k => k -> a -> Map k a -> Map k a Map.insert (GovActionState era -> GovActionId forall era. GovActionState era -> GovActionId gasId GovActionState era gas) GovActionState era gas Map GovActionId (GovActionState era) accum) Map GovActionId (GovActionState era) forall k a. Map k a Map.empty [GovActionState era] actions in Map GovActionId (GovActionState era) actionsMap Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` (Map GovActionId (GovActionState era) actionsMap Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) forall k a b. Ord k => Map k a -> Map k b -> Map k a `Map.intersection` Proposals era -> Map GovActionId (GovActionState era) forall era. Proposals era -> Map GovActionId (GovActionState era) proposalsActionsMap Proposals era 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 era -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Removing leaf nodes keeps Proposals consistent" ((Proposals era -> Expectation) -> Spec) -> (Proposals era -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(Proposals era ps :: Proposals era) -> 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 era -> StrictSeq GovActionId forall era. Proposals era -> StrictSeq GovActionId proposalsIds Proposals era ps ps' :: Proposals era ps' = (Proposals era, Map GovActionId (GovActionState era)) -> Proposals era forall a b. (a, b) -> a fst ((Proposals era, Map GovActionId (GovActionState era)) -> Proposals era) -> (Proposals era, Map GovActionId (GovActionState era)) -> Proposals era forall a b. (a -> b) -> a -> b $ Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) forall era. EraPParams era => Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) proposalsRemoveWithDescendants Set GovActionId gais Proposals era ps Proposals era -> Int forall era. Proposals era -> Int proposalsSize Proposals era ps' Int -> Int -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Proposals era -> Int forall era. Proposals era -> Int proposalsSize Proposals era 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 era -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Removing root nodes keeps Proposals consistent" ((Proposals era -> Expectation) -> Spec) -> (Proposals era -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(Proposals era ps :: Proposals era) -> 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 era -> StrictSeq GovActionId forall era. Proposals era -> StrictSeq GovActionId proposalsIds Proposals era ps ps' :: Proposals era ps' = (Proposals era, Map GovActionId (GovActionState era)) -> Proposals era forall a b. (a, b) -> a fst ((Proposals era, Map GovActionId (GovActionState era)) -> Proposals era) -> (Proposals era, Map GovActionId (GovActionState era)) -> Proposals era forall a b. (a -> b) -> a -> b $ Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) forall era. EraPParams era => Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) proposalsRemoveWithDescendants Set GovActionId gais Proposals era ps Proposals era -> Int forall era. Proposals era -> Int proposalsSize Proposals era 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 era -> Int forall era. Proposals era -> Int proposalsSize Proposals era ps) String -> (ProposalsNewActions era -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Removing non-member nodes throws an AssertionFailure" ((ProposalsNewActions era -> Expectation) -> Spec) -> (ProposalsNewActions era -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(ProposalsNewActions Proposals era ps [GovActionState era] actions :: ProposalsNewActions era) -> ((Proposals era, Map GovActionId (GovActionState era)) -> IO (Proposals era, Map GovActionId (GovActionState era)) forall a. a -> IO a evaluate ((Proposals era, Map GovActionId (GovActionState era)) -> IO (Proposals era, Map GovActionId (GovActionState era))) -> ((Proposals era, Map GovActionId (GovActionState era)) -> (Proposals era, Map GovActionId (GovActionState era))) -> (Proposals era, Map GovActionId (GovActionState era)) -> IO (Proposals era, Map GovActionId (GovActionState era)) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Proposals era, Map GovActionId (GovActionState era)) -> (Proposals era, Map GovActionId (GovActionState era)) forall a. NFData a => a -> a force) (Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) 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 era -> GovActionId forall era. GovActionState era -> GovActionId gasId (GovActionState era -> GovActionId) -> [GovActionState era] -> [GovActionId] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [GovActionState era] actions) Proposals era ps) IO (Proposals era, Map GovActionId (GovActionState era)) -> 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 era, Voter, Vote) -> Bool) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Adding votes preserves consistency" (((ProposalsForEnactment era, Voter, Vote) -> Bool) -> Spec) -> ((ProposalsForEnactment era, Voter, Vote) -> Bool) -> Spec forall a b. (a -> b) -> a -> b $ \( ProposalsForEnactment {Proposals era pfeProposals :: Proposals era pfeProposals :: forall era. ProposalsForEnactment era -> Proposals era pfeProposals, Seq (GovActionState era) pfeToEnact :: Seq (GovActionState era) pfeToEnact :: forall era. ProposalsForEnactment era -> Seq (GovActionState era) pfeToEnact} :: ProposalsForEnactment era , Voter voter :: Voter , Vote vote :: Vote ) -> do case Seq (GovActionState era) pfeToEnact of GovActionState era gas Seq.:<| Seq (GovActionState era) _gass -> Either String (GovRelation TreeMaybe) -> Bool forall a b. Either a b -> Bool isRight (Either String (GovRelation TreeMaybe) -> Bool) -> (Proposals era -> Either String (GovRelation TreeMaybe)) -> Proposals era -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c . Proposals era -> Either String (GovRelation TreeMaybe) forall era. Proposals era -> Either String (GovRelation TreeMaybe) toGovRelationTreeEither (Proposals era -> Bool) -> Proposals era -> Bool forall a b. (a -> b) -> a -> b $ Voter -> Vote -> GovActionId -> Proposals era -> Proposals era forall era. Voter -> Vote -> GovActionId -> Proposals era -> Proposals era proposalsAddVote Voter voter Vote vote (GovActionState era -> GovActionId forall era. GovActionState era -> GovActionId gasId GovActionState era gas) Proposals era pfeProposals Seq (GovActionState era) _ -> Bool True String -> (ProposalsForEnactment era -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Enacting exhaustive lineages reduces Proposals to their roots" ((ProposalsForEnactment era -> Expectation) -> Spec) -> (ProposalsForEnactment era -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \( ProposalsForEnactment {Proposals era pfeProposals :: forall era. ProposalsForEnactment era -> Proposals era pfeProposals :: Proposals era pfeProposals, Seq (GovActionState era) pfeToEnact :: forall era. ProposalsForEnactment era -> Seq (GovActionState era) pfeToEnact :: Seq (GovActionState era) 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 era ) -> do let (Proposals era ps', Map GovActionId (GovActionState era) enacted, Map GovActionId (GovActionState era) removedDueToEnactment, Map GovActionId (GovActionState era) expiredRemoved) = Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) 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 era) pfeToEnact Set GovActionId forall a. Set a Set.empty Proposals era pfeProposals Map GovActionId (GovActionState era) expiredRemoved Map GovActionId (GovActionState era) -> (Map GovActionId (GovActionState era) -> Bool) -> Expectation forall a. (HasCallStack, Show a) => a -> (a -> Bool) -> Expectation `shouldSatisfy` Map GovActionId (GovActionState era) -> Bool forall k a. Map k a -> Bool Map.null Map GovActionId (GovActionState era) enacted Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` (GovActionState era -> GovActionId) -> Seq (GovActionState era) -> Map GovActionId (GovActionState era) forall (f :: * -> *) k v. (Foldable f, Ord k) => (v -> k) -> f v -> Map k v fromElems GovActionState era -> GovActionId forall era. GovActionState era -> GovActionId gasId Seq (GovActionState era) pfeToEnact Map GovActionId (GovActionState era) -> Set GovActionId forall k a. Map k a -> Set k Map.keysSet Map GovActionId (GovActionState era) removedDueToEnactment Set GovActionId -> Set GovActionId -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Set GovActionId pfeToRemove Proposals era -> Int forall era. Proposals era -> Int proposalsSize Proposals era 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 era -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Enacting non-member nodes throws an AssertionFailure" ((ProposalsNewActions era -> Expectation) -> Spec) -> (ProposalsNewActions era -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(ProposalsNewActions Proposals era ps [GovActionState era] actions :: ProposalsNewActions era) -> ((Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> IO (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) forall a. a -> IO a evaluate ((Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> IO (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era))) -> ((Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era))) -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> IO (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) forall a. NFData a => a -> a force) (Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) 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 era] -> Seq (GovActionState era) forall a. [a] -> Seq a fromList [GovActionState era] actions) Set GovActionId forall a. Set a Set.empty Proposals era ps) IO (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> Selector AssertionFailed -> Expectation forall e a. (HasCallStack, Exception e) => IO a -> Selector e -> Expectation `shouldThrow` \AssertionFailed {} -> Bool True String -> (ProposalsForEnactment era -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Expiring compliments of exhaustive lineages keeps proposals consistent" ((ProposalsForEnactment era -> Expectation) -> Spec) -> (ProposalsForEnactment era -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \( ProposalsForEnactment {Proposals era pfeProposals :: forall era. ProposalsForEnactment era -> Proposals era pfeProposals :: Proposals era pfeProposals, Seq (GovActionState era) pfeToEnact :: forall era. ProposalsForEnactment era -> Seq (GovActionState era) pfeToEnact :: Seq (GovActionState era) 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 era ) -> do let (Proposals era ps', Map GovActionId (GovActionState era) enacted, Map GovActionId (GovActionState era) removedDueToEnactment, Map GovActionId (GovActionState era) expiredRemoved) = Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) 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 era) forall a. Seq a Seq.Empty Set GovActionId pfeToRemove Proposals era pfeProposals Map GovActionId (GovActionState era) enacted Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Map GovActionId (GovActionState era) forall a. Monoid a => a mempty Map GovActionId (GovActionState era) removedDueToEnactment Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Map GovActionId (GovActionState era) forall a. Monoid a => a mempty Map GovActionId (GovActionState era) -> Set GovActionId forall k a. Map k a -> Set k Map.keysSet Map GovActionId (GovActionState era) expiredRemoved Set GovActionId -> Set GovActionId -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Set GovActionId pfeToRemove Proposals era ps' Proposals era -> Proposals era -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` (Proposals era, Map GovActionId (GovActionState era)) -> Proposals era forall a b. (a, b) -> a fst (Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) forall era. EraPParams era => Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) proposalsRemoveWithDescendants Set GovActionId pfeToRemove Proposals era pfeProposals) let enactMap :: Map GovActionId (GovActionState era) enactMap = (GovActionState era -> GovActionId) -> Seq (GovActionState era) -> Map GovActionId (GovActionState era) forall (f :: * -> *) k v. (Foldable f, Ord k) => (v -> k) -> f v -> Map k v fromElems GovActionState era -> GovActionId forall era. GovActionState era -> GovActionId gasId Seq (GovActionState era) pfeToEnact let (Proposals era emptyProposals, Map GovActionId (GovActionState era) enactedMap) = Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) forall era. EraPParams era => Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era)) proposalsRemoveWithDescendants (Map GovActionId (GovActionState era) -> Set GovActionId forall k a. Map k a -> Set k Map.keysSet Map GovActionId (GovActionState era) enactMap) Proposals era ps' Proposals era -> Int forall era. Proposals era -> Int proposalsSize Proposals era 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 era) enactedMap Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Map GovActionId (GovActionState era) enactMap String -> (ProposalsNewActions era -> Expectation) -> Spec forall prop. (HasCallStack, Testable prop) => String -> prop -> Spec prop String "Expiring non-member nodes throws an AssertionFailure" ((ProposalsNewActions era -> Expectation) -> Spec) -> (ProposalsNewActions era -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \(ProposalsNewActions Proposals era ps [GovActionState era] actions :: ProposalsNewActions era) -> ((Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> IO (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) forall a. a -> IO a evaluate ((Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> IO (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era))) -> ((Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era))) -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> IO (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) forall b c a. (b -> c) -> (a -> b) -> a -> c . (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) forall a. NFData a => a -> a force) (Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) 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 era) 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 era -> GovActionId forall era. GovActionState era -> GovActionId gasId (GovActionState era -> GovActionId) -> [GovActionState era] -> [GovActionId] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [GovActionState era] actions) Proposals era ps) IO (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) -> Selector AssertionFailed -> Expectation forall e a. (HasCallStack, Exception e) => IO a -> Selector e -> Expectation `shouldThrow` \AssertionFailed {} -> Bool True String -> (ProposalsForEnactment era -> 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 era -> Expectation) -> Spec) -> (ProposalsForEnactment era -> Expectation) -> Spec forall a b. (a -> b) -> a -> b $ \( ProposalsForEnactment {Proposals era pfeProposals :: forall era. ProposalsForEnactment era -> Proposals era pfeProposals :: Proposals era pfeProposals, Seq (GovActionState era) pfeToEnact :: forall era. ProposalsForEnactment era -> Seq (GovActionState era) pfeToEnact :: Seq (GovActionState era) 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 era ) -> do let (Proposals era ps', Map GovActionId (GovActionState era) enacted, Map GovActionId (GovActionState era) enactedRemoved, Map GovActionId (GovActionState era) expiredRemoved) = Seq (GovActionState era) -> Set GovActionId -> Proposals era -> (Proposals era, Map GovActionId (GovActionState era), Map GovActionId (GovActionState era), Map GovActionId (GovActionState era)) 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 era) pfeToEnact Set GovActionId pfeToRemove Proposals era pfeProposals Map GovActionId (GovActionState era) -> Set GovActionId forall k a. Map k a -> Set k Map.keysSet Map GovActionId (GovActionState era) expiredRemoved Set GovActionId -> Set GovActionId -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Set GovActionId pfeToRemove Map GovActionId (GovActionState era) enactedRemoved Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` Map GovActionId (GovActionState era) forall a. Monoid a => a mempty Map GovActionId (GovActionState era) enacted Map GovActionId (GovActionState era) -> Map GovActionId (GovActionState era) -> Expectation forall a. (HasCallStack, Show a, Eq a) => a -> a -> Expectation `shouldBe` (GovActionState era -> GovActionId) -> Seq (GovActionState era) -> Map GovActionId (GovActionState era) forall (f :: * -> *) k v. (Foldable f, Ord k) => (v -> k) -> f v -> Map k v fromElems GovActionState era -> GovActionId forall era. GovActionState era -> GovActionId gasId Seq (GovActionState era) pfeToEnact Proposals era -> Int forall era. Proposals era -> Int proposalsSize Proposals era 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