use address::Address;
use forest_actor::BalanceTable;
use vm::TokenAmount;
#[test]
fn total() {
let addr1 = Address::new_id(100);
let addr2 = Address::new_id(101);
let store = db::MemoryDB::default();
let mut bt = BalanceTable::new(&store);
assert_eq!(bt.total().unwrap(), TokenAmount::from(0u8));
struct TotalTestCase<'a> {
amount: u64,
addr: &'a Address,
total: u64,
}
let test_vectors = [
TotalTestCase {
amount: 10,
addr: &addr1,
total: 10,
},
TotalTestCase {
amount: 20,
addr: &addr1,
total: 30,
},
TotalTestCase {
amount: 40,
addr: &addr2,
total: 70,
},
TotalTestCase {
amount: 50,
addr: &addr2,
total: 120,
},
];
for t in test_vectors.iter() {
bt.add(t.addr, &TokenAmount::from(t.amount)).unwrap();
assert_eq!(bt.total().unwrap(), TokenAmount::from(t.total));
}
}
#[test]
fn balance_subtracts() {
let addr = Address::new_id(100);
let store = db::MemoryDB::default();
let mut bt = BalanceTable::new(&store);
bt.add(&addr, &TokenAmount::from(80u8)).unwrap();
assert_eq!(bt.get(&addr).unwrap(), TokenAmount::from(80u8));
assert_eq!(
bt.subtract_with_minimum(&addr, &TokenAmount::from(20u8), &TokenAmount::from(70u8))
.unwrap(),
TokenAmount::from(10u8)
);
assert_eq!(bt.get(&addr).unwrap(), TokenAmount::from(70u8));
assert_eq!(
bt.subtract_with_minimum(&addr, &TokenAmount::from(10u8), &TokenAmount::from(60u8))
.unwrap(),
TokenAmount::from(10u8)
);
assert_eq!(bt.get(&addr).unwrap(), TokenAmount::from(60u8));
bt.must_subtract(&addr, &TokenAmount::from(10u8)).unwrap();
assert_eq!(bt.get(&addr).unwrap(), TokenAmount::from(50u8));
assert!(bt.must_subtract(&addr, &TokenAmount::from(100u8)).is_err());
}