1use crate::traits::{
19 fungible::{Inspect, Mutate},
20 tokens::{
21 DepositConsequence, Fortitude, Precision, Preservation, Provenance, WithdrawConsequence,
22 },
23};
24use core::fmt::Debug;
25use sp_arithmetic::traits::AtLeast8BitUnsigned;
26use sp_runtime::traits::{Bounded, Zero};
27
28pub fn mint_into_success<T, AccountId>(_dust_trap: Option<AccountId>)
41where
42 T: Mutate<AccountId>,
43 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
44 AccountId: AtLeast8BitUnsigned,
45{
46 let initial_total_issuance = T::total_issuance();
47 let initial_active_issuance = T::active_issuance();
48 let account_0 = AccountId::from(0);
49 let account_1 = AccountId::from(1);
50
51 let amount_0 = T::minimum_balance();
53 let amount_1 = T::minimum_balance() + 5.into();
54 T::mint_into(&account_0, amount_0).unwrap();
55 T::mint_into(&account_1, amount_1).unwrap();
56
57 assert_eq!(T::total_balance(&account_0), amount_0);
59 assert_eq!(T::total_balance(&account_1), amount_1);
60 assert_eq!(T::balance(&account_0), amount_0);
61 assert_eq!(T::balance(&account_1), amount_1);
62
63 assert_eq!(T::total_issuance(), initial_total_issuance + amount_0 + amount_1);
65 assert_eq!(T::active_issuance(), initial_active_issuance + amount_0 + amount_1);
66}
67
68pub fn mint_into_overflow<T, AccountId>(_dust_trap: Option<AccountId>)
80where
81 T: Mutate<AccountId>,
82 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
83 AccountId: AtLeast8BitUnsigned,
84{
85 let initial_total_issuance = T::total_issuance();
86 let initial_active_issuance = T::active_issuance();
87 let account = AccountId::from(10);
88 let amount = T::Balance::max_value() - 5.into() - initial_total_issuance;
89
90 T::mint_into(&account, amount).unwrap();
92
93 T::mint_into(&account, 10.into()).unwrap_err();
95
96 assert_eq!(T::total_balance(&account), amount);
98 assert_eq!(T::balance(&account), amount);
99
100 assert_eq!(T::total_issuance(), initial_total_issuance + amount);
102 assert_eq!(T::active_issuance(), initial_active_issuance + amount);
103}
104
105pub fn mint_into_below_minimum<T, AccountId>(_dust_trap: Option<AccountId>)
117where
118 T: Mutate<AccountId>,
119 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
120 AccountId: AtLeast8BitUnsigned,
121{
122 if T::minimum_balance() == T::Balance::zero() {
124 return
125 }
126
127 let initial_total_issuance = T::total_issuance();
128 let initial_active_issuance = T::active_issuance();
129 let account = AccountId::from(10);
130 let amount = T::minimum_balance() - 1.into();
131
132 T::mint_into(&account, amount).unwrap_err();
134
135 assert_eq!(T::total_balance(&account), T::Balance::zero());
137 assert_eq!(T::balance(&account), T::Balance::zero());
138 assert_eq!(T::total_issuance(), initial_total_issuance);
139 assert_eq!(T::active_issuance(), initial_active_issuance);
140}
141
142pub fn burn_from_exact_success<T, AccountId>(_dust_trap: Option<AccountId>)
154where
155 T: Mutate<AccountId>,
156 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
157 AccountId: AtLeast8BitUnsigned,
158{
159 let initial_total_issuance = T::total_issuance();
160 let initial_active_issuance = T::active_issuance();
161
162 let account = AccountId::from(5);
164 let initial_balance = T::minimum_balance() + 10.into();
165 T::mint_into(&account, initial_balance).unwrap();
166
167 let amount_to_burn = T::Balance::from(5);
169 let preservation = Preservation::Expendable;
170 let precision = Precision::Exact;
171 let force = Fortitude::Polite;
172 T::burn_from(&account, amount_to_burn, preservation, precision, force).unwrap();
173
174 assert_eq!(T::balance(&account), initial_balance - amount_to_burn);
176 assert_eq!(T::total_balance(&account), initial_balance - amount_to_burn);
177 assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance - amount_to_burn);
178 assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance - amount_to_burn);
179}
180
181pub fn burn_from_best_effort_success<T, AccountId>(_dust_trap: Option<AccountId>)
194where
195 T: Mutate<AccountId>,
196 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
197 AccountId: AtLeast8BitUnsigned,
198{
199 let initial_total_issuance = T::total_issuance();
200 let initial_active_issuance = T::active_issuance();
201
202 let account = AccountId::from(5);
204 let initial_balance = T::minimum_balance() + 10.into();
205 T::mint_into(&account, initial_balance).unwrap();
206
207 let force = Fortitude::Polite;
209 let reducible_balance = T::reducible_balance(&account, Preservation::Expendable, force);
210
211 let amount_to_burn = reducible_balance + 5.into();
213 let preservation = Preservation::Expendable;
214 let precision = Precision::BestEffort;
215 assert!(amount_to_burn > reducible_balance);
216 assert!(amount_to_burn > T::balance(&account));
217 T::burn_from(&account, amount_to_burn, preservation, precision, force).unwrap();
218
219 assert_eq!(T::balance(&account), initial_balance - reducible_balance);
221 assert_eq!(T::total_balance(&account), initial_balance - reducible_balance);
222 assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance - reducible_balance);
223 assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance - reducible_balance);
224}
225
226pub fn burn_from_exact_insufficient_funds<T, AccountId>(_dust_trap: Option<AccountId>)
239where
240 T: Mutate<AccountId>,
241 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
242 AccountId: AtLeast8BitUnsigned,
243{
244 let account = AccountId::from(5);
246 let initial_balance = T::minimum_balance() + 10.into();
247 T::mint_into(&account, initial_balance).unwrap();
248 let initial_total_issuance = T::total_issuance();
249 let initial_active_issuance = T::active_issuance();
250
251 let amount_to_burn = initial_balance + 10.into();
253 let preservation = Preservation::Expendable;
254 let precision = Precision::Exact;
255 let force = Fortitude::Polite;
256 T::burn_from(&account, amount_to_burn, preservation, precision, force).unwrap_err();
257
258 assert_eq!(T::balance(&account), initial_balance);
260 assert_eq!(T::total_balance(&account), initial_balance);
261 assert_eq!(T::total_issuance(), initial_total_issuance);
262 assert_eq!(T::active_issuance(), initial_active_issuance);
263}
264
265pub fn restore_success<T, AccountId>(_dust_trap: Option<AccountId>)
277where
278 T: Mutate<AccountId>,
279 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
280 AccountId: AtLeast8BitUnsigned,
281{
282 let account_0 = AccountId::from(0);
283 let account_1 = AccountId::from(1);
284
285 let amount_0 = T::minimum_balance();
287 let amount_1 = T::minimum_balance() + 5.into();
288 let initial_total_issuance = T::total_issuance();
289 let initial_active_issuance = T::active_issuance();
290 T::restore(&account_0, amount_0).unwrap();
291 T::restore(&account_1, amount_1).unwrap();
292
293 assert_eq!(T::total_balance(&account_0), amount_0);
295 assert_eq!(T::total_balance(&account_1), amount_1);
296 assert_eq!(T::balance(&account_0), amount_0);
297 assert_eq!(T::balance(&account_1), amount_1);
298
299 assert_eq!(T::total_issuance(), initial_total_issuance + amount_0 + amount_1);
301 assert_eq!(T::active_issuance(), initial_active_issuance + amount_0 + amount_1);
302}
303
304pub fn restore_overflow<T, AccountId>(_dust_trap: Option<AccountId>)
316where
317 T: Mutate<AccountId>,
318 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
319 AccountId: AtLeast8BitUnsigned,
320{
321 let initial_total_issuance = T::total_issuance();
322 let initial_active_issuance = T::active_issuance();
323 let account = AccountId::from(10);
324 let amount = T::Balance::max_value() - 5.into() - initial_total_issuance;
325
326 T::restore(&account, amount).unwrap();
328
329 T::restore(&account, 10.into()).unwrap_err();
331
332 assert_eq!(T::total_balance(&account), amount);
334 assert_eq!(T::balance(&account), amount);
335 assert_eq!(T::total_issuance(), initial_total_issuance + amount);
336 assert_eq!(T::active_issuance(), initial_active_issuance + amount);
337}
338
339pub fn restore_below_minimum<T, AccountId>(_dust_trap: Option<AccountId>)
351where
352 T: Mutate<AccountId>,
353 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
354 AccountId: AtLeast8BitUnsigned,
355{
356 if T::minimum_balance() == T::Balance::zero() {
358 return
359 }
360
361 let account = AccountId::from(10);
362 let amount = T::minimum_balance() - 1.into();
363 let initial_total_issuance = T::total_issuance();
364 let initial_active_issuance = T::active_issuance();
365
366 T::restore(&account, amount).unwrap_err();
368
369 assert_eq!(T::total_balance(&account), T::Balance::zero());
371 assert_eq!(T::balance(&account), T::Balance::zero());
372 assert_eq!(T::total_issuance(), initial_total_issuance);
373 assert_eq!(T::active_issuance(), initial_active_issuance);
374}
375
376pub fn shelve_success<T, AccountId>(_dust_trap: Option<AccountId>)
388where
389 T: Mutate<AccountId>,
390 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
391 AccountId: AtLeast8BitUnsigned,
392{
393 let initial_total_issuance = T::total_issuance();
394 let initial_active_issuance = T::active_issuance();
395
396 let account = AccountId::from(5);
398 let initial_balance = T::minimum_balance() + 10.into();
399
400 T::restore(&account, initial_balance).unwrap();
401
402 let amount_to_shelve = T::Balance::from(5);
404 T::shelve(&account, amount_to_shelve).unwrap();
405
406 assert_eq!(T::balance(&account), initial_balance - amount_to_shelve);
408 assert_eq!(T::total_balance(&account), initial_balance - amount_to_shelve);
409 assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance - amount_to_shelve);
410 assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance - amount_to_shelve);
411}
412
413pub fn shelve_insufficient_funds<T, AccountId>(_dust_trap: Option<AccountId>)
425where
426 T: Mutate<AccountId>,
427 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
428 AccountId: AtLeast8BitUnsigned,
429{
430 let initial_total_issuance = T::total_issuance();
431 let initial_active_issuance = T::active_issuance();
432
433 let account = AccountId::from(5);
435 let initial_balance = T::minimum_balance() + 10.into();
436 T::restore(&account, initial_balance).unwrap();
437
438 let amount_to_shelve = initial_balance + 10.into();
440 T::shelve(&account, amount_to_shelve).unwrap_err();
441
442 assert_eq!(T::balance(&account), initial_balance);
444 assert_eq!(T::total_balance(&account), initial_balance);
445 assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance);
446 assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance);
447}
448
449pub fn transfer_success<T, AccountId>(_dust_trap: Option<AccountId>)
462where
463 T: Mutate<AccountId>,
464 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
465 AccountId: AtLeast8BitUnsigned,
466{
467 let initial_total_issuance = T::total_issuance();
468 let initial_active_issuance = T::active_issuance();
469 let account_0 = AccountId::from(0);
470 let account_1 = AccountId::from(1);
471 let initial_balance = T::minimum_balance() + 10.into();
472 T::set_balance(&account_0, initial_balance);
473 T::set_balance(&account_1, initial_balance);
474
475 let transfer_amount = T::Balance::from(3);
477 T::transfer(&account_0, &account_1, transfer_amount, Preservation::Expendable).unwrap();
478
479 assert_eq!(T::total_balance(&account_0), initial_balance - transfer_amount);
481 assert_eq!(T::total_balance(&account_1), initial_balance + transfer_amount);
482 assert_eq!(T::balance(&account_0), initial_balance - transfer_amount);
483 assert_eq!(T::balance(&account_1), initial_balance + transfer_amount);
484
485 assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance * 2.into());
487 assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance * 2.into());
488}
489
490pub fn transfer_expendable_all<T, AccountId>(_dust_trap: Option<AccountId>)
504where
505 T: Mutate<AccountId>,
506 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
507 AccountId: AtLeast8BitUnsigned,
508{
509 let initial_total_issuance = T::total_issuance();
510 let initial_active_issuance = T::active_issuance();
511 let account_0 = AccountId::from(0);
512 let account_1 = AccountId::from(1);
513 let initial_balance = T::minimum_balance() + 10.into();
514 T::set_balance(&account_0, initial_balance);
515 T::set_balance(&account_1, initial_balance);
516
517 let preservation = Preservation::Expendable;
519 let transfer_amount = initial_balance;
520 T::transfer(&account_0, &account_1, transfer_amount, preservation).unwrap();
521
522 assert_eq!(T::total_balance(&account_0), T::Balance::zero());
524 assert_eq!(T::total_balance(&account_1), initial_balance * 2.into());
525 assert_eq!(T::balance(&account_0), T::Balance::zero());
526 assert_eq!(T::balance(&account_1), initial_balance * 2.into());
527
528 assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance * 2.into());
530 assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance * 2.into());
531}
532
533pub fn transfer_expendable_dust<T, AccountId>(dust_trap: Option<AccountId>)
553where
554 T: Mutate<AccountId>,
555 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
556 AccountId: AtLeast8BitUnsigned,
557{
558 if T::minimum_balance() == T::Balance::zero() {
559 return
560 }
561
562 let account_0 = AccountId::from(10);
563 let account_1 = AccountId::from(20);
564 let initial_balance = T::minimum_balance() + 10.into();
565 T::set_balance(&account_0, initial_balance);
566 T::set_balance(&account_1, initial_balance);
567
568 let initial_total_issuance = T::total_issuance();
569 let initial_active_issuance = T::active_issuance();
570 let initial_dust_trap_balance = match dust_trap.clone() {
571 Some(dust_trap) => T::total_balance(&dust_trap),
572 None => T::Balance::zero(),
573 };
574
575 let preservation = Preservation::Expendable;
577 let transfer_amount = T::Balance::from(11);
578 T::transfer(&account_0, &account_1, transfer_amount, preservation).unwrap();
579
580 assert_eq!(T::total_balance(&account_0), T::Balance::zero());
582 assert_eq!(T::total_balance(&account_1), initial_balance + transfer_amount);
583 assert_eq!(T::balance(&account_0), T::Balance::zero());
584 assert_eq!(T::balance(&account_1), initial_balance + transfer_amount);
585
586 match dust_trap {
587 Some(dust_trap) => {
588 assert_eq!(T::total_issuance(), initial_total_issuance);
590 assert_eq!(T::active_issuance(), initial_active_issuance);
591 assert_eq!(
593 T::total_balance(&dust_trap),
594 initial_dust_trap_balance + T::minimum_balance() - 1.into()
595 );
596 assert_eq!(
597 T::balance(&dust_trap),
598 initial_dust_trap_balance + T::minimum_balance() - 1.into()
599 );
600 },
601 None => {
602 assert_eq!(
604 T::total_issuance(),
605 initial_total_issuance - T::minimum_balance() + 1.into()
606 );
607 assert_eq!(
608 T::active_issuance(),
609 initial_active_issuance - T::minimum_balance() + 1.into()
610 );
611 },
612 }
613}
614
615pub fn transfer_protect_preserve<T, AccountId>(_dust_trap: Option<AccountId>)
629where
630 T: Mutate<AccountId>,
631 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
632 AccountId: AtLeast8BitUnsigned,
633{
634 if T::minimum_balance() == T::Balance::zero() {
636 return
637 }
638
639 let initial_total_issuance = T::total_issuance();
640 let initial_active_issuance = T::active_issuance();
641 let account_0 = AccountId::from(0);
642 let account_1 = AccountId::from(1);
643 let initial_balance = T::minimum_balance() + 10.into();
644 T::set_balance(&account_0, initial_balance);
645 T::set_balance(&account_1, initial_balance);
646
647 let preservation = Preservation::Protect;
649 let transfer_amount = initial_balance;
650 T::transfer(&account_0, &account_1, transfer_amount, preservation).unwrap_err();
651
652 assert_eq!(T::total_balance(&account_0), initial_balance);
654 assert_eq!(T::total_balance(&account_1), initial_balance);
655 assert_eq!(T::balance(&account_0), initial_balance);
656 assert_eq!(T::balance(&account_1), initial_balance);
657 assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance * 2.into());
658 assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance * 2.into());
659
660 let preservation = Preservation::Preserve;
662 T::transfer(&account_0, &account_1, transfer_amount, preservation).unwrap_err();
663
664 assert_eq!(T::total_balance(&account_0), initial_balance);
666 assert_eq!(T::total_balance(&account_1), initial_balance);
667 assert_eq!(T::balance(&account_0), initial_balance);
668 assert_eq!(T::balance(&account_1), initial_balance);
669 assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance * 2.into());
670 assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance * 2.into());
671}
672
673pub fn set_balance_mint_success<T, AccountId>(_dust_trap: Option<AccountId>)
685where
686 T: Mutate<AccountId>,
687 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
688 AccountId: AtLeast8BitUnsigned,
689{
690 let initial_total_issuance = T::total_issuance();
691 let initial_active_issuance = T::active_issuance();
692 let account = AccountId::from(10);
693 let initial_balance = T::minimum_balance() + 10.into();
694 T::mint_into(&account, initial_balance).unwrap();
695
696 let increase_amount: T::Balance = 5.into();
698 let new = T::set_balance(&account, initial_balance + increase_amount);
699
700 let expected_new = initial_balance + increase_amount;
702 assert_eq!(new, expected_new);
703
704 assert_eq!(T::total_balance(&account), expected_new);
706 assert_eq!(T::balance(&account), expected_new);
707 assert_eq!(T::total_issuance(), initial_total_issuance + expected_new);
708 assert_eq!(T::active_issuance(), initial_active_issuance + expected_new);
709}
710
711pub fn set_balance_burn_success<T, AccountId>(_dust_trap: Option<AccountId>)
723where
724 T: Mutate<AccountId>,
725 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
726 AccountId: AtLeast8BitUnsigned,
727{
728 let initial_total_issuance = T::total_issuance();
729 let initial_active_issuance = T::active_issuance();
730 let account = AccountId::from(10);
731 let initial_balance = T::minimum_balance() + 10.into();
732 T::mint_into(&account, initial_balance).unwrap();
733
734 let burn_amount: T::Balance = 5.into();
736 let new = T::set_balance(&account, initial_balance - burn_amount);
737
738 let expected_new = initial_balance - burn_amount;
740 assert_eq!(new, expected_new);
741
742 assert_eq!(T::total_balance(&account), expected_new);
744 assert_eq!(T::balance(&account), expected_new);
745 assert_eq!(T::total_issuance(), initial_total_issuance + expected_new);
746 assert_eq!(T::active_issuance(), initial_active_issuance + expected_new);
747}
748
749pub fn can_deposit_success<T, AccountId>(_dust_trap: Option<AccountId>)
761where
762 T: Mutate<AccountId>,
763 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
764 AccountId: AtLeast8BitUnsigned,
765{
766 let account = AccountId::from(10);
767 let initial_balance = T::minimum_balance() + 10.into();
768 T::mint_into(&account, initial_balance).unwrap();
769
770 let ret = T::can_deposit(&account, 5.into(), Provenance::Minted);
772
773 assert_eq!(ret, DepositConsequence::Success);
775}
776
777pub fn can_deposit_below_minimum<T, AccountId>(_dust_trap: Option<AccountId>)
789where
790 T: Mutate<AccountId>,
791 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
792 AccountId: AtLeast8BitUnsigned,
793{
794 if T::minimum_balance() < 2.into() {
796 return
797 }
798
799 let account = AccountId::from(10);
800
801 let ret = T::can_deposit(&account, T::minimum_balance() - 1.into(), Provenance::Minted);
803
804 assert_eq!(ret, DepositConsequence::BelowMinimum);
806}
807
808pub fn can_deposit_overflow<T, AccountId>(_dust_trap: Option<AccountId>)
820where
821 T: Mutate<AccountId>,
822 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
823 AccountId: AtLeast8BitUnsigned,
824{
825 let account = AccountId::from(10);
826
827 let initial_balance = T::Balance::max_value() - 5.into() - T::total_issuance();
829 T::mint_into(&account, initial_balance).unwrap();
830 let ret = T::can_deposit(&account, 10.into(), Provenance::Minted);
831
832 assert_eq!(ret, DepositConsequence::Overflow);
834}
835
836pub fn can_withdraw_success<T, AccountId>(_dust_trap: Option<AccountId>)
848where
849 T: Mutate<AccountId>,
850 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
851 AccountId: AtLeast8BitUnsigned,
852{
853 let account = AccountId::from(10);
854 let initial_balance = T::minimum_balance() + 10.into();
855 T::mint_into(&account, initial_balance).unwrap();
856
857 let ret = T::can_withdraw(&account, 5.into());
859
860 assert_eq!(ret, WithdrawConsequence::Success);
862}
863
864pub fn can_withdraw_reduced_to_zero<T, AccountId>(_dust_trap: Option<AccountId>)
876where
877 T: Mutate<AccountId>,
878 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
879 AccountId: AtLeast8BitUnsigned,
880{
881 if T::minimum_balance() == T::Balance::zero() {
882 return
883 }
884
885 let account = AccountId::from(10);
886 let initial_balance = T::minimum_balance();
887 T::mint_into(&account, initial_balance).unwrap();
888
889 let ret = T::can_withdraw(&account, 1.into());
891 assert_eq!(ret, WithdrawConsequence::ReducedToZero(T::minimum_balance() - 1.into()));
892}
893
894pub fn can_withdraw_balance_low<T, AccountId>(_dust_trap: Option<AccountId>)
906where
907 T: Mutate<AccountId>,
908 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
909 AccountId: AtLeast8BitUnsigned,
910{
911 if T::minimum_balance() == T::Balance::zero() {
912 return
913 }
914
915 let account = AccountId::from(10);
916 let other_account = AccountId::from(100);
917 let initial_balance = T::minimum_balance() + 5.into();
918 T::mint_into(&account, initial_balance).unwrap();
919 T::mint_into(&other_account, initial_balance * 2.into()).unwrap();
920
921 let ret = T::can_withdraw(&account, initial_balance + 1.into());
923 assert_eq!(ret, WithdrawConsequence::BalanceLow);
924}
925
926pub fn reducible_balance_expendable<T, AccountId>(_dust_trap: Option<AccountId>)
938where
939 T: Mutate<AccountId>,
940 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
941 AccountId: AtLeast8BitUnsigned,
942{
943 let account = AccountId::from(10);
944 let initial_balance = T::minimum_balance() + 10.into();
945 T::mint_into(&account, initial_balance).unwrap();
946
947 let ret = T::reducible_balance(&account, Preservation::Expendable, Fortitude::Polite);
949 assert_eq!(ret, initial_balance);
950}
951
952pub fn reducible_balance_protect_preserve<T, AccountId>(_dust_trap: Option<AccountId>)
964where
965 T: Mutate<AccountId>,
966 <T as Inspect<AccountId>>::Balance: AtLeast8BitUnsigned + Debug,
967 AccountId: AtLeast8BitUnsigned,
968{
969 let account = AccountId::from(10);
970 let initial_balance = T::minimum_balance() + 10.into();
971 T::mint_into(&account, initial_balance).unwrap();
972
973 let ret = T::reducible_balance(&account, Preservation::Protect, Fortitude::Polite);
975 assert_eq!(ret, initial_balance - T::minimum_balance());
976 let ret = T::reducible_balance(&account, Preservation::Preserve, Fortitude::Polite);
977 assert_eq!(ret, initial_balance - T::minimum_balance());
978}