Files
cyberpunk/crates/citygen/tests/seeds.rs
Jeffrey Wilcke 9ac713bbe9 feat(citygen): City::validate and seed sweep tests
Also guarantees one building per district and repairs interiors split
by crossing partitions, both found by the new validation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-12 17:21:08 +02:00

65 lines
1.5 KiB
Rust

//! Determinism and invariant sweeps over many seeds.
use citygen::*;
fn sweep(preset: SizePreset, seeds: std::ops::Range<u64>) {
for seed in seeds {
let p = GenParams {
seed,
size: preset,
water: match seed % 3 {
0 => WaterMode::Bay,
1 => WaterMode::River,
_ => WaterMode::None,
},
districts: 4 + (seed % 9) as u8,
..Default::default()
};
if p.validate().is_err() {
continue;
}
let a = Generator::run(p.clone()).unwrap_or_else(|e| panic!("seed {seed}: {e}"));
let b = Generator::run(p).unwrap();
assert_eq!(
postcard::to_allocvec(&a).unwrap(),
postcard::to_allocvec(&b).unwrap(),
"seed {seed} not deterministic"
);
a.validate()
.unwrap_or_else(|v| panic!("seed {seed}: {v:?}"));
}
}
#[test]
fn small_seeds() {
sweep(SizePreset::Small, 0..50);
}
#[test]
fn medium_seeds() {
sweep(SizePreset::Medium, 1000..1010);
}
#[test]
fn large_seeds() {
sweep(SizePreset::Large, 2000..2003);
}
#[test]
#[ignore]
fn extended_seeds() {
sweep(SizePreset::Small, 100..250);
sweep(SizePreset::Medium, 3000..3050);
}
#[test]
fn medium_generates_under_two_seconds() {
let t = std::time::Instant::now();
Generator::run(GenParams {
seed: 77,
..Default::default()
})
.unwrap();
assert!(t.elapsed().as_secs_f32() < 2.0, "took {:?}", t.elapsed());
}