use super::{Token, Weight, WeightMeter};
use crate::tests::Test;
macro_rules! match_tokens {
($tokens_iter:ident,) => {
};
($tokens_iter:ident, $x:expr, $($rest:tt)*) => {
{
let next = ($tokens_iter).next().unwrap();
let pattern = $x;
let mut _pattern_typed_next_ref = &pattern;
_pattern_typed_next_ref = match next.token.downcast_ref() {
Some(p) => {
assert_eq!(p, &pattern);
p
}
None => {
panic!("expected type {} got {}", stringify!($x), next.description);
}
};
}
match_tokens!($tokens_iter, $($rest)*);
};
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
struct SimpleToken(u64);
impl Token<Test> for SimpleToken {
fn weight(&self) -> Weight {
Weight::from_parts(self.0, 0)
}
}
#[test]
fn it_works() {
let weight_meter = WeightMeter::<Test>::new(Weight::from_parts(50000, 0), None);
assert_eq!(weight_meter.weight_left(), Weight::from_parts(50000, 0));
}
#[test]
fn tracing() {
let mut weight_meter = WeightMeter::<Test>::new(Weight::from_parts(50000, 0), None);
assert!(!weight_meter.charge(SimpleToken(1)).is_err());
let mut tokens = weight_meter.tokens().iter();
match_tokens!(tokens, SimpleToken(1),);
}
#[test]
fn refuse_to_execute_anything_if_zero() {
let mut weight_meter = WeightMeter::<Test>::new(Weight::zero(), None);
assert!(weight_meter.charge(SimpleToken(1)).is_err());
}
#[test]
fn nested_zero_weight_requested() {
let test_weight = 50000.into();
let mut weight_meter = WeightMeter::<Test>::new(test_weight, None);
let weight_for_nested_call = weight_meter.nested(0.into());
assert_eq!(weight_meter.weight_left(), 50000.into());
assert_eq!(weight_for_nested_call.weight_left(), 0.into())
}
#[test]
fn nested_some_weight_requested() {
let test_weight = 50000.into();
let mut weight_meter = WeightMeter::<Test>::new(test_weight, None);
let weight_for_nested_call = weight_meter.nested(10000.into());
assert_eq!(weight_meter.weight_consumed(), 0.into());
assert_eq!(weight_for_nested_call.weight_left(), 10000.into())
}
#[test]
fn nested_all_weight_requested() {
let test_weight = Weight::from_parts(50000, 50000);
let mut weight_meter = WeightMeter::<Test>::new(test_weight, None);
let weight_for_nested_call = weight_meter.nested(test_weight);
assert_eq!(weight_meter.weight_consumed(), Weight::from_parts(0, 0));
assert_eq!(weight_for_nested_call.weight_left(), 50_000.into())
}
#[test]
fn nested_excess_weight_requested() {
let test_weight = Weight::from_parts(50000, 50000);
let mut weight_meter = WeightMeter::<Test>::new(test_weight, None);
let weight_for_nested_call = weight_meter.nested(test_weight + 10000.into());
assert_eq!(weight_meter.weight_consumed(), Weight::from_parts(0, 0));
assert_eq!(weight_for_nested_call.weight_left(), 50_000.into())
}
#[test]
fn overcharge_does_not_charge() {
let mut weight_meter = WeightMeter::<Test>::new(Weight::from_parts(200, 0), None);
assert!(weight_meter.charge(SimpleToken(300)).is_err());
assert!(weight_meter.charge(SimpleToken(200)).is_ok());
}
#[test]
fn charge_exact_amount() {
let mut weight_meter = WeightMeter::<Test>::new(Weight::from_parts(25, 0), None);
assert!(!weight_meter.charge(SimpleToken(25)).is_err());
}