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