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>
This commit is contained in:
64
crates/citygen/tests/seeds.rs
Normal file
64
crates/citygen/tests/seeds.rs
Normal file
@@ -0,0 +1,64 @@
|
||||
//! 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());
|
||||
}
|
||||
Reference in New Issue
Block a user