myest 0.1.0

nothing but funny
Documentation
//! # myest
//! 这个一个测试代码的集合
//! 
//! 
//! 
mod front_of_house;
mod mod_error_deal;
pub mod mod_template;
pub mod mod_trait;
mod mod_clouser;
use std::time::Duration;

use crate::mod_clouser::simulated_expensive_calculation;

//use引用路径
//use crate::front_of_house::hosting;
//相对路径引用
use self::front_of_house::hosting;

//eat_at_restaurant和front_of_house同级 所有不用公开pub
pub fn eat_at_restaurant(){
    crate::front_of_house::hosting::add_to_waitlist();
    front_of_house::hosting::add_to_waitlist();
    hosting::add_to_waitlist();//通过引入路径 简化调用

    let mut meal = front_of_house::serving::back_of_house::Breakfast::summer("Rye");
    meal.toast = String::from("Wheat");
    println!("eat at restaurant : {}", meal.toast);
}

pub fn error_demo(){
    mod_error_deal::error_deal();
    mod_error_deal::read_username_from_file().expect("msg");
}

pub fn notify<T: mod_trait::Summary>(item: T){
    println!("Breaking News! {}", item.summarize());
}

///将传入的数字加2
///
/// # Examples
/// 
/// ```
/// let arg = 5;
/// let answer = myest::add_two(arg);
/// 
/// assert_eq!(7, answer);
/// ```
/// # Panics
/// # Errors
/// # Safety
pub fn add_two(num: i32) -> i32{
    num + 2
}

pub fn generate_work(intensity: u32, random_number: u32){
    let mut expensive_closure = mod_clouser::Cacher::new(|num|{
        println!("calculating slowly...");
        std::thread::sleep(Duration::from_secs(2));
        num
    });
    if intensity < 25{
        println!("Today, do {} pushups", expensive_closure.value(intensity));
        println!("Next, do {} situps", expensive_closure.value(intensity));
    }else{
        if random_number == 3{
            println!("Take a break today! Remember to stay hydrated!");
        }else{
            println!("Today, run for {} minutes", expensive_closure.value(intensity));
        }
    }
}

#[cfg(test)]
mod testst{
    use crate::mod_clouser::{shoes_in_my_size, Counter};

    use super::*;
    #[test]
    fn it_works(){
        assert_eq!(2 + 2, 4);
    }

    #[test]
    fn another(){
        //panic!("make this test fail!");
    }

    #[test]
    fn another_works() -> Result<(), String>{
        let a = private_run()?;
        Ok(())
    }
    fn private_run() -> Result<(), String>{
        if 2 + 2 == 4{
            Ok(())
        }else {
            Err(String::from("fdfsfsadf"))
        }
    }

    #[test]
    fn filter_by_size(){
        let shoes = vec![
            mod_clouser::Shoe::new(10, String::from("sneaker")),
            mod_clouser::Shoe::new(13, String::from("sandal")),
            mod_clouser::Shoe::new(10, String::from("boot")),
        ];

        let in_my_size = mod_clouser::shoes_in_my_size(shoes, 10);
        assert_eq!(in_my_size, vec![
            mod_clouser::Shoe::new(10, String::from("sneaker")),
            mod_clouser::Shoe::new(10, String::from("boot"))
        ])
    }

    #[test]
    fn calling_next_directly(){
        let mut counter = mod_clouser::Counter::new();

        assert_eq!(counter.next(), Some(1));
        assert_eq!(counter.next(), Some(2));
        assert_eq!(counter.next(), Some(3));
        assert_eq!(counter.next(), Some(4));
        assert_eq!(counter.next(), Some(5));
        assert_eq!(counter.next(), None);
        assert_eq!(counter.next(), None);
        assert_eq!(counter.next(), None);
        assert_eq!(counter.next(), None);
    }

    #[test]
    fn using_other_iterator_trait_methods(){
        let sum: u32 = Counter::new().zip(Counter::new().skip(1)).map(|(a, b)|a*b).filter(|x|x % 3 == 0).sum();
        assert_eq!(18, sum);
    }
}