diff --git a/substrate/demo/runtime/src/runtime/council.rs b/substrate/demo/runtime/src/runtime/council.rs index 536dd7ca15e5e0d3e44da88709910fa289b07d20..b789e5b1136f900004a28fd6cddb2cff706aa9dd 100644 --- a/substrate/demo/runtime/src/runtime/council.rs +++ b/substrate/demo/runtime/src/runtime/council.rs @@ -615,14 +615,80 @@ mod tests { with_externalities(&mut t, || { with_env(|e| e.block_number = 1); - assert_eq!(candidates(), Vec::<AccountId>::new()); - public::submit_candidacy(&alice, 0); + assert_eq!(candidate_reg_info(&alice), None); + assert_eq!(candidate_reg_info(&bob), None); + public::submit_candidacy(&alice, 0); assert_eq!(candidates(), vec![alice.clone()]); - public::submit_candidacy(&bob, 1); + assert_eq!(candidate_reg_info(&alice), Some((0 as VoteIndex, 0u32))); + assert_eq!(candidate_reg_info(&bob), None); + public::submit_candidacy(&bob, 1); assert_eq!(candidates(), vec![alice.clone(), bob.clone()]); + assert_eq!(candidate_reg_info(&alice), Some((0 as VoteIndex, 0u32))); + assert_eq!(candidate_reg_info(&bob), Some((0 as VoteIndex, 1u32))); + }); + } + + fn new_test_ext_with_candidate_holes() -> TestExternalities { + let alice = Keyring::Alice.to_raw_public(); + let mut t = new_test_ext(); + t.insert(twox_128(CANDIDATES).to_vec(), vec![].and(&vec![AccountId::default(), AccountId::default(), alice.clone()])); + t.insert(twox_128(CANDIDATE_COUNT).to_vec(), vec![].and(&1u32)); + t.insert(twox_128(&alice.to_keyed_vec(REGISTER_INFO_OF)).to_vec(), vec![].and(&(0 as VoteIndex, 2u32))); + t + } + + #[test] + fn candidate_submission_using_free_slot_should_work() { + let alice = Keyring::Alice.to_raw_public(); + let bob = Keyring::Bob.to_raw_public(); + let charlie = Keyring::Charlie.to_raw_public(); + let dave = Keyring::Dave.to_raw_public(); + let mut t = new_test_ext_with_candidate_holes(); + + with_externalities(&mut t, || { + with_env(|e| e.block_number = 1); + assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), alice.clone()]); + + public::submit_candidacy(&bob, 1); + assert_eq!(candidates(), vec![AccountId::default(), bob.clone(), alice.clone()]); + + public::submit_candidacy(&charlie, 0); + assert_eq!(candidates(), vec![charlie.clone(), bob.clone(), alice.clone()]); + }); + } + + #[test] + fn candidate_submission_using_alternative_free_slot_should_work() { + let alice = Keyring::Alice.to_raw_public(); + let bob = Keyring::Bob.to_raw_public(); + let charlie = Keyring::Charlie.to_raw_public(); + let dave = Keyring::Dave.to_raw_public(); + let mut t = new_test_ext_with_candidate_holes(); + + with_externalities(&mut t, || { + with_env(|e| e.block_number = 1); + assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), alice.clone()]); + + public::submit_candidacy(&bob, 0); + assert_eq!(candidates(), vec![bob.clone(), AccountId::default(), alice.clone()]); + + public::submit_candidacy(&charlie, 1); + assert_eq!(candidates(), vec![bob.clone(), charlie.clone(), alice.clone()]); + }); + } + + #[test] + #[should_panic] + fn candidate_submission_not_using_free_slot_should_panic() { + let dave = Keyring::Dave.to_raw_public(); + let mut t = new_test_ext_with_candidate_holes(); + + with_externalities(&mut t, || { + with_env(|e| e.block_number = 1); + public::submit_candidacy(&dave, 3); }); }