use crate::continent::coord::Coord;
use crate::continent::size::ContinentSize;
use crate::military::Military;
use crate::military::army::personnel::ArmyPersonnel;
use crate::military::army::{Army, ArmyState, collapse_armies};
use crate::military::maneuver::ManeuverId;
use crate::tests::make_ruler_bot;
use tap::Pipe;
#[test]
fn spawn() {
let size = ContinentSize::new(50);
let mut military = Military::new(size);
assert_eq!(military.count_armies(), 0);
let coord = Coord::splat(0);
let ruler = make_ruler_bot("Bot 1");
let personnel = ArmyPersonnel::splat(10);
military.spawn(coord, ruler, personnel);
assert_eq!(military.count_armies(), 1);
}
#[test]
fn collapse() {
let ruler = make_ruler_bot("Bot 1");
let mut armies = Vec::with_capacity(15);
for _ in 0..10 {
Army::builder()
.owner(ruler.clone())
.personnel(ArmyPersonnel::splat(10))
.build()
.pipe(|army| armies.push(army));
}
Army::builder()
.owner(ruler.clone())
.personnel(ArmyPersonnel::splat(10))
.state(ArmyState::with_maneuver(ManeuverId::new()))
.build()
.pipe(|army| armies.push(army));
Army::builder()
.owner(make_ruler_bot("Bot 2"))
.personnel(ArmyPersonnel::splat(10))
.build()
.pipe(|army| armies.push(army));
Army::builder()
.owner(make_ruler_bot("Bot 3"))
.personnel(ArmyPersonnel::splat(10))
.build()
.pipe(|army| armies.push(army));
assert_eq!(armies.len(), 13);
collapse_armies(&mut armies);
assert_eq!(armies.len(), 4);
}
#[test]
fn intersection() {
let size = ContinentSize::new(50);
let mut military = Military::new(size);
let ruler = make_ruler_bot("Bot 1");
let mut coords = Vec::with_capacity(10);
let mut spawn = |coord: Coord| {
let personnel = ArmyPersonnel::splat(10);
military.spawn(coord, ruler.clone(), personnel);
};
for i in 0..10 {
let coord = Coord::splat(i);
spawn(coord);
spawn(coord);
spawn(coord);
coords.push(coord);
}
assert_eq!(military.count_armies(), coords.len());
let coords = coords.iter().take(3).copied();
let military = military.intersection(coords).unwrap();
assert_eq!(military.count_armies(), 3);
}