PkmnLib_rs/src/static_data/libraries/species_library.rs

110 lines
2.8 KiB
Rust

use crate::static_data::libraries::data_library::DataLibrary;
use crate::static_data::species_data::species::Species;
use crate::StringKey;
use hashbrown::HashMap;
#[derive(Debug)]
pub struct SpeciesLibrary<'a> {
map: HashMap<StringKey, Box<Species<'a>>>,
list: Vec<StringKey>,
}
impl<'a> SpeciesLibrary<'a> {
pub fn new(capacity: usize) -> SpeciesLibrary<'a> {
SpeciesLibrary {
map: HashMap::with_capacity(capacity),
list: Vec::with_capacity(capacity),
}
}
}
impl<'a> DataLibrary<'a, Box<Species<'a>>> for SpeciesLibrary<'a> {
fn map(&self) -> &HashMap<StringKey, Box<Species<'a>>> {
&self.map
}
fn list_values(&self) -> &Vec<StringKey> {
&self.list
}
fn get_modify(
&mut self,
) -> (
&mut HashMap<StringKey, Box<Species<'a>>>,
&mut Vec<StringKey>,
) {
(&mut self.map, &mut self.list)
}
}
#[cfg(test)]
pub mod tests {
use crate::static_data::libraries::data_library::DataLibrary;
use crate::static_data::libraries::species_library::SpeciesLibrary;
use crate::static_data::species_data::form::Form;
use crate::static_data::species_data::learnable_moves::LearnableMoves;
use crate::static_data::species_data::species::Species;
use crate::static_data::statistic_set::StatisticSet;
use hashbrown::HashSet;
fn build_species<'a>() -> Species<'a> {
Species::new(
0,
&"foo".into(),
0.5,
&"test_growthrate".into(),
0,
Form::new(
&"default".into(),
0.0,
0.0,
0,
Vec::new(),
StatisticSet::default(),
Vec::new(),
Vec::new(),
LearnableMoves::new(),
HashSet::new(),
),
HashSet::new(),
)
}
pub fn build<'a>() -> SpeciesLibrary<'a> {
let mut lib = SpeciesLibrary::new(1);
let species = build_species();
// Borrow as mut so we can insert
let w = &mut lib;
w.add(&"foo".into(), Box::from(species));
// Drops borrow as mut
lib
}
#[test]
fn add_species_to_library_and_fetch() {
let lib = build();
// Borrow as read so we can read
let r = &lib;
let mon = r.get(&"foo".into());
assert!(mon.is_some());
assert_eq!(mon.unwrap().id(), 0_u16);
assert_eq!(mon.unwrap().as_ref().name(), &"foo".into());
assert_eq!(r.len(), 1);
}
#[test]
fn add_species_to_library_then_remove() {
let mut lib = build();
lib.remove(&"foo".into());
// Borrow as read so we can read
let r = &lib;
let mon = r.get(&"foo".into());
assert!(mon.is_none());
assert_eq!(r.len(), 0);
}
}