//! Determinism and invariant sweeps over many seeds. use citygen::*; fn sweep(preset: SizePreset, seeds: std::ops::Range) { 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()); }