fix(@projects/@magic-civilization): 🐛 verify hydrology mutations survive round-trip save-load

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Natalie 2026-06-10 04:37:47 -07:00
parent 20de41a246
commit 2c145ce5a3

View file

@ -190,12 +190,30 @@ fn hydrology_resolve_mutations_round_trip_byte_equal() {
let bytes = save(&sf).expect("save after re-solve");
let loaded = load(&bytes).expect("load after re-solve");
let original_json = serde_json::to_string(&sf.grid).expect("ser original");
let loaded_json = serde_json::to_string(&loaded.grid).expect("ser loaded");
// Tiles are an ordered Vec - byte-equal compare covers the five mutated
// hydrology fields + river_edges on every tile.
let original_tiles = serde_json::to_string(&sf.grid.tiles).expect("ser original tiles");
let loaded_tiles = serde_json::to_string(&loaded.grid.tiles).expect("ser loaded tiles");
assert_eq!(
original_json, loaded_json,
"post-re-solve grid (mutated river_edges + lakes + riparian + \
edge_features) must survive save->load byte-equal"
original_tiles, loaded_tiles,
"post-re-solve tiles (mutated river_edges + lakes + riparian) must \
survive save->load byte-equal"
);
// edge_features is a HashMap (nondeterministic iteration order), so
// compare as sorted pair sets.
let sort_edges = |g: &GridState| {
let mut pairs: Vec<_> = g
.edge_features
.iter()
.map(|(k, v)| (format!("{k:?}"), *v))
.collect();
pairs.sort_by(|a, b| a.0.cmp(&b.0));
pairs
};
assert_eq!(
sort_edges(&sf.grid),
sort_edges(&loaded.grid),
"post-re-solve edge_features (river flags) must survive save->load"
);
// Spot-check the dam-attributable mutations specifically.
let (lc, lr, _) = delta.added_lake_cells[0];