use super::*;
use frame_support::traits::{
fungible::{InspectHold, MutateFreeze, MutateHold},
Currency, LockIdentifier, LockableCurrency, ReservableCurrency, WithdrawReasons,
};
fn subject() -> AccountId {
let subject = 1;
Balances::make_free_balance_be(&subject, 100);
subject
}
const ID: LockIdentifier = *b"1 ";
fn b(x: AccountId) -> (Balance, Balance, Balance) {
let a = get_test_account_data(x);
(a.free, a.reserved, a.frozen)
}
fn ensure_max_reserve(who: AccountId, amount: Balance) {
assert!(!<Balances as ReservableCurrency<_>>::can_reserve(&who, amount.max(1) * 2));
assert!(!<Balances as ReservableCurrency<_>>::can_reserve(&who, amount + 1));
assert!(<Balances as ReservableCurrency<_>>::can_reserve(&who, amount));
assert!(<Balances as ReservableCurrency<_>>::can_reserve(&who, amount.saturating_sub(1)));
assert!(<Balances as ReservableCurrency<_>>::can_reserve(&who, amount / 2));
}
fn ensure_max_hold(who: AccountId, amount: Balance) {
assert!(<Balances as InspectHold<_>>::ensure_can_hold(&TestId::Foo, &who, amount.max(1) * 2)
.is_err());
assert!(<Balances as InspectHold<_>>::ensure_can_hold(&TestId::Foo, &who, amount + 1).is_err());
assert!(<Balances as InspectHold<_>>::ensure_can_hold(&TestId::Foo, &who, amount).is_ok());
assert!(<Balances as InspectHold<_>>::ensure_can_hold(
&TestId::Foo,
&who,
amount.saturating_sub(1)
)
.is_ok());
assert!(<Balances as InspectHold<_>>::ensure_can_hold(&TestId::Foo, &who, amount / 2).is_ok());
}
#[test]
fn locks_and_reserves() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
<Balances as LockableCurrency<_>>::set_lock(ID, &who, 50, WithdrawReasons::all());
assert_eq!(b(who), (100, 0, 50));
ensure_max_reserve(who, 99);
ensure_max_hold(who, 99);
assert_ok!(<Balances as ReservableCurrency<_>>::reserve(&who, 30));
assert_eq!(b(who), (70, 30, 50));
let expected = 69;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
});
}
#[test]
fn locks_and_holds() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
<Balances as LockableCurrency<_>>::set_lock(ID, &who, 60, WithdrawReasons::all());
assert_eq!(b(who), (100, 0, 60));
ensure_max_hold(who, 99);
ensure_max_reserve(who, 99);
assert_ok!(<Balances as MutateHold<_>>::hold(&TestId::Foo, &who, 40));
assert_eq!(b(who), (60, 40, 60));
let expected = 59;
ensure_max_hold(who, expected);
ensure_max_reserve(who, expected);
});
}
#[test]
fn locks_and_freezes() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
<Balances as LockableCurrency<_>>::set_lock(ID, &who, 40, WithdrawReasons::all());
assert_eq!(b(who), (100, 0, 40));
assert_ok!(<Balances as MutateFreeze<_>>::set_freeze(&TestId::Foo, &who, 70));
assert_eq!(b(who), (100, 0, 70));
let expected = 99;
ensure_max_hold(who, expected);
ensure_max_reserve(who, expected);
});
}
#[test]
fn reserves_and_holds() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
assert_ok!(<Balances as ReservableCurrency<_>>::reserve(&who, 30));
assert_eq!(b(who), (70, 30, 0));
ensure_max_reserve(who, 69);
ensure_max_hold(who, 69);
assert_ok!(<Balances as MutateHold<_>>::hold(&TestId::Foo, &who, 25));
assert_eq!(b(who), (45, 55, 0));
let expected = 44;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
});
}
#[test]
fn reserves_and_freezes() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
assert_ok!(<Balances as ReservableCurrency<_>>::reserve(&who, 25));
assert_eq!(b(who), (75, 25, 0));
assert_ok!(<Balances as MutateFreeze<_>>::set_freeze(&TestId::Foo, &who, 80));
assert_eq!(b(who), (75, 25, 80));
let expected = 74;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
});
}
#[test]
fn holds_and_freezes() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
assert_ok!(<Balances as MutateHold<_>>::hold(&TestId::Foo, &who, 35));
assert_eq!(b(who), (65, 35, 0));
let expected = 64;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
assert_ok!(<Balances as MutateFreeze<_>>::set_freeze(&TestId::Foo, &who, 90));
assert_eq!(b(who), (65, 35, 90));
let expected = 64;
ensure_max_hold(who, expected);
ensure_max_reserve(who, expected);
});
}
#[test]
fn locks_reserves_and_holds() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
<Balances as LockableCurrency<_>>::set_lock(ID, &who, 60, WithdrawReasons::all());
assert_eq!(b(who), (100, 0, 60));
assert_ok!(<Balances as ReservableCurrency<_>>::reserve(&who, 20));
assert_eq!(b(who), (80, 20, 60));
let expected = 79;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
assert_ok!(<Balances as MutateHold<_>>::hold(&TestId::Foo, &who, 15));
assert_eq!(b(who), (65, 35, 60));
let expected = 64;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
});
}
#[test]
fn locks_reserves_and_freezes() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
<Balances as LockableCurrency<_>>::set_lock(ID, &who, 40, WithdrawReasons::all());
assert_eq!(b(who), (100, 0, 40));
assert_ok!(<Balances as ReservableCurrency<_>>::reserve(&who, 25));
assert_eq!(b(who), (75, 25, 40));
assert_ok!(<Balances as MutateFreeze<_>>::set_freeze(&TestId::Foo, &who, 80));
assert_eq!(b(who), (75, 25, 80));
let expected = 74;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
});
}
#[test]
fn locks_holds_and_freezes() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
<Balances as LockableCurrency<_>>::set_lock(ID, &who, 50, WithdrawReasons::all());
assert_eq!(b(who), (100, 0, 50));
assert_ok!(<Balances as MutateHold<_>>::hold(&TestId::Foo, &who, 30));
assert_eq!(b(who), (70, 30, 50));
assert_ok!(<Balances as MutateFreeze<_>>::set_freeze(&TestId::Foo, &who, 75));
assert_eq!(b(who), (70, 30, 75));
let expected = 69;
ensure_max_hold(who, expected);
ensure_max_reserve(who, expected);
});
}
#[test]
fn reserves_holds_and_freezes() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
assert_ok!(<Balances as ReservableCurrency<_>>::reserve(&who, 20));
assert_eq!(b(who), (80, 20, 0));
let expected = 79;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
assert_ok!(<Balances as MutateHold<_>>::hold(&TestId::Foo, &who, 25));
assert_eq!(b(who), (55, 45, 0));
let expected = 54;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
assert_ok!(<Balances as MutateFreeze<_>>::set_freeze(&TestId::Foo, &who, 90));
assert_eq!(b(who), (55, 45, 90));
let expected = 54;
ensure_max_hold(who, expected);
ensure_max_reserve(who, expected);
});
}
#[test]
fn locks_reserves_holds_and_freezes() {
ExtBuilder::default()
.monied(false)
.existential_deposit(1)
.build_and_execute_with(|| {
let who = subject();
<Balances as LockableCurrency<_>>::set_lock(ID, &who, 40, WithdrawReasons::all());
assert_eq!(b(who), (100, 0, 40));
let expected = 99;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
assert_ok!(<Balances as ReservableCurrency<_>>::reserve(&who, 20));
assert_eq!(b(who), (80, 20, 40));
let expected = 79;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
assert_ok!(<Balances as MutateHold<_>>::hold(&TestId::Foo, &who, 15));
assert_eq!(b(who), (65, 35, 40));
let expected = 64;
ensure_max_reserve(who, expected);
ensure_max_hold(who, expected);
assert_ok!(<Balances as MutateFreeze<_>>::set_freeze(&TestId::Foo, &who, 85));
assert_eq!(b(who), (65, 35, 85));
let expected = 64;
ensure_max_hold(who, expected);
ensure_max_reserve(who, expected);
});
}