use hopper_staking::*;
#[test]
fn test_update_reward_per_token_basic() {
let rpt = update_reward_per_token(0, 1000, 100).unwrap();
assert_eq!(rpt, 10_000_000_000_000);
}
#[test]
fn test_update_reward_per_token_zero_staked() {
assert_eq!(update_reward_per_token(42, 1000, 0).unwrap(), 42);
}
#[test]
fn test_pending_rewards_basic() {
let rpt = 10_000_000_000_000u128;
let pending = pending_rewards(100, rpt, 0).unwrap();
assert_eq!(pending, 1000);
}
#[test]
fn test_pending_rewards_with_debt() {
let rpt = 20_000_000_000_000u128;
let debt = update_reward_debt(100, 10_000_000_000_000);
let pending = pending_rewards(100, rpt, debt).unwrap();
assert_eq!(pending, 1000);
}
#[test]
fn test_update_reward_debt() {
let rpt = 5_000_000_000_000u128;
let debt = update_reward_debt(200, rpt);
assert_eq!(debt, 200 * rpt);
}
#[test]
fn test_emission_rate() {
assert_eq!(emission_rate(1_000_000, 100).unwrap(), 10_000);
assert!(emission_rate(1000, 0).is_err());
}
#[test]
fn test_rewards_earned() {
assert_eq!(rewards_earned(10_000, 60).unwrap(), 600_000);
}
#[test]
fn test_full_staking_cycle() {
let mut rpt = 0u128;
let user_a_staked = 100u64;
let user_a_debt = update_reward_debt(user_a_staked, rpt);
rpt = update_reward_per_token(rpt, 1000, 100).unwrap();
let a_pending = pending_rewards(user_a_staked, rpt, user_a_debt).unwrap();
assert_eq!(a_pending, 1000);
let user_b_staked = 100u64;
let user_b_debt = update_reward_debt(user_b_staked, rpt);
rpt = update_reward_per_token(rpt, 1000, 200).unwrap();
let a_pending_2 = pending_rewards(user_a_staked, rpt, user_a_debt).unwrap();
assert_eq!(a_pending_2, 1500);
let b_pending = pending_rewards(user_b_staked, rpt, user_b_debt).unwrap();
assert_eq!(b_pending, 500);
}