feat: add sum method

This commit is contained in:
2025-11-15 16:13:59 +01:00
parent 95766fb897
commit 3e5afffb33
10 changed files with 114 additions and 7 deletions

View File

@@ -1,10 +1,11 @@
use crate::*; use crate::*;
impl Dice { impl Dice {
pub fn roll(&mut self) { pub fn roll(mut self) -> Self {
self.roll_results.clear(); self.roll_results.clear();
for die in &self.handful { for die in &self.handful {
self.roll_results.push(die.roll()) self.roll_results.push(die.roll())
} }
self
} }
} }

View File

@@ -0,0 +1,16 @@
use crate::*;
impl Dice {
pub fn sum(self) -> Result<Sum, FailedTo> {
let mut result = Sum::default();
for roll_result in self.roll_results {
result.roll_results.push(roll_result);
result.sum = result
.sum
.checked_add(roll_result.into())
.and_then(|r| r.checked_add(1u64))
.ok_or(FailedTo::Sum)?;
}
Ok(result)
}
}

View File

@@ -1,3 +1,4 @@
pub mod dice_grab; pub mod dice_grab;
pub mod dice_roll; pub mod dice_roll;
pub mod dice_sum;
pub mod die_roll; pub mod die_roll;

View File

@@ -11,7 +11,10 @@ mod tst;
pub(crate) use crate::str::dice::O as Dice; pub(crate) use crate::str::dice::O as Dice;
pub(crate) use crate::str::die::O as Die; pub(crate) use crate::str::die::O as Die;
pub(crate) use crate::str::failed_to::E as FailedTo;
pub(crate) use crate::str::sum::O as Sum;
pub mod dice { pub mod dice {
pub use crate::str::dice::O as Dice; pub use crate::str::dice::O as Dice;
pub use crate::str::sum::O as Sum;
} }

View File

@@ -0,0 +1,51 @@
// use crate::*;
// use std::fmt::Display;
// use std::str::FromStr;
#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Clone, Copy, Hash)]
pub enum E {
Sum,
}
// impl Display for E {
// fn fmt(&self, f: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
// match self {
// Self::NoValue => write!(f, "NoValue"),
// }
// }
// }
// impl FromStr for E {
// type Err = Box<dyn std::error::Error>;
// fn from_str(value: &str) -> std::result::Result<Self, Box<dyn std::error::Error>> {
// match value {
// "NoValue" => Ok(Self::NoValue),
// _ => unreachable!(),
// }
// }
// }
// #[cfg(test)]
// mod unit_tests {
// use super::*;
// #[test]
// fn check_001() {
// for value in [E::NoValue] {
// match value {
// E::NoValue => assert_eq!(
// E::NoValue,
// E::from_str("NoValue").unwrap()
// ),
// }
// }
// }
//
// #[test]
// fn check_002() {
// for value in [E::NoValue] {
// match value {
// E::NoValue => assert_eq!(&E::NoValue.to_string(), "NoValue"),
// }
// }
// }
// }

View File

@@ -1,2 +1,4 @@
pub mod dice; pub mod dice;
pub mod die; pub mod die;
pub mod failed_to;
pub mod sum;

View File

@@ -0,0 +1,18 @@
use crate::*;
#[derive(Debug, Default, PartialEq, Clone)]
pub struct O {
pub(crate) roll_results: Vec<u16>,
pub(crate) sum: u64,
}
// impl std::fmt::Display for O {
// fn fmt(&self, _f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
// todo!();
// }
// }
// #[cfg(test)]
// mod unit_tests {
// use super::*;
// }

View File

@@ -3,15 +3,13 @@ mod tests {
use crate::*; use crate::*;
#[test] #[test]
pub fn roll_should_yield_correct_number_or_results() { pub fn roll_should_yield_correct_number_or_results() {
let mut dice = Dice::grab(3, 6); let dice = Dice::grab(3, 6);
dice.roll(); let dice = dice.roll();
assert_eq!(dice.roll_results.len(), 3); assert_eq!(dice.roll_results.len(), 3);
} }
#[test] #[test]
fn reroll_should_yield_correct_number_of_results() { fn reroll_should_yield_correct_number_of_results() {
let mut dice = Dice::grab(3, 6); let dice = Dice::grab(3, 6).roll().roll();
dice.roll();
dice.roll();
assert_eq!(dice.roll_results.len(), 3); assert_eq!(dice.roll_results.len(), 3);
} }
} }

View File

@@ -0,0 +1,16 @@
#[cfg(test)]
mod tests {
use crate::*;
#[test]
pub fn dice_sum_should_yield_the_correct_sum() {
let result = Dice::grab(6, 1).roll().sum().unwrap();
assert_eq!(result.sum, 6);
}
#[test]
fn dice_sum_should_list_the_correct_results() {
let result = Dice::grab(6, 1).roll().sum().unwrap();
for idx in 1..6 {
assert_eq!(result.roll_results[idx], 0);
}
}
}

View File

@@ -1,3 +1,4 @@
pub mod dice_grab; pub mod dice_grab;
pub mod die_roll;
pub mod dice_roll; pub mod dice_roll;
pub mod dice_sum;
pub mod die_roll;