{-# 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