sim-rust 0.4.1

A simulation framework (WIP)
Documentation
use sim_rust::Agent;
use sim_rust::functions::*;


struct TestAgent {
    pub age: u64,
}


impl Agent for TestAgent {
    fn generate() -> Result<Box<Self>, &'static str> {
        Ok(Box::new(TestAgent { age: 0 }))
    }

    fn collect(&self) -> Result<(), &'static str> {
        Ok(())
    }

    fn tick(&mut self) -> Result<(), &'static str> {
        self.age += 1;
        Ok(())
    }
}


#[test]
fn test_tick() -> Result<(), &'static str> {
    let mut env = generate_default_env::<TestAgent>(10)?;
    let new_agent = TestAgent::generate()?;
    env.add_agent(new_agent)?;
    let new_agents: Vec<Box<dyn Agent>> = vec![
        TestAgent::generate()?,
        TestAgent::generate()?,
        TestAgent::generate()?
    ];
    env.add_agents(new_agents)?;
    for _ in 0..100 {
        env = tick(env)?;
    }
    Ok(())
}


#[test]
fn test_tick_collect_once() -> Result<(), &'static str> {
    let mut env = generate_default_env::<TestAgent>(1000)?;
    let new_agent = TestAgent::generate()?;
    env.add_agent(new_agent)?;
    let new_agents: Vec<Box<dyn Agent>> = vec![
        TestAgent::generate()?,
        TestAgent::generate()?,
        TestAgent::generate()?
    ];
    env.add_agents(new_agents)?;
    for _ in 0..100 {
        env = tick(env)?;
    }
    collect(env)?;
    Ok(())
}


#[test]
fn test_multithread_tick_collect_once() -> Result<(), &'static str> {
    generate_default_tick_collect::<TestAgent>(10000, 10000, 100)?;
    Ok(())
}