use crate::stat_id::StatId;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ResolvedStat {
pub stat_id: StatId,
pub value: f64,
pub sources: Vec<(String, f64)>,
pub transforms: Vec<(String, f64)>,
}
impl ResolvedStat {
pub fn new(stat_id: StatId, value: f64) -> Self {
Self {
stat_id,
value,
sources: Vec::new(),
transforms: Vec::new(),
}
}
pub fn add_source(&mut self, description: impl Into<String>, value: f64) {
self.sources.push((description.into(), value));
}
pub fn add_transform(&mut self, description: impl Into<String>, value: f64) {
self.transforms.push((description.into(), value));
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_resolved_stat_creation() {
let stat = ResolvedStat::new(StatId::from_str("HP"), 150.0);
assert_eq!(stat.stat_id.as_str(), "HP");
assert_eq!(stat.value, 150.0);
assert!(stat.sources.is_empty());
assert!(stat.transforms.is_empty());
}
#[test]
fn test_resolved_stat_breakdown() {
let mut stat = ResolvedStat::new(StatId::from_str("ATK"), 75.0);
stat.add_source("Base", 50.0);
stat.add_source("Item", 25.0);
stat.add_transform("Multiplier 1.5x", 75.0);
assert_eq!(stat.sources.len(), 2);
assert_eq!(stat.transforms.len(), 1);
}
}