nil-core 0.6.6

Multiplayer strategy game
Documentation
// Copyright (C) Call of Nil contributors
// SPDX-License-Identifier: AGPL-3.0-only

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);
}