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>
65 lines
1.5 KiB
Rust
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());
|
|
}
|