use alloc::string::String;
use serde::{
Deserialize,
Serialize,
};
use serde_string_enum::{
DeserializeLabeledStringEnum,
SerializeLabeledStringEnum,
};
use crate::Gender;
#[derive(Debug, Clone, PartialEq, SerializeLabeledStringEnum, DeserializeLabeledStringEnum)]
pub enum EvolutionMethod {
#[string = "L"]
#[alias = "Level"]
Level,
#[string = "T"]
#[alias = "Trade"]
Trade,
#[string = "I"]
#[alias = "Item"]
Item,
#[string = "B"]
#[alias = "Battle"]
BattleEnd,
#[string = "C"]
#[alias = "Custom"]
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EvolutionData {
pub method: EvolutionMethod,
pub condition: String,
pub level: Option<u8>,
pub friendship: Option<bool>,
pub knows_move: Option<String>,
pub time_of_day: Option<String>,
pub holding_item: Option<String>,
pub gender: Option<Gender>,
pub use_item: Option<String>,
pub trade_for: Option<String>,
}
#[cfg(test)]
mod evolution_method_test {
use crate::{
mons::EvolutionMethod,
test_util::{
test_string_deserialization,
test_string_serialization,
},
};
#[test]
fn serializes_to_string() {
test_string_serialization(EvolutionMethod::Level, "L");
test_string_serialization(EvolutionMethod::Trade, "T");
test_string_serialization(EvolutionMethod::Item, "I");
test_string_serialization(EvolutionMethod::BattleEnd, "B");
test_string_serialization(EvolutionMethod::Custom, "C");
}
#[test]
fn deserializes_full_name() {
test_string_deserialization("Level", EvolutionMethod::Level);
test_string_deserialization("Trade", EvolutionMethod::Trade);
test_string_deserialization("Item", EvolutionMethod::Item);
test_string_deserialization("Battle", EvolutionMethod::BattleEnd);
test_string_deserialization("Custom", EvolutionMethod::Custom);
}
}