use super::*;
use crate::list::List;
use alloc::{vec, vec::Vec};
use frame_benchmarking::v1::{
account, benchmarks_instance_pallet, whitelist_account, whitelisted_caller,
};
use frame_election_provider_support::ScoreProvider;
use frame_support::{assert_ok, traits::Get};
use frame_system::RawOrigin as SystemOrigin;
use sp_runtime::traits::One;
benchmarks_instance_pallet! {
#[extra]
iter {
let n = 100;
List::<T, _>::unsafe_clear();
let bag_thresh = T::BagThresholds::get()[0];
let second_bag_thresh = T::BagThresholds::get()[1];
for i in 0..n/2 {
let node: T::AccountId = account("node", i, 0);
assert_ok!(List::<T, _>::insert(node.clone(), bag_thresh - One::one()));
}
for i in 0..n/2 {
let node: T::AccountId = account("node", i, 1);
assert_ok!(List::<T, _>::insert(node.clone(), bag_thresh + One::one()));
}
assert_eq!(
List::<T, _>::get_bags().into_iter().map(|(bag, nodes)| (bag, nodes.len())).collect::<Vec<_>>(),
vec![
(bag_thresh, (n / 2) as usize),
(second_bag_thresh, (n / 2) as usize),
]
);
}: {
let voters = List::<T, _>::iter();
let len = voters.collect::<Vec<_>>().len();
assert!(len as u32 == n, "len is {}, expected {}", len, n);
}
#[extra]
iter_take {
let n = 100;
List::<T, _>::unsafe_clear();
let bag_thresh = T::BagThresholds::get()[0];
let second_bag_thresh = T::BagThresholds::get()[1];
for i in 0..n/2 {
let node: T::AccountId = account("node", i, 0);
assert_ok!(List::<T, _>::insert(node.clone(), bag_thresh - One::one()));
}
for i in 0..n/2 {
let node: T::AccountId = account("node", i, 1);
assert_ok!(List::<T, _>::insert(node.clone(), bag_thresh + One::one()));
}
assert_eq!(
List::<T, _>::get_bags().into_iter().map(|(bag, nodes)| (bag, nodes.len())).collect::<Vec<_>>(),
vec![
(bag_thresh, (n / 2) as usize),
(second_bag_thresh, (n / 2) as usize),
]
);
}: {
let voters = List::<T, _>::iter().take(n as usize / 4 );
let len = voters.collect::<Vec<_>>().len();
assert!(len as u32 == n / 4, "len is {}, expected {}", len, n / 4);
}
#[extra]
iter_from {
let n = 100;
List::<T, _>::unsafe_clear();
let bag_thresh = T::BagThresholds::get()[0];
for i in 0..n/4 {
let node: T::AccountId = account("node", i, 0);
assert_ok!(List::<T, _>::insert(node.clone(), bag_thresh - One::one()));
}
for i in 0..n/4 {
let node: T::AccountId = account("node", i, 1);
assert_ok!(List::<T, _>::insert(node.clone(), bag_thresh + One::one()));
}
let bag_thresh = T::BagThresholds::get()[2];
for i in 0..n/4 {
let node: T::AccountId = account("node", i, 2);
assert_ok!(List::<T, _>::insert(node.clone(), bag_thresh - One::one()));
}
for i in 0..n/4 {
let node: T::AccountId = account("node", i, 3);
assert_ok!(List::<T, _>::insert(node.clone(), bag_thresh + One::one()));
}
assert_eq!(
List::<T, _>::get_bags().into_iter().map(|(bag, nodes)| (bag, nodes.len())).collect::<Vec<_>>(),
vec![
(T::BagThresholds::get()[0], (n / 4) as usize),
(T::BagThresholds::get()[1], (n / 4) as usize),
(T::BagThresholds::get()[2], (n / 4) as usize),
(T::BagThresholds::get()[3], (n / 4) as usize),
]
);
let from: T::AccountId = account("node", 0, 2);
}: {
let voters = List::<T, _>::iter_from(&from).unwrap();
let len = voters.collect::<Vec<_>>().len();
assert!(len as u32 == 74, "len is {}, expected {}", len, 74);
}
rebag_non_terminal {
List::<T, _>::unsafe_clear();
let origin_bag_thresh = T::BagThresholds::get()[0];
let dest_bag_thresh = T::BagThresholds::get()[1];
let origin_head: T::AccountId = account("origin_head", 0, 0);
assert_ok!(List::<T, _>::insert(origin_head.clone(), origin_bag_thresh));
let origin_middle: T::AccountId = account("origin_middle", 0, 0); assert_ok!(List::<T, _>::insert(origin_middle.clone(), origin_bag_thresh));
let origin_tail: T::AccountId = account("origin_tail", 0, 0);
assert_ok!(List::<T, _>::insert(origin_tail.clone(), origin_bag_thresh));
let dest_head: T::AccountId = account("dest_head", 0, 0);
assert_ok!(List::<T, _>::insert(dest_head.clone(), dest_bag_thresh));
let origin_middle_lookup = T::Lookup::unlookup(origin_middle.clone());
assert_eq!(
List::<T, _>::get_bags(),
vec![
(origin_bag_thresh, vec![origin_head.clone(), origin_middle.clone(), origin_tail.clone()]),
(dest_bag_thresh, vec![dest_head.clone()])
]
);
let caller = whitelisted_caller();
T::ScoreProvider::set_score_of(&origin_middle, dest_bag_thresh);
}: rebag(SystemOrigin::Signed(caller), origin_middle_lookup.clone())
verify {
assert_eq!(
List::<T, _>::get_bags(),
vec![
(
origin_bag_thresh,
vec![origin_head, origin_tail],
),
(
dest_bag_thresh,
vec![dest_head, origin_middle],
)
]
);
}
rebag_terminal {
List::<T, I>::unsafe_clear();
let origin_bag_thresh = T::BagThresholds::get()[0];
let dest_bag_thresh = T::BagThresholds::get()[1];
let origin_head: T::AccountId = account("origin_head", 0, 0);
assert_ok!(List::<T, _>::insert(origin_head.clone(), origin_bag_thresh));
let origin_tail: T::AccountId = account("origin_tail", 0, 0); assert_ok!(List::<T, _>::insert(origin_tail.clone(), origin_bag_thresh));
let dest_head: T::AccountId = account("dest_head", 0, 0);
assert_ok!(List::<T, _>::insert(dest_head.clone(), dest_bag_thresh));
let origin_tail_lookup = T::Lookup::unlookup(origin_tail.clone());
assert_eq!(
List::<T, _>::get_bags(),
vec![
(origin_bag_thresh, vec![origin_head.clone(), origin_tail.clone()]),
(dest_bag_thresh, vec![dest_head.clone()])
]
);
let caller = whitelisted_caller();
T::ScoreProvider::set_score_of(&origin_tail, dest_bag_thresh);
}: rebag(SystemOrigin::Signed(caller), origin_tail_lookup.clone())
verify {
assert_eq!(
List::<T, _>::get_bags(),
vec![
(origin_bag_thresh, vec![origin_head.clone()]),
(dest_bag_thresh, vec![dest_head.clone(), origin_tail])
]
);
}
put_in_front_of {
List::<T, I>::unsafe_clear();
let bag_thresh = T::BagThresholds::get()[0];
let lighter: T::AccountId = account("lighter", 0, 0);
assert_ok!(List::<T, _>::insert(lighter.clone(), bag_thresh));
let heavier_prev: T::AccountId = account("heavier_prev", 0, 0);
assert_ok!(List::<T, _>::insert(heavier_prev.clone(), bag_thresh));
let heavier: T::AccountId = account("heavier", 0, 0);
assert_ok!(List::<T, _>::insert(heavier.clone(), bag_thresh));
let heavier_next: T::AccountId = account("heavier_next", 0, 0);
assert_ok!(List::<T, _>::insert(heavier_next.clone(), bag_thresh));
T::ScoreProvider::set_score_of(&lighter, bag_thresh - One::one());
T::ScoreProvider::set_score_of(&heavier, bag_thresh);
let lighter_lookup = T::Lookup::unlookup(lighter.clone());
assert_eq!(
List::<T, _>::iter().map(|n| n.id().clone()).collect::<Vec<_>>(),
vec![lighter.clone(), heavier_prev.clone(), heavier.clone(), heavier_next.clone()]
);
whitelist_account!(heavier);
}: _(SystemOrigin::Signed(heavier.clone()), lighter_lookup.clone())
verify {
assert_eq!(
List::<T, _>::iter().map(|n| n.id().clone()).collect::<Vec<_>>(),
vec![heavier, lighter, heavier_prev, heavier_next]
)
}
impl_benchmark_test_suite!(
Pallet,
crate::mock::ExtBuilder::default().skip_genesis_ids().build(),
crate::mock::Runtime
);
}