From 3e5afffb33330b0324d703044fea15a6741fcf68 Mon Sep 17 00:00:00 2001 From: Kate Korsaro Date: Sat, 15 Nov 2025 16:13:59 +0100 Subject: [PATCH] feat: add sum method --- 01.workspace/oxydice_lib/src/imp/dice_roll.rs | 3 +- 01.workspace/oxydice_lib/src/imp/dice_sum.rs | 16 ++++++ 01.workspace/oxydice_lib/src/imp/mod.rs | 1 + 01.workspace/oxydice_lib/src/lib.rs | 3 ++ 01.workspace/oxydice_lib/src/str/failed_to.rs | 51 +++++++++++++++++++ 01.workspace/oxydice_lib/src/str/mod.rs | 2 + 01.workspace/oxydice_lib/src/str/sum.rs | 18 +++++++ 01.workspace/oxydice_lib/src/tst/dice_roll.rs | 8 ++- 01.workspace/oxydice_lib/src/tst/dice_sum.rs | 16 ++++++ 01.workspace/oxydice_lib/src/tst/mod.rs | 3 +- 10 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 01.workspace/oxydice_lib/src/imp/dice_sum.rs create mode 100644 01.workspace/oxydice_lib/src/str/failed_to.rs create mode 100644 01.workspace/oxydice_lib/src/str/sum.rs create mode 100644 01.workspace/oxydice_lib/src/tst/dice_sum.rs diff --git a/01.workspace/oxydice_lib/src/imp/dice_roll.rs b/01.workspace/oxydice_lib/src/imp/dice_roll.rs index 4ffc0bc..1fa0bbd 100644 --- a/01.workspace/oxydice_lib/src/imp/dice_roll.rs +++ b/01.workspace/oxydice_lib/src/imp/dice_roll.rs @@ -1,10 +1,11 @@ use crate::*; impl Dice { - pub fn roll(&mut self) { + pub fn roll(mut self) -> Self { self.roll_results.clear(); for die in &self.handful { self.roll_results.push(die.roll()) } + self } } diff --git a/01.workspace/oxydice_lib/src/imp/dice_sum.rs b/01.workspace/oxydice_lib/src/imp/dice_sum.rs new file mode 100644 index 0000000..4a6c418 --- /dev/null +++ b/01.workspace/oxydice_lib/src/imp/dice_sum.rs @@ -0,0 +1,16 @@ +use crate::*; + +impl Dice { + pub fn sum(self) -> Result { + 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) + } +} diff --git a/01.workspace/oxydice_lib/src/imp/mod.rs b/01.workspace/oxydice_lib/src/imp/mod.rs index b2f5611..6aea642 100644 --- a/01.workspace/oxydice_lib/src/imp/mod.rs +++ b/01.workspace/oxydice_lib/src/imp/mod.rs @@ -1,3 +1,4 @@ pub mod dice_grab; pub mod dice_roll; +pub mod dice_sum; pub mod die_roll; diff --git a/01.workspace/oxydice_lib/src/lib.rs b/01.workspace/oxydice_lib/src/lib.rs index 488c6b9..62b6080 100644 --- a/01.workspace/oxydice_lib/src/lib.rs +++ b/01.workspace/oxydice_lib/src/lib.rs @@ -11,7 +11,10 @@ mod tst; pub(crate) use crate::str::dice::O as Dice; 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 use crate::str::dice::O as Dice; + pub use crate::str::sum::O as Sum; } diff --git a/01.workspace/oxydice_lib/src/str/failed_to.rs b/01.workspace/oxydice_lib/src/str/failed_to.rs new file mode 100644 index 0000000..e8159aa --- /dev/null +++ b/01.workspace/oxydice_lib/src/str/failed_to.rs @@ -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; +// fn from_str(value: &str) -> std::result::Result> { +// 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"), +// } +// } +// } +// } diff --git a/01.workspace/oxydice_lib/src/str/mod.rs b/01.workspace/oxydice_lib/src/str/mod.rs index 177f396..6789632 100644 --- a/01.workspace/oxydice_lib/src/str/mod.rs +++ b/01.workspace/oxydice_lib/src/str/mod.rs @@ -1,2 +1,4 @@ pub mod dice; pub mod die; +pub mod failed_to; +pub mod sum; diff --git a/01.workspace/oxydice_lib/src/str/sum.rs b/01.workspace/oxydice_lib/src/str/sum.rs new file mode 100644 index 0000000..9238763 --- /dev/null +++ b/01.workspace/oxydice_lib/src/str/sum.rs @@ -0,0 +1,18 @@ +use crate::*; + +#[derive(Debug, Default, PartialEq, Clone)] +pub struct O { + pub(crate) roll_results: Vec, + 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::*; +// } diff --git a/01.workspace/oxydice_lib/src/tst/dice_roll.rs b/01.workspace/oxydice_lib/src/tst/dice_roll.rs index f6c587d..d67b400 100644 --- a/01.workspace/oxydice_lib/src/tst/dice_roll.rs +++ b/01.workspace/oxydice_lib/src/tst/dice_roll.rs @@ -3,15 +3,13 @@ mod tests { use crate::*; #[test] pub fn roll_should_yield_correct_number_or_results() { - let mut dice = Dice::grab(3, 6); - dice.roll(); + let dice = Dice::grab(3, 6); + let dice = dice.roll(); assert_eq!(dice.roll_results.len(), 3); } #[test] fn reroll_should_yield_correct_number_of_results() { - let mut dice = Dice::grab(3, 6); - dice.roll(); - dice.roll(); + let dice = Dice::grab(3, 6).roll().roll(); assert_eq!(dice.roll_results.len(), 3); } } diff --git a/01.workspace/oxydice_lib/src/tst/dice_sum.rs b/01.workspace/oxydice_lib/src/tst/dice_sum.rs new file mode 100644 index 0000000..974717d --- /dev/null +++ b/01.workspace/oxydice_lib/src/tst/dice_sum.rs @@ -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); + } + } +} diff --git a/01.workspace/oxydice_lib/src/tst/mod.rs b/01.workspace/oxydice_lib/src/tst/mod.rs index c4701d4..6aea642 100644 --- a/01.workspace/oxydice_lib/src/tst/mod.rs +++ b/01.workspace/oxydice_lib/src/tst/mod.rs @@ -1,3 +1,4 @@ pub mod dice_grab; -pub mod die_roll; pub mod dice_roll; +pub mod dice_sum; +pub mod die_roll;