{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Test.Cardano.Ledger.UMapSpec where

import Cardano.Ledger.BaseTypes (StrictMaybe (SJust, SNothing))
import Cardano.Ledger.Coin (Coin, CompactForm, addCompactCoin)
import Cardano.Ledger.Compactible (fromCompact)
import Cardano.Ledger.Credential (Credential, Ptr)
import Cardano.Ledger.DRep (DRep)
import Cardano.Ledger.Keys (KeyHash, KeyRole (StakePool, Staking))
import Cardano.Ledger.UMap (
  RDPair (RDPair, rdReward),
  StakeCredentials (..),
  UMElem (UMElem),
  UMap (UMap, umElems, umPtrs),
  UView (DRepUView, PtrUView, RewDepUView, SPoolUView),
  compactRewardMap,
  dRepMap,
  delete,
  delete',
  depositMap,
  domRestrict,
  domRestrictedMap,
  domRestrictedStakeCredentials,
  domain,
  empty,
  insert,
  insert',
  invPtrMap,
  member,
  nullUView,
  ptrMap,
  range,
  rdDeposit,
  rdPairMap,
  rewardMap,
  sPoolMap,
  size,
  toStakeCredentials,
  umInvariant,
  unUView,
  unUnify,
  unify,
  (∪),
  (∪+),
  (⋪),
  (⋫),
  (⨃),
 )
import qualified Cardano.Ledger.UMap as UMap (lookup)
import Control.Exception (assert)
import Data.Foldable (Foldable (fold))
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import Test.Cardano.Ledger.Common
import Test.Cardano.Ledger.Core.Arbitrary (
  genInsertDeleteRoundtripDRep,
  genInsertDeleteRoundtripPtr,
  genInsertDeleteRoundtripRDPair,
  genInsertDeleteRoundtripSPool,
  genInvariantNonEmpty,
  genRightPreferenceUMap,
  genValidTuples,
  genValidUMap,
  genValidUMapWithCreds,
 )

data Action
  = InsertRDPair (Credential 'Staking) RDPair
  | InsertPtr Ptr (Credential 'Staking)
  | InsertSPool (Credential 'Staking) (KeyHash 'StakePool)
  | InsertDRep (Credential 'Staking) DRep
  | DeleteRDPair (Credential 'Staking)
  | DeletePtr Ptr
  | DeleteSPool (Credential 'Staking)
  | DeleteDRep (Credential 'Staking)
  deriving (Int -> Action -> ShowS
[Action] -> ShowS
Action -> String
(Int -> Action -> ShowS)
-> (Action -> String) -> ([Action] -> ShowS) -> Show Action
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Action -> ShowS
showsPrec :: Int -> Action -> ShowS
$cshow :: Action -> String
show :: Action -> String
$cshowList :: [Action] -> ShowS
showList :: [Action] -> ShowS
Show)

instance Arbitrary Action where
  arbitrary :: Gen Action
arbitrary =
    [Gen Action] -> Gen Action
forall a. HasCallStack => [Gen a] -> Gen a
oneof
      [ Credential 'Staking -> RDPair -> Action
InsertRDPair (Credential 'Staking -> RDPair -> Action)
-> Gen (Credential 'Staking) -> Gen (RDPair -> Action)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary Gen (RDPair -> Action) -> Gen RDPair -> Gen Action
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen RDPair
forall a. Arbitrary a => Gen a
arbitrary
      , Ptr -> Credential 'Staking -> Action
InsertPtr (Ptr -> Credential 'Staking -> Action)
-> Gen Ptr -> Gen (Credential 'Staking -> Action)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Ptr
forall a. Arbitrary a => Gen a
arbitrary Gen (Credential 'Staking -> Action)
-> Gen (Credential 'Staking) -> Gen Action
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary
      , Credential 'Staking -> KeyHash 'StakePool -> Action
InsertSPool (Credential 'Staking -> KeyHash 'StakePool -> Action)
-> Gen (Credential 'Staking) -> Gen (KeyHash 'StakePool -> Action)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary Gen (KeyHash 'StakePool -> Action)
-> Gen (KeyHash 'StakePool) -> Gen Action
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (KeyHash 'StakePool)
forall a. Arbitrary a => Gen a
arbitrary
      , Credential 'Staking -> Action
DeleteRDPair (Credential 'Staking -> Action)
-> Gen (Credential 'Staking) -> Gen Action
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary
      , Ptr -> Action
DeletePtr (Ptr -> Action) -> Gen Ptr -> Gen Action
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Ptr
forall a. Arbitrary a => Gen a
arbitrary
      , Credential 'Staking -> Action
DeleteSPool (Credential 'Staking -> Action)
-> Gen (Credential 'Staking) -> Gen Action
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary
      , Credential 'Staking -> Action
DeleteDRep (Credential 'Staking -> Action)
-> Gen (Credential 'Staking) -> Gen Action
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary
      ]

genRDPair :: Gen Action
genRDPair :: Gen Action
genRDPair = Credential 'Staking -> RDPair -> Action
InsertRDPair (Credential 'Staking -> RDPair -> Action)
-> Gen (Credential 'Staking) -> Gen (RDPair -> Action)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary Gen (RDPair -> Action) -> Gen RDPair -> Gen Action
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen RDPair
forall a. Arbitrary a => Gen a
arbitrary

genPtr :: Gen Action
genPtr :: Gen Action
genPtr = Ptr -> Credential 'Staking -> Action
InsertPtr (Ptr -> Credential 'Staking -> Action)
-> Gen Ptr -> Gen (Credential 'Staking -> Action)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Ptr
forall a. Arbitrary a => Gen a
arbitrary Gen (Credential 'Staking -> Action)
-> Gen (Credential 'Staking) -> Gen Action
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary

genSPool :: Gen Action
genSPool :: Gen Action
genSPool = Credential 'Staking -> KeyHash 'StakePool -> Action
InsertSPool (Credential 'Staking -> KeyHash 'StakePool -> Action)
-> Gen (Credential 'Staking) -> Gen (KeyHash 'StakePool -> Action)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary Gen (KeyHash 'StakePool -> Action)
-> Gen (KeyHash 'StakePool) -> Gen Action
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (KeyHash 'StakePool)
forall a. Arbitrary a => Gen a
arbitrary

genDRep :: Gen Action
genDRep :: Gen Action
genDRep = Credential 'Staking -> DRep -> Action
InsertDRep (Credential 'Staking -> DRep -> Action)
-> Gen (Credential 'Staking) -> Gen (DRep -> Action)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Credential 'Staking)
forall a. Arbitrary a => Gen a
arbitrary Gen (DRep -> Action) -> Gen DRep -> Gen Action
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen DRep
forall a. Arbitrary a => Gen a
arbitrary

reify :: Action -> UMap -> UMap
reify :: Action -> UMap -> UMap
reify = \case
  InsertRDPair Credential 'Staking
k RDPair
v -> Credential 'Staking
-> RDPair -> UView (Credential 'Staking) RDPair -> UMap
forall k v. k -> v -> UView k v -> UMap
insert Credential 'Staking
k RDPair
v (UView (Credential 'Staking) RDPair -> UMap)
-> (UMap -> UView (Credential 'Staking) RDPair) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) RDPair
RewDepUView
  InsertPtr Ptr
k Credential 'Staking
v -> Ptr
-> Credential 'Staking -> UView Ptr (Credential 'Staking) -> UMap
forall k v. k -> v -> UView k v -> UMap
insert Ptr
k Credential 'Staking
v (UView Ptr (Credential 'Staking) -> UMap)
-> (UMap -> UView Ptr (Credential 'Staking)) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView Ptr (Credential 'Staking)
PtrUView
  InsertSPool Credential 'Staking
k KeyHash 'StakePool
v -> Credential 'Staking
-> KeyHash 'StakePool
-> UView (Credential 'Staking) (KeyHash 'StakePool)
-> UMap
forall k v. k -> v -> UView k v -> UMap
insert Credential 'Staking
k KeyHash 'StakePool
v (UView (Credential 'Staking) (KeyHash 'StakePool) -> UMap)
-> (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool))
-> UMap
-> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView
  InsertDRep Credential 'Staking
k DRep
v -> Credential 'Staking
-> DRep -> UView (Credential 'Staking) DRep -> UMap
forall k v. k -> v -> UView k v -> UMap
insert Credential 'Staking
k DRep
v (UView (Credential 'Staking) DRep -> UMap)
-> (UMap -> UView (Credential 'Staking) DRep) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) DRep
DRepUView
  DeleteRDPair Credential 'Staking
k -> Credential 'Staking -> UView (Credential 'Staking) RDPair -> UMap
forall k v. k -> UView k v -> UMap
delete Credential 'Staking
k (UView (Credential 'Staking) RDPair -> UMap)
-> (UMap -> UView (Credential 'Staking) RDPair) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) RDPair
RewDepUView
  DeletePtr Ptr
k -> Ptr -> UView Ptr (Credential 'Staking) -> UMap
forall k v. k -> UView k v -> UMap
delete Ptr
k (UView Ptr (Credential 'Staking) -> UMap)
-> (UMap -> UView Ptr (Credential 'Staking)) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView Ptr (Credential 'Staking)
PtrUView
  DeleteSPool Credential 'Staking
k -> Credential 'Staking
-> UView (Credential 'Staking) (KeyHash 'StakePool) -> UMap
forall k v. k -> UView k v -> UMap
delete Credential 'Staking
k (UView (Credential 'Staking) (KeyHash 'StakePool) -> UMap)
-> (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool))
-> UMap
-> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView
  DeleteDRep Credential 'Staking
k -> Credential 'Staking -> UView (Credential 'Staking) DRep -> UMap
forall k v. k -> UView k v -> UMap
delete Credential 'Staking
k (UView (Credential 'Staking) DRep -> UMap)
-> (UMap -> UView (Credential 'Staking) DRep) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) DRep
DRepUView

reifyRDPair :: Action -> UMap -> UMap
reifyRDPair :: Action -> UMap -> UMap
reifyRDPair = \case
  InsertRDPair Credential 'Staking
k RDPair
v -> Credential 'Staking
-> RDPair -> UView (Credential 'Staking) RDPair -> UMap
forall k v. k -> v -> UView k v -> UMap
insert Credential 'Staking
k RDPair
v (UView (Credential 'Staking) RDPair -> UMap)
-> (UMap -> UView (Credential 'Staking) RDPair) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) RDPair
RewDepUView
  DeleteRDPair Credential 'Staking
k -> Credential 'Staking -> UView (Credential 'Staking) RDPair -> UMap
forall k v. k -> UView k v -> UMap
delete Credential 'Staking
k (UView (Credential 'Staking) RDPair -> UMap)
-> (UMap -> UView (Credential 'Staking) RDPair) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) RDPair
RewDepUView
  Action
_ -> UMap -> UMap
forall a. a -> a
id

reifyPtr :: Action -> UMap -> UMap
reifyPtr :: Action -> UMap -> UMap
reifyPtr = \case
  InsertPtr Ptr
k Credential 'Staking
v -> Ptr
-> Credential 'Staking -> UView Ptr (Credential 'Staking) -> UMap
forall k v. k -> v -> UView k v -> UMap
insert Ptr
k Credential 'Staking
v (UView Ptr (Credential 'Staking) -> UMap)
-> (UMap -> UView Ptr (Credential 'Staking)) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView Ptr (Credential 'Staking)
PtrUView
  DeletePtr Ptr
k -> Ptr -> UView Ptr (Credential 'Staking) -> UMap
forall k v. k -> UView k v -> UMap
delete Ptr
k (UView Ptr (Credential 'Staking) -> UMap)
-> (UMap -> UView Ptr (Credential 'Staking)) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView Ptr (Credential 'Staking)
PtrUView
  Action
_ -> UMap -> UMap
forall a. a -> a
id

reifySPool :: Action -> UMap -> UMap
reifySPool :: Action -> UMap -> UMap
reifySPool = \case
  InsertSPool Credential 'Staking
k KeyHash 'StakePool
v -> Credential 'Staking
-> KeyHash 'StakePool
-> UView (Credential 'Staking) (KeyHash 'StakePool)
-> UMap
forall k v. k -> v -> UView k v -> UMap
insert Credential 'Staking
k KeyHash 'StakePool
v (UView (Credential 'Staking) (KeyHash 'StakePool) -> UMap)
-> (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool))
-> UMap
-> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView
  DeleteSPool Credential 'Staking
k -> Credential 'Staking
-> UView (Credential 'Staking) (KeyHash 'StakePool) -> UMap
forall k v. k -> UView k v -> UMap
delete Credential 'Staking
k (UView (Credential 'Staking) (KeyHash 'StakePool) -> UMap)
-> (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool))
-> UMap
-> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView
  Action
_ -> UMap -> UMap
forall a. a -> a
id

reifyDRep :: Action -> UMap -> UMap
reifyDRep :: Action -> UMap -> UMap
reifyDRep = \case
  InsertDRep Credential 'Staking
k DRep
v -> Credential 'Staking
-> DRep -> UView (Credential 'Staking) DRep -> UMap
forall k v. k -> v -> UView k v -> UMap
insert Credential 'Staking
k DRep
v (UView (Credential 'Staking) DRep -> UMap)
-> (UMap -> UView (Credential 'Staking) DRep) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) DRep
DRepUView
  DeleteDRep Credential 'Staking
k -> Credential 'Staking -> UView (Credential 'Staking) DRep -> UMap
forall k v. k -> UView k v -> UMap
delete Credential 'Staking
k (UView (Credential 'Staking) DRep -> UMap)
-> (UMap -> UView (Credential 'Staking) DRep) -> UMap -> UMap
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UMap -> UView (Credential 'Staking) DRep
DRepUView
  Action
_ -> UMap -> UMap
forall a. a -> a
id

runActions :: [Action] -> UMap -> UMap
runActions :: [Action] -> UMap -> UMap
runActions [Action]
actions UMap
umap = (Action -> UMap -> UMap) -> UMap -> [Action] -> UMap
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Action -> UMap -> UMap
reify UMap
umap [Action]
actions

runRDPairs :: [Action] -> UMap -> UMap
runRDPairs :: [Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
umap = (Action -> UMap -> UMap) -> UMap -> [Action] -> UMap
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Action -> UMap -> UMap
reifyRDPair UMap
umap [Action]
actions

runPtrs :: [Action] -> UMap -> UMap
runPtrs :: [Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
umap = (Action -> UMap -> UMap) -> UMap -> [Action] -> UMap
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Action -> UMap -> UMap
reifyPtr UMap
umap [Action]
actions

runSPools :: [Action] -> UMap -> UMap
runSPools :: [Action] -> UMap -> UMap
runSPools [Action]
actions UMap
umap = (Action -> UMap -> UMap) -> UMap -> [Action] -> UMap
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Action -> UMap -> UMap
reifySPool UMap
umap [Action]
actions

runDReps :: [Action] -> UMap -> UMap
runDReps :: [Action] -> UMap -> UMap
runDReps [Action]
actions UMap
umap = (Action -> UMap -> UMap) -> UMap -> [Action] -> UMap
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Action -> UMap -> UMap
reifyDRep UMap
umap [Action]
actions

sizeTest ::
  ( Map.Map (Credential 'Staking) RDPair
  , Map.Map Ptr (Credential 'Staking)
  , Map.Map (Credential 'Staking) (KeyHash 'StakePool)
  , Map.Map (Credential 'Staking) DRep
  ) ->
  IO ()
sizeTest :: (Map (Credential 'Staking) RDPair, Map Ptr (Credential 'Staking),
 Map (Credential 'Staking) (KeyHash 'StakePool),
 Map (Credential 'Staking) DRep)
-> IO ()
sizeTest (Map (Credential 'Staking) RDPair
rdPairs, Map Ptr (Credential 'Staking)
ptrs, Map (Credential 'Staking) (KeyHash 'StakePool)
sPools, Map (Credential 'Staking) DRep
dReps) = do
  let
    umap :: UMap
umap = Map (Credential 'Staking) RDPair
-> Map Ptr (Credential 'Staking)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) DRep
-> UMap
unify Map (Credential 'Staking) RDPair
rdPairs Map Ptr (Credential 'Staking)
ptrs Map (Credential 'Staking) (KeyHash 'StakePool)
sPools Map (Credential 'Staking) DRep
dReps
    rdPairsSize :: Int
rdPairsSize = UView (Credential 'Staking) RDPair -> Int
forall k v. UView k v -> Int
size (UMap -> UView (Credential 'Staking) RDPair
RewDepUView UMap
umap)
    ptrsSize :: Int
ptrsSize = UView Ptr (Credential 'Staking) -> Int
forall k v. UView k v -> Int
size (UMap -> UView Ptr (Credential 'Staking)
PtrUView UMap
umap)
    sPoolSize :: Int
sPoolSize = UView (Credential 'Staking) (KeyHash 'StakePool) -> Int
forall k v. UView k v -> Int
size (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView UMap
umap)
    dRepSize :: Int
dRepSize = UView (Credential 'Staking) DRep -> Int
forall k v. UView k v -> Int
size (UMap -> UView (Credential 'Staking) DRep
DRepUView UMap
umap)
  Map (Credential 'Staking) RDPair -> Int
forall k a. Map k a -> Int
Map.size Map (Credential 'Staking) RDPair
rdPairs Int -> Int -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` Int
rdPairsSize
  Map Ptr (Credential 'Staking) -> Int
forall k a. Map k a -> Int
Map.size Map Ptr (Credential 'Staking)
ptrs Int -> Int -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` Int
ptrsSize
  Map (Credential 'Staking) (KeyHash 'StakePool) -> Int
forall k a. Map k a -> Int
Map.size Map (Credential 'Staking) (KeyHash 'StakePool)
sPools Int -> Int -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` Int
sPoolSize
  Map (Credential 'Staking) DRep -> Int
forall k a. Map k a -> Int
Map.size Map (Credential 'Staking) DRep
dReps Int -> Int -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` Int
dRepSize

unifyRoundTripTo ::
  ( Map.Map (Credential 'Staking) RDPair
  , Map.Map Ptr (Credential 'Staking)
  , Map.Map (Credential 'Staking) (KeyHash 'StakePool)
  , Map.Map (Credential 'Staking) DRep
  ) ->
  IO ()
unifyRoundTripTo :: (Map (Credential 'Staking) RDPair, Map Ptr (Credential 'Staking),
 Map (Credential 'Staking) (KeyHash 'StakePool),
 Map (Credential 'Staking) DRep)
-> IO ()
unifyRoundTripTo (Map (Credential 'Staking) RDPair
rdPairs, Map Ptr (Credential 'Staking)
ptrs, Map (Credential 'Staking) (KeyHash 'StakePool)
sPools, Map (Credential 'Staking) DRep
dReps) = do
  let umap :: UMap
umap = Map (Credential 'Staking) RDPair
-> Map Ptr (Credential 'Staking)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) DRep
-> UMap
unify Map (Credential 'Staking) RDPair
rdPairs Map Ptr (Credential 'Staking)
ptrs Map (Credential 'Staking) (KeyHash 'StakePool)
sPools Map (Credential 'Staking) DRep
dReps
  UMap -> Map (Credential 'Staking) RDPair
rdPairMap UMap
umap Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` Map (Credential 'Staking) RDPair
rdPairs
  UMap -> Map Ptr (Credential 'Staking)
ptrMap UMap
umap Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` Map Ptr (Credential 'Staking)
ptrs
  UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap UMap
umap Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool) -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` Map (Credential 'Staking) (KeyHash 'StakePool)
sPools
  UMap -> Map (Credential 'Staking) DRep
dRepMap UMap
umap Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` Map (Credential 'Staking) DRep
dReps

unifyRoundTripFrom :: [Action] -> Property
unifyRoundTripFrom :: [Action] -> Property
unifyRoundTripFrom [Action]
actions =
  let
    umap :: UMap
umap = [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty
    rdPairs :: Map (Credential 'Staking) RDPair
rdPairs = UMap -> Map (Credential 'Staking) RDPair
rdPairMap UMap
umap
    ptrs :: Map Ptr (Credential 'Staking)
ptrs = UMap -> Map Ptr (Credential 'Staking)
ptrMap UMap
umap
    sPools :: Map (Credential 'Staking) (KeyHash 'StakePool)
sPools = UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap UMap
umap
    dReps :: Map (Credential 'Staking) DRep
dReps = UMap -> Map (Credential 'Staking) DRep
dRepMap UMap
umap
   in
    UMap
umap UMap -> UMap -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Map (Credential 'Staking) RDPair
-> Map Ptr (Credential 'Staking)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) DRep
-> UMap
unify Map (Credential 'Staking) RDPair
rdPairs Map Ptr (Credential 'Staking)
ptrs Map (Credential 'Staking) (KeyHash 'StakePool)
sPools Map (Credential 'Staking) DRep
dReps

oldUnionRewAgg ::
  UView (Credential 'Staking) RDPair ->
  Map (Credential 'Staking) (CompactForm Coin) ->
  UMap
(RewDepUView UMap {Map (Credential 'Staking) UMElem
umElems :: UMap -> Map (Credential 'Staking) UMElem
umElems :: Map (Credential 'Staking) UMElem
umElems, Map Ptr (Credential 'Staking)
umPtrs :: UMap -> Map Ptr (Credential 'Staking)
umPtrs :: Map Ptr (Credential 'Staking)
umPtrs}) oldUnionRewAgg :: UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) (CompactForm Coin) -> UMap
`oldUnionRewAgg` Map (Credential 'Staking) (CompactForm Coin)
aggRewMap = Map (Credential 'Staking) UMElem
-> Map Ptr (Credential 'Staking) -> UMap
UMap Map (Credential 'Staking) UMElem
newUmElem Map Ptr (Credential 'Staking)
umPtrs
  where
    newUmElem :: Map (Credential 'Staking) UMElem
newUmElem =
      let
        result :: Map (Credential 'Staking) UMElem
result = (Credential 'Staking -> UMElem -> CompactForm Coin -> Maybe UMElem)
-> (Map (Credential 'Staking) UMElem
    -> Map (Credential 'Staking) UMElem)
-> (Map (Credential 'Staking) (CompactForm Coin)
    -> Map (Credential 'Staking) UMElem)
-> Map (Credential 'Staking) UMElem
-> Map (Credential 'Staking) (CompactForm Coin)
-> Map (Credential 'Staking) UMElem
forall k a b c.
Ord k =>
(k -> a -> b -> Maybe c)
-> (Map k a -> Map k c)
-> (Map k b -> Map k c)
-> Map k a
-> Map k b
-> Map k c
Map.mergeWithKey Credential 'Staking -> UMElem -> CompactForm Coin -> Maybe UMElem
forall {p}. p -> UMElem -> CompactForm Coin -> Maybe UMElem
f Map (Credential 'Staking) UMElem
-> Map (Credential 'Staking) UMElem
forall a. a -> a
id (Map (Credential 'Staking) UMElem
-> Map (Credential 'Staking) (CompactForm Coin)
-> Map (Credential 'Staking) UMElem
forall a b. a -> b -> a
const Map (Credential 'Staking) UMElem
forall k a. Map k a
Map.empty) Map (Credential 'Staking) UMElem
umElems Map (Credential 'Staking) (CompactForm Coin)
aggRewMap
        f :: p -> UMElem -> CompactForm Coin -> Maybe UMElem
f p
_k (UMElem StrictMaybe RDPair
p1 Set Ptr
s StrictMaybe (KeyHash 'StakePool)
deposit StrictMaybe DRep
drep) CompactForm Coin
delta = UMElem -> Maybe UMElem
forall a. a -> Maybe a
Just (StrictMaybe RDPair
-> Set Ptr
-> StrictMaybe (KeyHash 'StakePool)
-> StrictMaybe DRep
-> UMElem
UMElem (CompactForm Coin -> StrictMaybe RDPair -> StrictMaybe RDPair
addC CompactForm Coin
delta StrictMaybe RDPair
p1) Set Ptr
s StrictMaybe (KeyHash 'StakePool)
deposit StrictMaybe DRep
drep)
       in
        -- We use Map.empty below because aggRewMap is a subset of umElems, we never add anything here.
        Bool
-> Map (Credential 'Staking) UMElem
-> Map (Credential 'Staking) UMElem
forall a. HasCallStack => Bool -> a -> a
assert (Map (Credential 'Staking) UMElem -> Bool
forall k a. Ord k => Map k a -> Bool
Map.valid Map (Credential 'Staking) UMElem
result) Map (Credential 'Staking) UMElem
result
    addC :: CompactForm Coin -> StrictMaybe RDPair -> StrictMaybe RDPair
    addC :: CompactForm Coin -> StrictMaybe RDPair -> StrictMaybe RDPair
addC CompactForm Coin
newR = \case
      StrictMaybe RDPair
SNothing -> StrictMaybe RDPair
forall a. StrictMaybe a
SNothing
      SJust (RDPair CompactForm Coin
r CompactForm Coin
d) -> RDPair -> StrictMaybe RDPair
forall a. a -> StrictMaybe a
SJust (RDPair -> StrictMaybe RDPair) -> RDPair -> StrictMaybe RDPair
forall a b. (a -> b) -> a -> b
$ CompactForm Coin -> CompactForm Coin -> RDPair
RDPair (CompactForm Coin -> CompactForm Coin -> CompactForm Coin
addCompactCoin CompactForm Coin
r CompactForm Coin
newR) CompactForm Coin
d

spec :: Spec
spec :: Spec
spec = do
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"UMap" (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
"Invariant" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> (Credential 'Staking -> Ptr -> Bool) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"Empty" (\(Credential 'Staking
cred :: Credential 'Staking) Ptr
ptr -> Credential 'Staking -> Ptr -> UMap -> Bool
umInvariant Credential 'Staking
cred Ptr
ptr UMap
empty)
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"Non-empty" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$
        Gen (Credential 'Staking, Ptr, UMap)
-> ((Credential 'Staking, Ptr, UMap) -> Bool) -> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll
          Gen (Credential 'Staking, Ptr, UMap)
genInvariantNonEmpty
          (\(Credential 'Staking
cred, Ptr
ptr, UMap
umap) -> Credential 'Staking -> Ptr -> UMap -> Bool
umInvariant Credential 'Staking
cred Ptr
ptr UMap
umap)
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
xprop String
"Non-empty with insert and delete actions" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$
        Gen ((Credential 'Staking, Ptr, UMap), [Action])
-> (((Credential 'Staking, Ptr, UMap), [Action]) -> Bool)
-> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll
          ((,) ((Credential 'Staking, Ptr, UMap)
 -> [Action] -> ((Credential 'Staking, Ptr, UMap), [Action]))
-> Gen (Credential 'Staking, Ptr, UMap)
-> Gen ([Action] -> ((Credential 'Staking, Ptr, UMap), [Action]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Credential 'Staking, Ptr, UMap)
genInvariantNonEmpty Gen ([Action] -> ((Credential 'Staking, Ptr, UMap), [Action]))
-> Gen [Action] -> Gen ((Credential 'Staking, Ptr, UMap), [Action])
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen [Action]
forall a. Arbitrary a => Gen a
arbitrary)
          (\((Credential 'Staking
cred, Ptr
ptr, UMap
umap), [Action]
actions) -> Credential 'Staking -> Ptr -> UMap -> Bool
umInvariant Credential 'Staking
cred Ptr
ptr (UMap -> Bool) -> UMap -> Bool
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
umap)
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Unify roundtrip" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"To" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ Gen
  (Map (Credential 'Staking) RDPair, Map Ptr (Credential 'Staking),
   Map (Credential 'Staking) (KeyHash 'StakePool),
   Map (Credential 'Staking) DRep)
-> ((Map (Credential 'Staking) RDPair,
     Map Ptr (Credential 'Staking),
     Map (Credential 'Staking) (KeyHash 'StakePool),
     Map (Credential 'Staking) DRep)
    -> IO ())
-> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll Gen
  (Map (Credential 'Staking) RDPair, Map Ptr (Credential 'Staking),
   Map (Credential 'Staking) (KeyHash 'StakePool),
   Map (Credential 'Staking) DRep)
genValidTuples (Map (Credential 'Staking) RDPair, Map Ptr (Credential 'Staking),
 Map (Credential 'Staking) (KeyHash 'StakePool),
 Map (Credential 'Staking) DRep)
-> IO ()
unifyRoundTripTo
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"From" [Action] -> Property
unifyRoundTripFrom
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Insert-delete roundtrip" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"RDPair" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$
        Gen (UMap, Credential 'Staking, RDPair)
-> ((UMap, Credential 'Staking, RDPair) -> Property) -> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll
          Gen (UMap, Credential 'Staking, RDPair)
genInsertDeleteRoundtripRDPair
          (\(UMap
umap, Credential 'Staking
k, RDPair
v) -> UMap
umap UMap -> UMap -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) RDPair -> UMap
forall k v. UView k v -> UMap
unUView (Credential 'Staking
-> UView (Credential 'Staking) RDPair
-> UView (Credential 'Staking) RDPair
forall k v. k -> UView k v -> UView k v
delete' Credential 'Staking
k (Credential 'Staking
-> RDPair
-> UView (Credential 'Staking) RDPair
-> UView (Credential 'Staking) RDPair
forall k v. k -> v -> UView k v -> UView k v
insert' Credential 'Staking
k RDPair
v (UMap -> UView (Credential 'Staking) RDPair
RewDepUView UMap
umap))))
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"PtrUView" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$
        Gen (UMap, Ptr, Credential 'Staking)
-> ((UMap, Ptr, Credential 'Staking) -> Property) -> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll
          Gen (UMap, Ptr, Credential 'Staking)
genInsertDeleteRoundtripPtr
          (\(UMap
umap, Ptr
k, Credential 'Staking
v) -> UMap
umap UMap -> UMap -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView Ptr (Credential 'Staking) -> UMap
forall k v. UView k v -> UMap
unUView (Ptr
-> UView Ptr (Credential 'Staking)
-> UView Ptr (Credential 'Staking)
forall k v. k -> UView k v -> UView k v
delete' Ptr
k (Ptr
-> Credential 'Staking
-> UView Ptr (Credential 'Staking)
-> UView Ptr (Credential 'Staking)
forall k v. k -> v -> UView k v -> UView k v
insert' Ptr
k Credential 'Staking
v (UMap -> UView Ptr (Credential 'Staking)
PtrUView UMap
umap))))
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"SPoolUView" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$
        Gen (UMap, Credential 'Staking, KeyHash 'StakePool)
-> ((UMap, Credential 'Staking, KeyHash 'StakePool) -> Property)
-> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll
          Gen (UMap, Credential 'Staking, KeyHash 'StakePool)
genInsertDeleteRoundtripSPool
          (\(UMap
umap, Credential 'Staking
k, KeyHash 'StakePool
v) -> UMap
umap UMap -> UMap -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) (KeyHash 'StakePool) -> UMap
forall k v. UView k v -> UMap
unUView (Credential 'Staking
-> UView (Credential 'Staking) (KeyHash 'StakePool)
-> UView (Credential 'Staking) (KeyHash 'StakePool)
forall k v. k -> UView k v -> UView k v
delete' Credential 'Staking
k (Credential 'Staking
-> KeyHash 'StakePool
-> UView (Credential 'Staking) (KeyHash 'StakePool)
-> UView (Credential 'Staking) (KeyHash 'StakePool)
forall k v. k -> v -> UView k v -> UView k v
insert' Credential 'Staking
k KeyHash 'StakePool
v (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView UMap
umap))))
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"DRepUView" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$
        Gen (UMap, Credential 'Staking, DRep)
-> ((UMap, Credential 'Staking, DRep) -> Property) -> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll
          Gen (UMap, Credential 'Staking, DRep)
genInsertDeleteRoundtripDRep
          (\(UMap
umap, Credential 'Staking
k, DRep
v) -> UMap
umap UMap -> UMap -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) DRep -> UMap
forall k v. UView k v -> UMap
unUView (Credential 'Staking
-> UView (Credential 'Staking) DRep
-> UView (Credential 'Staking) DRep
forall k v. k -> UView k v -> UView k v
delete' Credential 'Staking
k (Credential 'Staking
-> DRep
-> UView (Credential 'Staking) DRep
-> UView (Credential 'Staking) DRep
forall k v. k -> v -> UView k v -> UView k v
insert' Credential 'Staking
k DRep
v (UMap -> UView (Credential 'Staking) DRep
DRepUView UMap
umap))))
    String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"Size" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ Gen
  (Map (Credential 'Staking) RDPair, Map Ptr (Credential 'Staking),
   Map (Credential 'Staking) (KeyHash 'StakePool),
   Map (Credential 'Staking) DRep)
-> ((Map (Credential 'Staking) RDPair,
     Map Ptr (Credential 'Staking),
     Map (Credential 'Staking) (KeyHash 'StakePool),
     Map (Credential 'Staking) DRep)
    -> IO ())
-> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll Gen
  (Map (Credential 'Staking) RDPair, Map Ptr (Credential 'Staking),
   Map (Credential 'Staking) (KeyHash 'StakePool),
   Map (Credential 'Staking) DRep)
genValidTuples (Map (Credential 'Staking) RDPair, Map Ptr (Credential 'Staking),
 Map (Credential 'Staking) (KeyHash 'StakePool),
 Map (Credential 'Staking) DRep)
-> IO ()
sizeTest
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Membership" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> ((UMap, Credential 'Staking) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \(UMap
umap :: UMap, Credential 'Staking
cred) ->
            Credential 'Staking -> UView (Credential 'Staking) RDPair -> Bool
forall k v. k -> UView k v -> Bool
member Credential 'Staking
cred (UMap -> UView (Credential 'Staking) RDPair
RewDepUView UMap
umap) Bool -> Bool -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Credential 'Staking -> Map (Credential 'Staking) RDPair -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member Credential 'Staking
cred (UMap -> Map (Credential 'Staking) RDPair
rdPairMap UMap
umap)
        )
      String -> ((UMap, Ptr) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUViews"
        ( \(UMap
umap :: UMap, Ptr
ptr) ->
            Ptr -> UView Ptr (Credential 'Staking) -> Bool
forall k v. k -> UView k v -> Bool
member Ptr
ptr (UMap -> UView Ptr (Credential 'Staking)
PtrUView UMap
umap) Bool -> Bool -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Ptr -> Map Ptr (Credential 'Staking) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member Ptr
ptr (UMap -> Map Ptr (Credential 'Staking)
ptrMap UMap
umap)
        )
      String -> ((UMap, Credential 'Staking) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \(UMap
umap :: UMap, Credential 'Staking
cred) ->
            Credential 'Staking
-> UView (Credential 'Staking) (KeyHash 'StakePool) -> Bool
forall k v. k -> UView k v -> Bool
member Credential 'Staking
cred (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView UMap
umap) Bool -> Bool -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Credential 'Staking
-> Map (Credential 'Staking) (KeyHash 'StakePool) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member Credential 'Staking
cred (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap UMap
umap)
        )
      String -> ((UMap, Credential 'Staking) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \(UMap
umap :: UMap, Credential 'Staking
cred) ->
            Credential 'Staking -> UView (Credential 'Staking) DRep -> Bool
forall k v. k -> UView k v -> Bool
member Credential 'Staking
cred (UMap -> UView (Credential 'Staking) DRep
DRepUView UMap
umap) Bool -> Bool -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Credential 'Staking -> Map (Credential 'Staking) DRep -> Bool
forall k a. Ord k => k -> Map k a -> Bool
Map.member Credential 'Staking
cred (UMap -> Map (Credential 'Staking) DRep
dRepMap UMap
umap)
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Bisimulation" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \[Action]
actions ->
            UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
empty)
              Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUView"
        ( \[Action]
actions ->
            UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty)
              Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions ->
            UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty)
              Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions ->
            UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty)
              Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Null" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \[Action]
actions ->
            Map (Credential 'Staking) RDPair -> Bool
forall k a. Map k a -> Bool
Map.null (UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
empty))
              Bool -> Bool -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) RDPair -> Bool
forall k v. UView k v -> Bool
nullUView (UMap -> UView (Credential 'Staking) RDPair
RewDepUView (UMap -> UView (Credential 'Staking) RDPair)
-> UMap -> UView (Credential 'Staking) RDPair
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUView"
        ( \[Action]
actions ->
            Map Ptr (Credential 'Staking) -> Bool
forall k a. Map k a -> Bool
Map.null (UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty))
              Bool -> Bool -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView Ptr (Credential 'Staking) -> Bool
forall k v. UView k v -> Bool
nullUView (UMap -> UView Ptr (Credential 'Staking)
PtrUView (UMap -> UView Ptr (Credential 'Staking))
-> UMap -> UView Ptr (Credential 'Staking)
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions ->
            Map (Credential 'Staking) (KeyHash 'StakePool) -> Bool
forall k a. Map k a -> Bool
Map.null (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty))
              Bool -> Bool -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) (KeyHash 'StakePool) -> Bool
forall k v. UView k v -> Bool
nullUView (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool))
-> UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions ->
            Map (Credential 'Staking) DRep -> Bool
forall k a. Map k a -> Bool
Map.null (UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty))
              Bool -> Bool -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) DRep -> Bool
forall k v. UView k v -> Bool
nullUView (UMap -> UView (Credential 'Staking) DRep
DRepUView (UMap -> UView (Credential 'Staking) DRep)
-> UMap -> UView (Credential 'Staking) DRep
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Lookup" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> ([Action] -> Credential 'Staking -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \[Action]
actions Credential 'Staking
cred ->
            Credential 'Staking
-> Map (Credential 'Staking) RDPair -> Maybe RDPair
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Credential 'Staking
cred (UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
empty))
              Maybe RDPair -> Maybe RDPair -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Credential 'Staking
-> UView (Credential 'Staking) RDPair -> Maybe RDPair
forall k v. k -> UView k v -> Maybe v
UMap.lookup Credential 'Staking
cred (UMap -> UView (Credential 'Staking) RDPair
RewDepUView (UMap -> UView (Credential 'Staking) RDPair)
-> UMap -> UView (Credential 'Staking) RDPair
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Ptr -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtruView"
        ( \[Action]
actions Ptr
ptr ->
            Ptr -> Map Ptr (Credential 'Staking) -> Maybe (Credential 'Staking)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Ptr
ptr (UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty))
              Maybe (Credential 'Staking)
-> Maybe (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Ptr
-> UView Ptr (Credential 'Staking) -> Maybe (Credential 'Staking)
forall k v. k -> UView k v -> Maybe v
UMap.lookup Ptr
ptr (UMap -> UView Ptr (Credential 'Staking)
PtrUView (UMap -> UView Ptr (Credential 'Staking))
-> UMap -> UView Ptr (Credential 'Staking)
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Credential 'Staking -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions Credential 'Staking
cred ->
            Credential 'Staking
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Maybe (KeyHash 'StakePool)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Credential 'Staking
cred (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty))
              Maybe (KeyHash 'StakePool)
-> Maybe (KeyHash 'StakePool) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Credential 'Staking
-> UView (Credential 'Staking) (KeyHash 'StakePool)
-> Maybe (KeyHash 'StakePool)
forall k v. k -> UView k v -> Maybe v
UMap.lookup Credential 'Staking
cred (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool))
-> UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Credential 'Staking -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions Credential 'Staking
cred ->
            Credential 'Staking -> Map (Credential 'Staking) DRep -> Maybe DRep
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Credential 'Staking
cred (UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty))
              Maybe DRep -> Maybe DRep -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Credential 'Staking
-> UView (Credential 'Staking) DRep -> Maybe DRep
forall k v. k -> UView k v -> Maybe v
UMap.lookup Credential 'Staking
cred (UMap -> UView (Credential 'Staking) DRep
DRepUView (UMap -> UView (Credential 'Staking) DRep)
-> UMap -> UView (Credential 'Staking) DRep
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Domain" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \[Action]
actions ->
            Map (Credential 'Staking) RDPair -> Set (Credential 'Staking)
forall k a. Map k a -> Set k
Map.keysSet (UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
empty))
              Set (Credential 'Staking) -> Set (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) RDPair -> Set (Credential 'Staking)
forall k v. UView k v -> Set k
domain (UMap -> UView (Credential 'Staking) RDPair
RewDepUView (UMap -> UView (Credential 'Staking) RDPair)
-> UMap -> UView (Credential 'Staking) RDPair
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUView"
        ( \[Action]
actions ->
            Map Ptr (Credential 'Staking) -> Set Ptr
forall k a. Map k a -> Set k
Map.keysSet (UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty))
              Set Ptr -> Set Ptr -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView Ptr (Credential 'Staking) -> Set Ptr
forall k v. UView k v -> Set k
domain (UMap -> UView Ptr (Credential 'Staking)
PtrUView (UMap -> UView Ptr (Credential 'Staking))
-> UMap -> UView Ptr (Credential 'Staking)
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions ->
            Map (Credential 'Staking) (KeyHash 'StakePool)
-> Set (Credential 'Staking)
forall k a. Map k a -> Set k
Map.keysSet (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty))
              Set (Credential 'Staking) -> Set (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) (KeyHash 'StakePool)
-> Set (Credential 'Staking)
forall k v. UView k v -> Set k
domain (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool))
-> UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions ->
            Map (Credential 'Staking) DRep -> Set (Credential 'Staking)
forall k a. Map k a -> Set k
Map.keysSet (UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty))
              Set (Credential 'Staking) -> Set (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) DRep -> Set (Credential 'Staking)
forall k v. UView k v -> Set k
domain (UMap -> UView (Credential 'Staking) DRep
DRepUView (UMap -> UView (Credential 'Staking) DRep)
-> UMap -> UView (Credential 'Staking) DRep
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Range" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \[Action]
actions ->
            [RDPair] -> Set RDPair
forall a. Ord a => [a] -> Set a
Set.fromList (Map (Credential 'Staking) RDPair -> [RDPair]
forall k a. Map k a -> [a]
Map.elems (UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
empty)))
              Set RDPair -> Set RDPair -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) RDPair -> Set RDPair
forall k v. UView k v -> Set v
range (UMap -> UView (Credential 'Staking) RDPair
RewDepUView (UMap -> UView (Credential 'Staking) RDPair)
-> UMap -> UView (Credential 'Staking) RDPair
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUView"
        ( \[Action]
actions ->
            [Credential 'Staking] -> Set (Credential 'Staking)
forall a. Ord a => [a] -> Set a
Set.fromList (Map Ptr (Credential 'Staking) -> [Credential 'Staking]
forall k a. Map k a -> [a]
Map.elems (UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty)))
              Set (Credential 'Staking) -> Set (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView Ptr (Credential 'Staking) -> Set (Credential 'Staking)
forall k v. UView k v -> Set v
range (UMap -> UView Ptr (Credential 'Staking)
PtrUView (UMap -> UView Ptr (Credential 'Staking))
-> UMap -> UView Ptr (Credential 'Staking)
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions ->
            [KeyHash 'StakePool] -> Set (KeyHash 'StakePool)
forall a. Ord a => [a] -> Set a
Set.fromList (Map (Credential 'Staking) (KeyHash 'StakePool)
-> [KeyHash 'StakePool]
forall k a. Map k a -> [a]
Map.elems (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty)))
              Set (KeyHash 'StakePool) -> Set (KeyHash 'StakePool) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) (KeyHash 'StakePool)
-> Set (KeyHash 'StakePool)
forall k v. UView k v -> Set v
range (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool))
-> UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
      String -> ([Action] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions ->
            [DRep] -> Set DRep
forall a. Ord a => [a] -> Set a
Set.fromList (Map (Credential 'Staking) DRep -> [DRep]
forall k a. Map k a -> [a]
Map.elems (UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty)))
              Set DRep -> Set DRep -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) DRep -> Set DRep
forall k v. UView k v -> Set v
range (UMap -> UView (Credential 'Staking) DRep
DRepUView (UMap -> UView (Credential 'Staking) DRep)
-> UMap -> UView (Credential 'Staking) DRep
forall a b. (a -> b) -> a -> b
$ [Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Union (left preference)" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String
-> ([Action] -> Credential 'Staking -> RDPair -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \[Action]
actions Credential 'Staking
cred RDPair
rdPair ->
            (RDPair -> RDPair -> RDPair)
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith RDPair -> RDPair -> RDPair
forall a b. a -> b -> a
const (UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
empty)) (Credential 'Staking -> RDPair -> Map (Credential 'Staking) RDPair
forall k a. k -> a -> Map k a
Map.singleton Credential 'Staking
cred RDPair
rdPair)
              Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) RDPair
RewDepUView (UMap -> UView (Credential 'Staking) RDPair
RewDepUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView (Credential 'Staking) RDPair
-> (Credential 'Staking, RDPair) -> UMap
forall k v. UView k v -> (k, v) -> UMap
 (Credential 'Staking
cred, RDPair
rdPair)))
        )
      String
-> ([Action] -> Ptr -> Credential 'Staking -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUView"
        ( \[Action]
actions Ptr
cred Credential 'Staking
ptr ->
            (Credential 'Staking -> Credential 'Staking -> Credential 'Staking)
-> Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking)
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith Credential 'Staking -> Credential 'Staking -> Credential 'Staking
forall a b. a -> b -> a
const (UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty)) (Ptr -> Credential 'Staking -> Map Ptr (Credential 'Staking)
forall k a. k -> a -> Map k a
Map.singleton Ptr
cred Credential 'Staking
ptr)
              Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall k v. UView k v -> Map k v
unUnify (UMap -> UView Ptr (Credential 'Staking)
PtrUView (UMap -> UView Ptr (Credential 'Staking)
PtrUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView Ptr (Credential 'Staking)
-> (Ptr, Credential 'Staking) -> UMap
forall k v. UView k v -> (k, v) -> UMap
 (Ptr
cred, Credential 'Staking
ptr)))
        )
      String
-> ([Action]
    -> Credential 'Staking -> KeyHash 'StakePool -> Property)
-> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions Credential 'Staking
cred KeyHash 'StakePool
pool ->
            (KeyHash 'StakePool -> KeyHash 'StakePool -> KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith KeyHash 'StakePool -> KeyHash 'StakePool -> KeyHash 'StakePool
forall a b. a -> b -> a
const (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty)) (Credential 'Staking
-> KeyHash 'StakePool
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k a. k -> a -> Map k a
Map.singleton Credential 'Staking
cred KeyHash 'StakePool
pool)
              Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView (Credential 'Staking) (KeyHash 'StakePool)
-> (Credential 'Staking, KeyHash 'StakePool) -> UMap
forall k v. UView k v -> (k, v) -> UMap
 (Credential 'Staking
cred, KeyHash 'StakePool
pool)))
        )
      String
-> ([Action] -> Credential 'Staking -> DRep -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions Credential 'Staking
cred DRep
pool ->
            (DRep -> DRep -> DRep)
-> Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith DRep -> DRep -> DRep
forall a b. a -> b -> a
const (UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty)) (Credential 'Staking -> DRep -> Map (Credential 'Staking) DRep
forall k a. k -> a -> Map k a
Map.singleton Credential 'Staking
cred DRep
pool)
              Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) DRep -> Map (Credential 'Staking) DRep
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) DRep
DRepUView (UMap -> UView (Credential 'Staking) DRep
DRepUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView (Credential 'Staking) DRep
-> (Credential 'Staking, DRep) -> UMap
forall k v. UView k v -> (k, v) -> UMap
 (Credential 'Staking
cred, DRep
pool)))
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Union (right preference)" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView (domain of map on the right has to be subset of RewDepUView View)"
        (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ Gen (UMap, Map (Credential 'Staking) RDPair)
-> ((UMap, Map (Credential 'Staking) RDPair) -> Property)
-> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll
          Gen (UMap, Map (Credential 'Staking) RDPair)
genRightPreferenceUMap
          ( \(UMap
umap, Map (Credential 'Staking) RDPair
m) ->
              (RDPair -> RDPair -> RDPair)
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith
                (\(RDPair CompactForm Coin
_ CompactForm Coin
leftDep) (RDPair CompactForm Coin
rightRD CompactForm Coin
_) -> CompactForm Coin -> CompactForm Coin -> RDPair
RDPair CompactForm Coin
rightRD CompactForm Coin
leftDep)
                (UMap -> Map (Credential 'Staking) RDPair
rdPairMap UMap
umap)
                Map (Credential 'Staking) RDPair
m
                Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UMap -> Map (Credential 'Staking) RDPair
rdPairMap (UMap -> UView (Credential 'Staking) RDPair
RewDepUView UMap
umap UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair -> UMap
forall k v. UView k v -> Map k v -> UMap
 Map (Credential 'Staking) RDPair
m)
          )
      String
-> ([Action] -> Map Ptr (Credential 'Staking) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUView"
        ( \[Action]
actions Map Ptr (Credential 'Staking)
m ->
            (Credential 'Staking -> Credential 'Staking -> Credential 'Staking)
-> Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking)
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith (\Credential 'Staking
_ Credential 'Staking
x -> Credential 'Staking
x) (UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty)) Map Ptr (Credential 'Staking)
m
              Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall k v. UView k v -> Map k v
unUnify (UMap -> UView Ptr (Credential 'Staking)
PtrUView (UMap -> UView Ptr (Credential 'Staking)
PtrUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> UMap
forall k v. UView k v -> Map k v -> UMap
 Map Ptr (Credential 'Staking)
m))
        )
      String
-> ([Action]
    -> Map (Credential 'Staking) (KeyHash 'StakePool) -> Property)
-> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions Map (Credential 'Staking) (KeyHash 'StakePool)
m ->
            (KeyHash 'StakePool -> KeyHash 'StakePool -> KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith (\KeyHash 'StakePool
_ KeyHash 'StakePool
x -> KeyHash 'StakePool
x) (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty)) Map (Credential 'Staking) (KeyHash 'StakePool)
m
              Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool) -> UMap
forall k v. UView k v -> Map k v -> UMap
 Map (Credential 'Staking) (KeyHash 'StakePool)
m))
        )
      String
-> ([Action] -> Map (Credential 'Staking) DRep -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions Map (Credential 'Staking) DRep
m ->
            (DRep -> DRep -> DRep)
-> Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith (\DRep
_ DRep
x -> DRep
x) (UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty)) Map (Credential 'Staking) DRep
m
              Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) DRep -> Map (Credential 'Staking) DRep
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) DRep
DRepUView (UMap -> UView (Credential 'Staking) DRep
DRepUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> UMap
forall k v. UView k v -> Map k v -> UMap
 Map (Credential 'Staking) DRep
m))
        )
    String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
      String
"Monoidal Rewards (domain of map on the right has to be subset of RewDepUView View)"
      (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ Gen (UMap, Map (Credential 'Staking) RDPair)
-> ((UMap, Map (Credential 'Staking) RDPair) -> Property)
-> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll
        Gen (UMap, Map (Credential 'Staking) RDPair)
genRightPreferenceUMap
        ( \(UMap
umap, Map (Credential 'Staking) RDPair
m) ->
            (CompactForm Coin -> CompactForm Coin -> CompactForm Coin)
-> Map (Credential 'Staking) (CompactForm Coin)
-> Map (Credential 'Staking) (CompactForm Coin)
-> Map (Credential 'Staking) (CompactForm Coin)
forall k a. Ord k => (a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWith CompactForm Coin -> CompactForm Coin -> CompactForm Coin
forall a. Semigroup a => a -> a -> a
(<>) (UMap -> Map (Credential 'Staking) (CompactForm Coin)
compactRewardMap UMap
umap) (RDPair -> CompactForm Coin
rdReward (RDPair -> CompactForm Coin)
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) (CompactForm Coin)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map (Credential 'Staking) RDPair
m)
              Map (Credential 'Staking) (CompactForm Coin)
-> Map (Credential 'Staking) (CompactForm Coin) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UMap -> Map (Credential 'Staking) (CompactForm Coin)
compactRewardMap (UMap -> UView (Credential 'Staking) RDPair
RewDepUView UMap
umap UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) (CompactForm Coin) -> UMap
∪+ (RDPair -> CompactForm Coin
rdReward (RDPair -> CompactForm Coin)
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) (CompactForm Coin)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map (Credential 'Staking) RDPair
m))
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Domain exclusion" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String
-> ([Action] -> Set (Credential 'Staking) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \[Action]
actions Set (Credential 'Staking)
dom ->
            Map (Credential 'Staking) RDPair
-> Set (Credential 'Staking) -> Map (Credential 'Staking) RDPair
forall k a. Ord k => Map k a -> Set k -> Map k a
Map.withoutKeys (UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
empty)) Set (Credential 'Staking)
dom
              Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) RDPair
RewDepUView (Set (Credential 'Staking)
dom Set (Credential 'Staking)
-> UView (Credential 'Staking) RDPair -> UMap
forall k v. Set k -> UView k v -> UMap
 UMap -> UView (Credential 'Staking) RDPair
RewDepUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)))
        )
      String -> ([Action] -> Set Ptr -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUView"
        ( \[Action]
actions Set Ptr
dom ->
            Map Ptr (Credential 'Staking)
-> Set Ptr -> Map Ptr (Credential 'Staking)
forall k a. Ord k => Map k a -> Set k -> Map k a
Map.withoutKeys (UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty)) Set Ptr
dom
              Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall k v. UView k v -> Map k v
unUnify (UMap -> UView Ptr (Credential 'Staking)
PtrUView (Set Ptr
dom Set Ptr -> UView Ptr (Credential 'Staking) -> UMap
forall k v. Set k -> UView k v -> UMap
 UMap -> UView Ptr (Credential 'Staking)
PtrUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)))
        )
      String
-> ([Action] -> Set (Credential 'Staking) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions Set (Credential 'Staking)
dom ->
            Map (Credential 'Staking) (KeyHash 'StakePool)
-> Set (Credential 'Staking)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k a. Ord k => Map k a -> Set k -> Map k a
Map.withoutKeys (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty)) Set (Credential 'Staking)
dom
              Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView (Set (Credential 'Staking)
dom Set (Credential 'Staking)
-> UView (Credential 'Staking) (KeyHash 'StakePool) -> UMap
forall k v. Set k -> UView k v -> UMap
 UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)))
        )
      String
-> ([Action] -> Set (Credential 'Staking) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions Set (Credential 'Staking)
dom ->
            Map (Credential 'Staking) DRep
-> Set (Credential 'Staking) -> Map (Credential 'Staking) DRep
forall k a. Ord k => Map k a -> Set k -> Map k a
Map.withoutKeys (UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty)) Set (Credential 'Staking)
dom
              Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) DRep -> Map (Credential 'Staking) DRep
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) DRep
DRepUView (Set (Credential 'Staking)
dom Set (Credential 'Staking)
-> UView (Credential 'Staking) DRep -> UMap
forall k v. Set k -> UView k v -> UMap
 UMap -> UView (Credential 'Staking) DRep
DRepUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)))
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Range exclusion" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> ([Action] -> Set RDPair -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \[Action]
actions Set RDPair
rng ->
            (RDPair -> Bool)
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (Bool -> Bool
not (Bool -> Bool) -> (RDPair -> Bool) -> RDPair -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (RDPair -> Set RDPair -> Bool) -> Set RDPair -> RDPair -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip RDPair -> Set RDPair -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Set RDPair
rng) (UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
empty))
              Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) RDPair
RewDepUView (UMap -> UView (Credential 'Staking) RDPair
RewDepUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView (Credential 'Staking) RDPair -> Set RDPair -> UMap
forall k v. UView k v -> Set v -> UMap
 Set RDPair
rng))
        )
      String
-> ([Action] -> Set (Credential 'Staking) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUView"
        ( \[Action]
actions Set (Credential 'Staking)
rng ->
            (Credential 'Staking -> Bool)
-> Map Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (Bool -> Bool
not (Bool -> Bool)
-> (Credential 'Staking -> Bool) -> Credential 'Staking -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Credential 'Staking -> Set (Credential 'Staking) -> Bool)
-> Set (Credential 'Staking) -> Credential 'Staking -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip Credential 'Staking -> Set (Credential 'Staking) -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Set (Credential 'Staking)
rng) (UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty))
              Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall k v. UView k v -> Map k v
unUnify (UMap -> UView Ptr (Credential 'Staking)
PtrUView (UMap -> UView Ptr (Credential 'Staking)
PtrUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView Ptr (Credential 'Staking)
-> Set (Credential 'Staking) -> UMap
forall k v. UView k v -> Set v -> UMap
 Set (Credential 'Staking)
rng))
        )
      String
-> ([Action] -> Set (KeyHash 'StakePool) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions Set (KeyHash 'StakePool)
rng ->
            (KeyHash 'StakePool -> Bool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (Bool -> Bool
not (Bool -> Bool)
-> (KeyHash 'StakePool -> Bool) -> KeyHash 'StakePool -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (KeyHash 'StakePool -> Set (KeyHash 'StakePool) -> Bool)
-> Set (KeyHash 'StakePool) -> KeyHash 'StakePool -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip KeyHash 'StakePool -> Set (KeyHash 'StakePool) -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Set (KeyHash 'StakePool)
rng) (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty))
              Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView (Credential 'Staking) (KeyHash 'StakePool)
-> Set (KeyHash 'StakePool) -> UMap
forall k v. UView k v -> Set v -> UMap
 Set (KeyHash 'StakePool)
rng))
        )
      String -> ([Action] -> Set DRep -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions Set DRep
rng ->
            (DRep -> Bool)
-> Map (Credential 'Staking) DRep -> Map (Credential 'Staking) DRep
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (Bool -> Bool
not (Bool -> Bool) -> (DRep -> Bool) -> DRep -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DRep -> Set DRep -> Bool) -> Set DRep -> DRep -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip DRep -> Set DRep -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member Set DRep
rng) (UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty))
              Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) DRep -> Map (Credential 'Staking) DRep
forall k v. UView k v -> Map k v
unUnify (UMap -> UView (Credential 'Staking) DRep
DRepUView (UMap -> UView (Credential 'Staking) DRep
DRepUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty) UView (Credential 'Staking) DRep -> Set DRep -> UMap
forall k v. UView k v -> Set v -> UMap
 Set DRep
rng))
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Domain restriction" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String
-> ([Action] -> Map (Credential 'Staking) RDPair -> Property)
-> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"RewDepUView"
        ( \[Action]
actions (Map (Credential 'Staking) RDPair
m :: Map.Map (Credential 'Staking) RDPair) ->
            Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.intersection Map (Credential 'Staking) RDPair
m (UMap -> Map (Credential 'Staking) RDPair
rdPairMap ([Action] -> UMap -> UMap
runRDPairs [Action]
actions UMap
empty))
              Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
forall k v u. UView k v -> Map k u -> Map k u
domRestrict (UMap -> UView (Credential 'Staking) RDPair
RewDepUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)) Map (Credential 'Staking) RDPair
m
        )
      String
-> ([Action] -> Map Ptr (Credential 'Staking) -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"PtrUView"
        ( \[Action]
actions (Map Ptr (Credential 'Staking)
m :: Map.Map Ptr (Credential 'Staking)) ->
            Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.intersection Map Ptr (Credential 'Staking)
m (UMap -> Map Ptr (Credential 'Staking)
ptrMap ([Action] -> UMap -> UMap
runPtrs [Action]
actions UMap
empty))
              Map Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView Ptr (Credential 'Staking)
-> Map Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall k v u. UView k v -> Map k u -> Map k u
domRestrict (UMap -> UView Ptr (Credential 'Staking)
PtrUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)) Map Ptr (Credential 'Staking)
m
        )
      String
-> ([Action]
    -> Map (Credential 'Staking) (KeyHash 'StakePool) -> Property)
-> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"SPoolUView"
        ( \[Action]
actions (Map (Credential 'Staking) (KeyHash 'StakePool)
m :: Map.Map (Credential 'Staking) (KeyHash 'StakePool)) ->
            Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.intersection Map (Credential 'Staking) (KeyHash 'StakePool)
m (UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap ([Action] -> UMap -> UMap
runSPools [Action]
actions UMap
empty))
              Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool) -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k v u. UView k v -> Map k u -> Map k u
domRestrict (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)) Map (Credential 'Staking) (KeyHash 'StakePool)
m
        )
      String
-> ([Action] -> Map (Credential 'Staking) DRep -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"DRepUView"
        ( \[Action]
actions (Map (Credential 'Staking) DRep
m :: Map.Map (Credential 'Staking) DRep) ->
            Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> Map (Credential 'Staking) DRep
forall k a b. Ord k => Map k a -> Map k b -> Map k a
Map.intersection Map (Credential 'Staking) DRep
m (UMap -> Map (Credential 'Staking) DRep
dRepMap ([Action] -> UMap -> UMap
runDReps [Action]
actions UMap
empty))
              Map (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UView (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep -> Map (Credential 'Staking) DRep
forall k v u. UView k v -> Map k u -> Map k u
domRestrict (UMap -> UView (Credential 'Staking) DRep
DRepUView ([Action] -> UMap -> UMap
runActions [Action]
actions UMap
empty)) Map (Credential 'Staking) DRep
m
        )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"Old and new implementation is equivalent" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop
        String
"unionRewAgg or ∪+ === oldUnionRewAgg"
        (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ Gen (UMap, Map (Credential 'Staking) RDPair)
-> ((UMap, Map (Credential 'Staking) RDPair) -> Property)
-> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll
          Gen (UMap, Map (Credential 'Staking) RDPair)
genRightPreferenceUMap
          ( \(UMap
umap, Map (Credential 'Staking) RDPair
m) ->
              UMap -> UView (Credential 'Staking) RDPair
RewDepUView UMap
umap UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) (CompactForm Coin) -> UMap
∪+ (RDPair -> CompactForm Coin
rdReward (RDPair -> CompactForm Coin)
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) (CompactForm Coin)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map (Credential 'Staking) RDPair
m) UMap -> UMap -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== UMap -> UView (Credential 'Staking) RDPair
RewDepUView UMap
umap UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) (CompactForm Coin) -> UMap
`oldUnionRewAgg` (RDPair -> CompactForm Coin
rdReward (RDPair -> CompactForm Coin)
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) (CompactForm Coin)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map (Credential 'Staking) RDPair
m)
          )
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"StakeCredentials" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"toStakeCredentials as full domRestrictedStakeCredentials" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$
        Gen UMap -> (UMap -> IO ()) -> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll Gen UMap
genValidUMap ((UMap -> IO ()) -> Property) -> (UMap -> IO ()) -> Property
forall a b. (a -> b) -> a -> b
$ \UMap
umap ->
          UMap -> StakeCredentials
toStakeCredentials UMap
umap
            StakeCredentials -> StakeCredentials -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` Set (Credential 'Staking) -> UMap -> StakeCredentials
domRestrictedStakeCredentials (Map (Credential 'Staking) UMElem -> Set (Credential 'Staking)
forall k a. Map k a -> Set k
Map.keysSet (UMap -> Map (Credential 'Staking) UMElem
umElems UMap
umap)) UMap
umap

      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"domRestrictedStakeCredentials" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$ Gen (UMap, Set (Credential 'Staking))
-> ((UMap, Set (Credential 'Staking)) -> IO ()) -> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll Gen (UMap, Set (Credential 'Staking))
genValidUMapWithCreds (((UMap, Set (Credential 'Staking)) -> IO ()) -> Property)
-> ((UMap, Set (Credential 'Staking)) -> IO ()) -> Property
forall a b. (a -> b) -> a -> b
$ \(UMap
umap, Set (Credential 'Staking)
creds) ->
        Set (Credential 'Staking) -> UMap -> StakeCredentials
domRestrictedStakeCredentials Set (Credential 'Staking)
creds UMap
umap
          StakeCredentials -> StakeCredentials -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` StakeCredentials
            { scRewards :: Map (Credential 'Staking) Coin
scRewards = UMap -> Map (Credential 'Staking) Coin
rewardMap UMap
umap Map (Credential 'Staking) Coin
-> Set (Credential 'Staking) -> Map (Credential 'Staking) Coin
forall k a. Ord k => Map k a -> Set k -> Map k a
`Map.restrictKeys` Set (Credential 'Staking)
creds
            , scDeposits :: Map (Credential 'Staking) Coin
scDeposits = UMap -> Map (Credential 'Staking) Coin
depositMap UMap
umap Map (Credential 'Staking) Coin
-> Set (Credential 'Staking) -> Map (Credential 'Staking) Coin
forall k a. Ord k => Map k a -> Set k -> Map k a
`Map.restrictKeys` Set (Credential 'Staking)
creds
            , scSPools :: Map (Credential 'Staking) (KeyHash 'StakePool)
scSPools = UMap -> Map (Credential 'Staking) (KeyHash 'StakePool)
sPoolMap UMap
umap Map (Credential 'Staking) (KeyHash 'StakePool)
-> Set (Credential 'Staking)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k a. Ord k => Map k a -> Set k -> Map k a
`Map.restrictKeys` Set (Credential 'Staking)
creds
            , scDReps :: Map (Credential 'Staking) DRep
scDReps = UMap -> Map (Credential 'Staking) DRep
dRepMap UMap
umap Map (Credential 'Staking) DRep
-> Set (Credential 'Staking) -> Map (Credential 'Staking) DRep
forall k a. Ord k => Map k a -> Set k -> Map k a
`Map.restrictKeys` Set (Credential 'Staking)
creds
            , scPtrs :: Map Ptr (Credential 'Staking)
scPtrs = (Credential 'Staking -> Bool)
-> Map Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (Credential 'Staking -> Set (Credential 'Staking) -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set (Credential 'Staking)
creds) (Map Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking))
-> Map Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall a b. (a -> b) -> a -> b
$ UMap -> Map Ptr (Credential 'Staking)
ptrMap UMap
umap
            , scPtrsInverse :: Map (Credential 'Staking) (Set Ptr)
scPtrsInverse = UMap -> Map (Credential 'Staking) (Set Ptr)
invPtrMap UMap
umap Map (Credential 'Staking) (Set Ptr)
-> Set (Credential 'Staking) -> Map (Credential 'Staking) (Set Ptr)
forall k a. Ord k => Map k a -> Set k -> Map k a
`Map.restrictKeys` Set (Credential 'Staking)
creds
            }
      String -> Property -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"domRestrictedStakeCredentials with domRestrictedMap" (Property -> Spec) -> Property -> Spec
forall a b. (a -> b) -> a -> b
$
        Gen (UMap, Set (Credential 'Staking))
-> ((UMap, Set (Credential 'Staking)) -> IO ()) -> Property
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll Gen (UMap, Set (Credential 'Staking))
genValidUMapWithCreds (((UMap, Set (Credential 'Staking)) -> IO ()) -> Property)
-> ((UMap, Set (Credential 'Staking)) -> IO ()) -> Property
forall a b. (a -> b) -> a -> b
$ \(UMap
umap, Set (Credential 'Staking)
creds) ->
          let rdmap :: Map (Credential 'Staking) RDPair
rdmap = Set (Credential 'Staking)
-> UView (Credential 'Staking) RDPair
-> Map (Credential 'Staking) RDPair
forall k v. Set k -> UView k v -> Map k v
domRestrictedMap Set (Credential 'Staking)
creds (UMap -> UView (Credential 'Staking) RDPair
RewDepUView UMap
umap)
              ptrs :: Map (Credential 'Staking) (Set Ptr)
ptrs = UMap -> Map (Credential 'Staking) (Set Ptr)
invPtrMap UMap
umap Map (Credential 'Staking) (Set Ptr)
-> Set (Credential 'Staking) -> Map (Credential 'Staking) (Set Ptr)
forall k a. Ord k => Map k a -> Set k -> Map k a
`Map.restrictKeys` Set (Credential 'Staking)
creds
           in Set (Credential 'Staking) -> UMap -> StakeCredentials
domRestrictedStakeCredentials Set (Credential 'Staking)
creds UMap
umap
                StakeCredentials -> StakeCredentials -> IO ()
forall a. (HasCallStack, Show a, Eq a) => a -> a -> IO ()
`shouldBe` StakeCredentials
                  { scRewards :: Map (Credential 'Staking) Coin
scRewards = (RDPair -> Coin)
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) Coin
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (CompactForm Coin -> Coin
forall a. Compactible a => CompactForm a -> a
fromCompact (CompactForm Coin -> Coin)
-> (RDPair -> CompactForm Coin) -> RDPair -> Coin
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RDPair -> CompactForm Coin
rdReward) Map (Credential 'Staking) RDPair
rdmap
                  , scDeposits :: Map (Credential 'Staking) Coin
scDeposits = (RDPair -> Coin)
-> Map (Credential 'Staking) RDPair
-> Map (Credential 'Staking) Coin
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (CompactForm Coin -> Coin
forall a. Compactible a => CompactForm a -> a
fromCompact (CompactForm Coin -> Coin)
-> (RDPair -> CompactForm Coin) -> RDPair -> Coin
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RDPair -> CompactForm Coin
rdDeposit) Map (Credential 'Staking) RDPair
rdmap
                  , scSPools :: Map (Credential 'Staking) (KeyHash 'StakePool)
scSPools = Set (Credential 'Staking)
-> UView (Credential 'Staking) (KeyHash 'StakePool)
-> Map (Credential 'Staking) (KeyHash 'StakePool)
forall k v. Set k -> UView k v -> Map k v
domRestrictedMap Set (Credential 'Staking)
creds (UMap -> UView (Credential 'Staking) (KeyHash 'StakePool)
SPoolUView UMap
umap)
                  , scDReps :: Map (Credential 'Staking) DRep
scDReps = Set (Credential 'Staking)
-> UView (Credential 'Staking) DRep
-> Map (Credential 'Staking) DRep
forall k v. Set k -> UView k v -> Map k v
domRestrictedMap Set (Credential 'Staking)
creds (UMap -> UView (Credential 'Staking) DRep
DRepUView UMap
umap)
                  , scPtrs :: Map Ptr (Credential 'Staking)
scPtrs = Set Ptr
-> UView Ptr (Credential 'Staking) -> Map Ptr (Credential 'Staking)
forall k v. Set k -> UView k v -> Map k v
domRestrictedMap (Map (Credential 'Staking) (Set Ptr) -> Set Ptr
forall m. Monoid m => Map (Credential 'Staking) m -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold Map (Credential 'Staking) (Set Ptr)
ptrs) (UMap -> UView Ptr (Credential 'Staking)
PtrUView UMap
umap)
                  , scPtrsInverse :: Map (Credential 'Staking) (Set Ptr)
scPtrsInverse = Map (Credential 'Staking) (Set Ptr)
ptrs
                  }