pub trait Messenger {
fn send(&self, msg:&str);
}
pub struct LimitTracker<'a,T:Messenger>{
_messenger : &'a T,
_value:usize,
_max:usize
}
impl<'a,T> LimitTracker<'a,T> where T:Messenger,
{
pub fn new (messenger:&'a T,max:usize) -> LimitTracker<'a,T>
{
return LimitTracker
{
_messenger: messenger,
_value: 0,
_max:max
};
}
pub fn set_value(&mut self,value:usize){
let mut msg = "";
self._value = value;
let percentage_of_max = self._value as f64 / self._max as f64;
if percentage_of_max >= 1.0{
msg = "Error:you are over your quota";
}
else if percentage_of_max >= 0.9{
msg = "urgent warning:you've used up over 90% of you quota";
}
else if percentage_of_max >= 0.75{
msg = "warning:you've used up over 75% of your quota";
}
self._messenger.send(msg);
}
}
pub fn enter(){
self::tests::it_sends_an_over_75_percent_warning_message();
}
fn _fn_()
{
}
fn fn_(){
}
mod tests{
use std::{cell::RefCell, vec};
use super::*;
struct MockMessenger{
_sent_messages:RefCell<Vec<String>>,
}
impl MockMessenger
{
fn new() -> MockMessenger
{
return MockMessenger
{
_sent_messages: RefCell::new(vec![]),
};
}
fn test_mut_borrow_mut(&self)
{
let mut one_borrow = self._sent_messages.borrow_mut();
let mut two_borrow = self._sent_messages.borrow_mut();
one_borrow.push(String::from("123"));
two_borrow.push(String::from("123"));
}
}
impl Messenger for MockMessenger {
fn send(&self, message: &str)
{
println!("MockMessenger.send!");
self._sent_messages.borrow_mut().push(String::from(message));
}
}
pub fn it_sends_an_over_75_percent_warning_message(){
let mock_messenger = MockMessenger::new();
let mut limit_tricker = LimitTracker::new(&mock_messenger,100);
limit_tricker.set_value(80);
assert_eq!(mock_messenger._sent_messages.borrow().len(),1);
}
}