use rand::rngs::StdRng;
use rand::SeedableRng;
use rustsim_core::{
prelude::{Agent, AgentStore, Fastest, HashMapStore, Randomly, StandardModel},
scheduler::Scheduler,
standard::HasAgentIds,
types::AgentId,
};
mod support;
use support::NothingSpace;
#[derive(Debug, Clone)]
struct SimpleAgent {
id: AgentId,
}
impl Agent for SimpleAgent {
fn id(&self) -> AgentId {
self.id
}
}
type TestModel =
StandardModel<NothingSpace, SimpleAgent, HashMapStore<SimpleAgent>, (), StdRng, Fastest>;
type RandomModel =
StandardModel<NothingSpace, SimpleAgent, HashMapStore<SimpleAgent>, (), StdRng, Randomly>;
fn make_store(n: u64) -> HashMapStore<SimpleAgent> {
let mut store = HashMapStore::new();
for i in 1..=n {
store.insert(SimpleAgent { id: i });
}
store
}
#[test]
fn fastest_returns_all_ids() {
let model = TestModel::new(
make_store(5),
NothingSpace,
Fastest::new(),
(),
StdRng::seed_from_u64(0),
None,
None,
true,
);
let ids = model.agent_ids();
assert_eq!(ids.len(), 5);
for i in 1..=5u64 {
assert!(ids.contains(&i));
}
}
#[test]
fn randomly_scheduler_shuffles() {
let model = RandomModel::new(
make_store(20),
NothingSpace,
Randomly::new(),
(),
StdRng::seed_from_u64(42),
None,
None,
true,
);
let mut scheduler = Randomly::new();
let mut buf = Vec::new();
buf.clear();
scheduler.schedule_into(&model, &mut buf);
let order1 = buf.clone();
buf.clear();
scheduler.schedule_into(&model, &mut buf);
let order2 = buf.clone();
assert_eq!(order1.len(), 20);
assert_eq!(order2.len(), 20);
assert_ne!(
order1, order2,
"random scheduler should produce different orderings"
);
}
#[test]
fn randomly_scheduler_contains_all() {
let model = RandomModel::new(
make_store(10),
NothingSpace,
Randomly::new(),
(),
StdRng::seed_from_u64(99),
None,
None,
true,
);
let mut scheduler = Randomly::new();
let mut buf = Vec::new();
scheduler.schedule_into(&model, &mut buf);
assert_eq!(buf.len(), 10);
for i in 1..=10u64 {
assert!(buf.contains(&i));
}
}