WI-1: injectable RNG - request_rng() single construction point (StdRng::from_os_rng), thread rng through create_character and run_adventure, seeded determinism test (PSP1, issue #1)

This commit is contained in:
Jan-Peter von Hunnius 2026-10-03 09:56:41 +02:00
parent 64e081aeb7
commit 61fef27917
2 changed files with 44 additions and 7 deletions

View file

@ -126,10 +126,15 @@ pub fn training_cost(stat: i64) -> i32 {
(5.0_f64 * 1.3_f64.powi(scaled)) as i32
}
pub fn create_character(user_id: u32, name: String, race: Race, class: Class) -> Character {
let mut rng = rand::rng();
pub fn create_character(
rng: &mut impl rand::Rng,
user_id: u32,
name: String,
race: Race,
class: Class,
) -> Character {
let class_str = class.as_str().to_string();
let stats = roll_stats(&mut rng, &race);
let stats = roll_stats(rng, &race);
let max_hp = calc_max_hp(&class, &stats);
let max_energy = calc_max_energy(&class);
let max_nerve = calc_max_nerve(&class);
@ -412,4 +417,28 @@ mod tests {
assert!(dwarf.strength > human.strength);
assert!(dwarf.intelligence < human.intelligence);
}
#[test]
fn create_character_is_deterministic_under_seeded_rng() {
use rand::SeedableRng;
let first = create_character(
&mut rand::rngs::StdRng::seed_from_u64(42),
7,
"Twin".into(),
Race::Human,
Class::Warrior,
);
let second = create_character(
&mut rand::rngs::StdRng::seed_from_u64(42),
7,
"Twin".into(),
Race::Human,
Class::Warrior,
);
assert_eq!(format!("{:?}", first.stats), format!("{:?}", second.stats));
assert_eq!(first.hp, second.hp);
assert_eq!(first.max_hp, second.max_hp);
assert_eq!(first.energy, second.energy);
assert_eq!(first.nerve, second.nerve);
}
}