#![allow(clippy::pedantic, reason = "test tool")]
use std::collections::BTreeMap;
use geo_types::Coord;
use map_tile_toolkit::{Measured, Mosaic, SlicerAll, TileError, TileId, Vertex};
fn slice_all_runs<V: Vertex>(poly: &[V]) -> BTreeMap<TileId, Vec<Vec<V>>> {
let mut acc = SlicerAll::<V>::new(10, 0).expect("valid config");
acc.add_feature(poly).expect("slice");
acc.iter_tiles()
.map(|t| {
let runs = t
.iter_features()
.flat_map(|f| f.iter_polylines().map(<[_]>::to_vec))
.collect();
(t.tile_id(), runs)
})
.collect()
}
fn measured_line() -> Vec<Measured<u32>> {
vec![
Measured::new(5, 5, 10), Measured::new(5, 15, 20), Measured::new(5, 25, 30), ]
}
#[test]
fn slice_all_preserves_m_and_localizes_position() {
let tiles = slice_all_runs(&measured_line());
assert_eq!(
tiles[&TileId::new(0, 1)],
vec![vec![
Measured::new(5, -5, 10),
Measured::new(5, 5, 20),
Measured::new(5, 15, 30),
]]
);
}
#[test]
fn positions_match_the_coord_path() {
let plain = vec![
Coord { x: 5, y: 5 },
Coord { x: 5, y: 15 },
Coord { x: 5, y: 25 },
];
let m_positions: BTreeMap<TileId, Vec<Vec<Coord<i32>>>> = slice_all_runs(&measured_line())
.into_iter()
.map(|(t, runs)| {
let runs = runs
.iter()
.map(|r| r.iter().map(|v| v.position).collect())
.collect();
(t, runs)
})
.collect();
let coord_tiles = slice_all_runs(&plain);
assert_eq!(
m_positions, coord_tiles,
"M-vertex positions must match the Coord path"
);
}
#[test]
fn mosaic_reconstructs_with_m_values() {
let mut mosaic = Mosaic::new(10).expect("valid config");
for (tile, runs) in slice_all_runs(&measured_line()) {
mosaic
.add(tile, runs.as_slice())
.expect("self-consistent tiles never conflict");
}
let feats: Vec<Vec<Measured<u32>>> = mosaic.iter_features().collect();
assert_eq!(feats, vec![measured_line()]);
}
#[test]
fn mosaic_rejects_a_payload_mismatch() {
let mut mosaic = Mosaic::new(10).expect("valid config");
mosaic
.add(
TileId::new(0, 0),
&[vec![Measured::new(5, 5, 10), Measured::new(5, 15, 20)]],
)
.expect("first tile");
let bad = mosaic.add(
TileId::new(0, 1),
&[vec![Measured::new(5, -5, 10), Measured::new(5, 5, 999)]],
);
assert_eq!(bad, Err(TileError::Conflict(vec![TileId::new(0, 0)])));
assert_eq!(mosaic.len(), 1);
assert!(mosaic.contains(TileId::new(0, 0)));
}