Remove incorrect assumption that runners-up were sorted by account (#4429)

* Remove incorrect assumption that runners-up were sorted by account

* Fix

* Update lib.rs
This commit is contained in:
Gavin Wood
2019-12-18 12:48:15 +03:00
committed by GitHub
parent e6e9faaed6
commit 608d633455
+28 -7
View File
@@ -349,15 +349,15 @@ decl_module! {
return Ok(()); return Ok(());
} }
let mut runners_with_stake = Self::runners_up(); let mut runners_up_with_stake = Self::runners_up();
if let Ok(index) = runners_with_stake if let Some(index) = runners_up_with_stake.iter()
.binary_search_by(|(ref r, ref _s)| r.cmp(&who)) .position(|(ref r, ref _s)| r == &who)
{ {
runners_with_stake.remove(index); runners_up_with_stake.remove(index);
// unreserve the bond // unreserve the bond
T::Currency::unreserve(&who, T::CandidacyBond::get()); T::Currency::unreserve(&who, T::CandidacyBond::get());
// update storage. // update storage.
<RunnersUp<T>>::put(runners_with_stake); <RunnersUp<T>>::put(runners_up_with_stake);
// safety guard to make sure we do only one arm. Better to read runners later. // safety guard to make sure we do only one arm. Better to read runners later.
return Ok(()); return Ok(());
} }
@@ -373,7 +373,7 @@ decl_module! {
return Ok(()); return Ok(());
} }
return Err("origin is not a candidate, member or a runner."); return Err("origin is not a candidate, member or a runner up.");
} }
/// Remove a particular member from the set. This is effective immediately and the bond of /// Remove a particular member from the set. This is effective immediately and the bond of
@@ -1906,6 +1906,27 @@ mod tests {
}); });
} }
#[test]
fn runner_up_replacement_works_when_out_of_order() {
ExtBuilder::default().desired_runners_up(2).build().execute_with(|| {
assert_ok!(Elections::submit_candidacy(Origin::signed(5)));
assert_ok!(Elections::submit_candidacy(Origin::signed(4)));
assert_ok!(Elections::submit_candidacy(Origin::signed(3)));
assert_ok!(Elections::submit_candidacy(Origin::signed(2)));
assert_ok!(Elections::vote(Origin::signed(2), vec![5], 20));
assert_ok!(Elections::vote(Origin::signed(3), vec![3], 30));
assert_ok!(Elections::vote(Origin::signed(4), vec![4], 40));
assert_ok!(Elections::vote(Origin::signed(5), vec![2], 50));
System::set_block_number(5);
assert_ok!(Elections::end_block(System::block_number()));
assert_eq!(Elections::members_ids(), vec![2, 4]);
assert_ok!(Elections::renounce_candidacy(Origin::signed(3)));
});
}
#[test] #[test]
fn can_renounce_candidacy_member_with_runners_bond_is_refunded() { fn can_renounce_candidacy_member_with_runners_bond_is_refunded() {
ExtBuilder::default().desired_runners_up(2).build().execute_with(|| { ExtBuilder::default().desired_runners_up(2).build().execute_with(|| {
@@ -2010,7 +2031,7 @@ mod tests {
ExtBuilder::default().build().execute_with(|| { ExtBuilder::default().build().execute_with(|| {
assert_noop!( assert_noop!(
Elections::renounce_candidacy(Origin::signed(5)), Elections::renounce_candidacy(Origin::signed(5)),
"origin is not a candidate, member or a runner.", "origin is not a candidate, member or a runner up.",
); );
}) })
} }