use super::*;
use frame_support::traits::{
fungible::{InspectFreeze, MutateFreeze, MutateHold},
Currency, Get, LockIdentifier, LockableCurrency, ReservableCurrency, WithdrawReasons,
};
const ID_1: LockIdentifier = *b"1 ";
#[test]
fn lock_behavior_when_consumer_limit_fully_exhausted() {
ExtBuilder::default()
.existential_deposit(1)
.monied(true)
.build()
.execute_with(|| {
Balances::make_free_balance_be(&1, 100);
assert_eq!(System::providers(&1), 1);
assert_eq!(System::consumers(&1), 0);
let max_consumers: u32 = <Test as frame_system::Config>::MaxConsumers::get();
for _ in 0..max_consumers {
assert_ok!(System::inc_consumers(&1));
}
assert_eq!(System::consumers(&1), max_consumers);
assert_noop!(System::inc_consumers(&1), DispatchError::TooManyConsumers);
frame_support::hypothetically!({
assert_ok!(System::inc_consumers_without_limit(&1));
});
Balances::set_lock(ID_1, &1, 20, WithdrawReasons::all());
assert_eq!(Balances::locks(&1).len(), 1);
assert_eq!(Balances::locks(&1)[0].amount, 20);
assert_eq!(get_test_account_data(1).frozen, 20);
assert_eq!(System::consumers(&1), max_consumers + 1);
assert_noop!(
Balances::transfer_allow_death(frame_system::RawOrigin::Signed(1).into(), 2, 90),
DispatchError::Token(TokenError::Frozen)
);
});
}
#[test]
fn freeze_behavior_when_consumer_limit_fully_exhausted() {
ExtBuilder::default()
.existential_deposit(1)
.monied(true)
.build()
.execute_with(|| {
Balances::make_free_balance_be(&1, 100);
let max_consumers: u32 = <Test as frame_system::Config>::MaxConsumers::get();
for _ in 0..max_consumers {
assert_ok!(System::inc_consumers(&1));
}
assert_eq!(System::consumers(&1), max_consumers);
assert_noop!(
Balances::set_freeze(&TestId::Foo, &1, 20),
DispatchError::TooManyConsumers
);
assert_eq!(Balances::balance_frozen(&TestId::Foo, &1), 0);
assert_eq!(get_test_account_data(1).frozen, 0);
});
}
#[test]
fn hold_behavior_when_consumer_limit_fully_exhausted() {
ExtBuilder::default()
.existential_deposit(1)
.monied(true)
.build()
.execute_with(|| {
Balances::make_free_balance_be(&1, 100);
let max_consumers: u32 = <Test as frame_system::Config>::MaxConsumers::get();
for _ in 0..max_consumers {
assert_ok!(System::inc_consumers(&1));
}
assert_eq!(System::consumers(&1), max_consumers);
assert_err!(Balances::hold(&TestId::Foo, &1, 50), DispatchError::TooManyConsumers);
});
}
#[test]
fn reserve_behavior_when_consumer_limit_fully_exhausted() {
ExtBuilder::default()
.existential_deposit(1)
.monied(true)
.build()
.execute_with(|| {
Balances::make_free_balance_be(&1, 100);
let max_consumers: u32 = <Test as frame_system::Config>::MaxConsumers::get();
for _ in 0..max_consumers {
assert_ok!(System::inc_consumers(&1));
}
assert_eq!(System::consumers(&1), max_consumers);
assert_noop!(Balances::reserve(&1, 20), DispatchError::TooManyConsumers);
});
}