-
Notifications
You must be signed in to change notification settings - Fork 77
/
tests.rs
125 lines (113 loc) · 4.38 KB
/
tests.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/// Tests for Reward
use crate::mock::*;
use frame_support::{assert_err, assert_ok};
use rand::Rng;
// type Event = crate::Event<Test>;
macro_rules! fixed {
($amount:expr) => {
sp_arithmetic::FixedI128::from($amount)
};
}
#[test]
fn should_distribute_rewards_equally() {
run_test(|| {
assert_ok!(Reward::deposit_stake(&ALICE, fixed!(50)));
assert_ok!(Reward::deposit_stake(&BOB, fixed!(50)));
assert_ok!(Reward::distribute_reward(Token(IBTC), fixed!(100)));
assert_ok!(Reward::compute_reward(Token(IBTC), &ALICE), 50);
assert_ok!(Reward::compute_reward(Token(IBTC), &BOB), 50);
})
}
#[test]
fn should_distribute_uneven_rewards_equally() {
run_test(|| {
assert_ok!(Reward::deposit_stake(&ALICE, fixed!(50)));
assert_ok!(Reward::deposit_stake(&BOB, fixed!(50)));
assert_ok!(Reward::distribute_reward(Token(IBTC), fixed!(451)));
assert_ok!(Reward::compute_reward(Token(IBTC), &ALICE), 225);
assert_ok!(Reward::compute_reward(Token(IBTC), &BOB), 225);
})
}
#[test]
fn should_not_update_previous_rewards() {
run_test(|| {
assert_ok!(Reward::deposit_stake(&ALICE, fixed!(40)));
assert_ok!(Reward::distribute_reward(Token(IBTC), fixed!(1000)));
assert_ok!(Reward::compute_reward(Token(IBTC), &ALICE), 1000);
assert_ok!(Reward::deposit_stake(&BOB, fixed!(20)));
assert_ok!(Reward::compute_reward(Token(IBTC), &ALICE), 1000);
assert_ok!(Reward::compute_reward(Token(IBTC), &BOB), 0);
})
}
#[test]
fn should_withdraw_reward() {
run_test(|| {
assert_ok!(Reward::deposit_stake(&ALICE, fixed!(45)));
assert_ok!(Reward::deposit_stake(&BOB, fixed!(55)));
assert_ok!(Reward::distribute_reward(Token(IBTC), fixed!(2344)));
assert_ok!(Reward::compute_reward(Token(IBTC), &BOB), 1289);
assert_ok!(Reward::withdraw_reward(&ALICE, Token(IBTC)), 1054);
assert_ok!(Reward::compute_reward(Token(IBTC), &BOB), 1289);
})
}
#[test]
fn should_withdraw_stake() {
run_test(|| {
assert_ok!(Reward::deposit_stake(&ALICE, fixed!(1312)));
assert_ok!(Reward::distribute_reward(Token(IBTC), fixed!(4242)));
// rounding in `CheckedDiv` loses some precision
assert_ok!(Reward::compute_reward(Token(IBTC), &ALICE), 4241);
assert_ok!(Reward::withdraw_stake(&ALICE, fixed!(1312)));
assert_ok!(Reward::compute_reward(Token(IBTC), &ALICE), 4241);
})
}
#[test]
fn should_not_withdraw_stake_if_balance_insufficient() {
run_test(|| {
assert_ok!(Reward::deposit_stake(&ALICE, fixed!(100)));
assert_ok!(Reward::distribute_reward(Token(IBTC), fixed!(2000)));
assert_ok!(Reward::compute_reward(Token(IBTC), &ALICE), 2000);
assert_err!(
Reward::withdraw_stake(&ALICE, fixed!(200)),
TestError::InsufficientFunds
);
})
}
#[test]
fn should_deposit_stake() {
run_test(|| {
assert_ok!(Reward::deposit_stake(&ALICE, fixed!(25)));
assert_ok!(Reward::deposit_stake(&ALICE, fixed!(25)));
assert_eq!(Reward::stake(&ALICE), fixed!(50));
assert_ok!(Reward::deposit_stake(&BOB, fixed!(50)));
assert_ok!(Reward::distribute_reward(Token(IBTC), fixed!(1000)));
assert_ok!(Reward::compute_reward(Token(IBTC), &ALICE), 500);
})
}
#[test]
fn should_not_distribute_rewards_without_stake() {
run_test(|| {
assert_err!(
Reward::distribute_reward(Token(IBTC), fixed!(1000)),
TestError::ZeroTotalStake
);
assert_eq!(Reward::total_rewards(Token(IBTC)), fixed!(0));
})
}
#[test]
fn should_distribute_with_many_rewards() {
// test that reward tally doesn't overflow
run_test(|| {
let mut rng = rand::thread_rng();
assert_ok!(Reward::deposit_stake(&ALICE, fixed!(9230404)));
assert_ok!(Reward::deposit_stake(&BOB, fixed!(234234444)));
for _ in 0..30 {
// NOTE: this will overflow compute_reward with > u32
assert_ok!(Reward::distribute_reward(Token(IBTC), fixed!(rng.gen::<u32>() as i128)));
}
let alice_reward = Reward::compute_reward(Token(IBTC), &ALICE).unwrap();
assert_ok!(Reward::withdraw_reward(&ALICE, Token(IBTC)), alice_reward);
let bob_reward = Reward::compute_reward(Token(IBTC), &BOB).unwrap();
assert_ok!(Reward::withdraw_reward(&BOB, Token(IBTC)), bob_reward);
})
}