Skip to content

Commit 8e6dd97

Browse files
committed
feat(tests): improve geometry tests with additional cases
1 parent 0807ac7 commit 8e6dd97

7 files changed

Lines changed: 829 additions & 115 deletions

File tree

versatiles_geometry/src/geo/types/linestring.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,4 +297,32 @@ mod tests {
297297
}
298298
assert_eq!(line.last().unwrap().x(), 9.0);
299299
}
300+
301+
#[test]
302+
fn test_contains_point_always_false() {
303+
let line = LineStringGeometry::from(vec![(0.0, 0.0), (10.0, 10.0)]);
304+
assert!(!line.contains_point(5.0, 5.0));
305+
assert!(!line.contains_point(0.0, 0.0));
306+
}
307+
308+
#[test]
309+
fn test_to_mercator() {
310+
let line = LineStringGeometry::from(vec![(13.4, 52.5), (13.5, 52.6)]);
311+
let m = line.to_mercator();
312+
assert_eq!(m.len(), 2);
313+
assert!(m.as_vec()[0].x() > 0.0);
314+
assert!(m.as_vec()[0].y() > 0.0);
315+
}
316+
317+
#[test]
318+
fn test_compute_bounds() {
319+
let line = LineStringGeometry::from(vec![(1.0, 2.0), (5.0, 8.0), (3.0, 4.0)]);
320+
let bounds = line.compute_bounds().unwrap();
321+
assert_eq!(bounds, [1.0, 2.0, 5.0, 8.0]);
322+
}
323+
324+
#[test]
325+
fn test_compute_bounds_empty() {
326+
assert!(LineStringGeometry::new().compute_bounds().is_none());
327+
}
300328
}

versatiles_geometry/src/geo/types/multi_linestring.rs

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,172 @@ impl Debug for MultiLineStringGeometry {
9696
}
9797

9898
crate::impl_from_array!(MultiLineStringGeometry, LineStringGeometry);
99+
100+
#[cfg(test)]
101+
#[allow(clippy::float_cmp)]
102+
mod tests {
103+
use super::*;
104+
105+
fn sample() -> MultiLineStringGeometry {
106+
MultiLineStringGeometry::from(vec![
107+
vec![(0.0, 0.0), (1.0, 1.0)],
108+
vec![(2.0, 3.0), (4.0, 5.0), (6.0, 7.0)],
109+
])
110+
}
111+
112+
// ── GeometryTrait ───────────────────────────────────────────────────
113+
114+
#[test]
115+
fn area_is_zero() {
116+
assert_eq!(sample().area(), 0.0);
117+
}
118+
119+
#[test]
120+
fn verify_valid() {
121+
assert!(sample().verify().is_ok());
122+
}
123+
124+
#[test]
125+
fn verify_empty_ok() {
126+
assert!(MultiLineStringGeometry::new().verify().is_ok());
127+
}
128+
129+
#[test]
130+
fn verify_invalid_inner() {
131+
// A line with only 1 point is invalid
132+
let mut ml = MultiLineStringGeometry::new();
133+
ml.push(LineStringGeometry::from(vec![(0.0, 0.0)]));
134+
assert!(ml.verify().is_err());
135+
}
136+
137+
#[test]
138+
fn to_coord_json() {
139+
let json = sample().to_coord_json(None);
140+
let arr = json.as_array().unwrap();
141+
assert_eq!(arr.len(), 2);
142+
}
143+
144+
#[test]
145+
fn contains_point_always_false() {
146+
assert!(!sample().contains_point(0.0, 0.0));
147+
assert!(!sample().contains_point(5.0, 5.0));
148+
}
149+
150+
#[test]
151+
fn to_mercator() {
152+
let ml = MultiLineStringGeometry::from(&[[(13.0, 52.0), (13.5, 52.5)]]);
153+
let m = ml.to_mercator();
154+
assert_eq!(m.as_vec().len(), 1);
155+
assert!(m.as_vec()[0].as_vec()[0].x() > 0.0);
156+
}
157+
158+
#[test]
159+
fn compute_bounds() {
160+
let bounds = sample().compute_bounds().unwrap();
161+
assert_eq!(bounds, [0.0, 0.0, 6.0, 7.0]);
162+
}
163+
164+
#[test]
165+
fn compute_bounds_empty() {
166+
assert!(MultiLineStringGeometry::new().compute_bounds().is_none());
167+
}
168+
169+
// ── CompositeGeometryTrait ──────────────────────────────────────────
170+
171+
#[test]
172+
fn composite_new_is_empty() {
173+
let ml = MultiLineStringGeometry::new();
174+
assert!(ml.is_empty());
175+
assert_eq!(ml.len(), 0);
176+
}
177+
178+
#[test]
179+
fn composite_push_and_len() {
180+
let mut ml = MultiLineStringGeometry::new();
181+
ml.push(LineStringGeometry::from(vec![(0.0, 0.0), (1.0, 1.0)]));
182+
assert_eq!(ml.len(), 1);
183+
assert!(!ml.is_empty());
184+
}
185+
186+
#[test]
187+
fn composite_first_last() {
188+
let ml = sample();
189+
assert_eq!(ml.first().unwrap().as_vec()[0].x(), 0.0);
190+
assert_eq!(ml.last().unwrap().as_vec()[0].x(), 2.0);
191+
}
192+
193+
#[test]
194+
fn composite_first_last_empty() {
195+
let ml = MultiLineStringGeometry::new();
196+
assert!(ml.first().is_none());
197+
assert!(ml.last().is_none());
198+
}
199+
200+
#[test]
201+
fn composite_pop() {
202+
let mut ml = sample();
203+
let popped = ml.pop().unwrap();
204+
assert_eq!(popped.len(), 3);
205+
assert_eq!(ml.len(), 1);
206+
}
207+
208+
#[test]
209+
fn composite_into_inner() {
210+
let inner = sample().into_inner();
211+
assert_eq!(inner.len(), 2);
212+
}
213+
214+
#[test]
215+
fn composite_into_iter() {
216+
let lines: Vec<_> = sample().into_iter().collect();
217+
assert_eq!(lines.len(), 2);
218+
}
219+
220+
#[test]
221+
fn composite_into_first_and_rest() {
222+
let (first, rest) = sample().into_first_and_rest().unwrap();
223+
assert_eq!(first.len(), 2);
224+
assert_eq!(rest.len(), 1);
225+
}
226+
227+
#[test]
228+
fn composite_into_first_and_rest_empty() {
229+
assert!(MultiLineStringGeometry::new().into_first_and_rest().is_none());
230+
}
231+
232+
// ── Debug / Clone / Eq ──────────────────────────────────────────────
233+
234+
#[test]
235+
fn debug_format() {
236+
let ml = MultiLineStringGeometry::from(&[[(1.0, 2.0), (3.0, 4.0)]]);
237+
assert!(format!("{ml:?}").contains("[1.0, 2.0]"));
238+
}
239+
240+
#[test]
241+
fn clone_and_eq() {
242+
let a = sample();
243+
assert_eq!(a.clone(), a);
244+
}
245+
246+
#[test]
247+
fn ne() {
248+
let a = MultiLineStringGeometry::from(&[[(0.0, 0.0), (1.0, 1.0)]]);
249+
let b = MultiLineStringGeometry::from(&[[(2.0, 2.0), (3.0, 3.0)]]);
250+
assert_ne!(a, b);
251+
}
252+
253+
// ── From conversions ────────────────────────────────────────────────
254+
255+
#[test]
256+
fn from_vec() {
257+
let ml = MultiLineStringGeometry::from(vec![vec![(0.0, 0.0), (1.0, 1.0)], vec![(2.0, 2.0), (3.0, 3.0)]]);
258+
assert_eq!(ml.len(), 2);
259+
}
260+
261+
#[test]
262+
fn from_slice() {
263+
let data = [[(0.0, 0.0), (1.0, 1.0)], [(2.0, 2.0), (3.0, 3.0)]];
264+
let ml = MultiLineStringGeometry::from(&data[..]);
265+
assert_eq!(ml.len(), 2);
266+
}
267+
}

versatiles_geometry/src/geo/types/multi_point.rs

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,178 @@ impl Debug for MultiPointGeometry {
9595
}
9696

9797
crate::impl_from_array!(MultiPointGeometry, PointGeometry);
98+
99+
#[cfg(test)]
100+
#[allow(clippy::float_cmp)]
101+
mod tests {
102+
use super::*;
103+
104+
fn sample() -> MultiPointGeometry {
105+
MultiPointGeometry::from(&[[1, 2], [3, 4], [5, 6]])
106+
}
107+
108+
// ── GeometryTrait ───────────────────────────────────────────────────
109+
110+
#[test]
111+
fn area_is_zero() {
112+
assert_eq!(sample().area(), 0.0);
113+
}
114+
115+
#[test]
116+
fn verify_ok() {
117+
assert!(sample().verify().is_ok());
118+
}
119+
120+
#[test]
121+
fn verify_empty_ok() {
122+
assert!(MultiPointGeometry::new().verify().is_ok());
123+
}
124+
125+
#[test]
126+
fn to_coord_json() {
127+
let json = sample().to_coord_json(None);
128+
let arr = json.as_array().unwrap();
129+
assert_eq!(arr.len(), 3);
130+
}
131+
132+
#[test]
133+
fn to_coord_json_with_precision() {
134+
let mp = MultiPointGeometry::from(vec![(1.23456, 2.34567)]);
135+
let json = mp.to_coord_json(Some(2));
136+
let arr = json.as_array().unwrap();
137+
assert_eq!(arr.len(), 1);
138+
}
139+
140+
#[test]
141+
fn contains_point_always_false() {
142+
assert!(!sample().contains_point(1.0, 2.0));
143+
assert!(!sample().contains_point(0.0, 0.0));
144+
}
145+
146+
#[test]
147+
fn to_mercator() {
148+
let mp = MultiPointGeometry::from(&[[13, 52], [-74, 40]]);
149+
let m = mp.to_mercator();
150+
assert_eq!(m.as_vec().len(), 2);
151+
assert!(m.as_vec()[0].x() > 0.0); // Berlin-ish
152+
assert!(m.as_vec()[1].x() < 0.0); // New York-ish
153+
}
154+
155+
#[test]
156+
fn compute_bounds() {
157+
let bounds = sample().compute_bounds().unwrap();
158+
assert_eq!(bounds, [1.0, 2.0, 5.0, 6.0]);
159+
}
160+
161+
#[test]
162+
fn compute_bounds_single_point() {
163+
let mp = MultiPointGeometry::from(&[[7, 8]]);
164+
let bounds = mp.compute_bounds().unwrap();
165+
assert_eq!(bounds, [7.0, 8.0, 7.0, 8.0]);
166+
}
167+
168+
#[test]
169+
fn compute_bounds_empty() {
170+
assert!(MultiPointGeometry::new().compute_bounds().is_none());
171+
}
172+
173+
// ── CompositeGeometryTrait ──────────────────────────────────────────
174+
175+
#[test]
176+
fn composite_new_is_empty() {
177+
let mp = MultiPointGeometry::new();
178+
assert!(mp.is_empty());
179+
assert_eq!(mp.len(), 0);
180+
}
181+
182+
#[test]
183+
fn composite_push_and_len() {
184+
let mut mp = MultiPointGeometry::new();
185+
mp.push(PointGeometry::from(&[1, 2]));
186+
mp.push(PointGeometry::from(&[3, 4]));
187+
assert_eq!(mp.len(), 2);
188+
assert!(!mp.is_empty());
189+
}
190+
191+
#[test]
192+
fn composite_first_last() {
193+
let mp = sample();
194+
assert_eq!(mp.first().unwrap().x(), 1.0);
195+
assert_eq!(mp.last().unwrap().x(), 5.0);
196+
}
197+
198+
#[test]
199+
fn composite_first_last_empty() {
200+
let mp = MultiPointGeometry::new();
201+
assert!(mp.first().is_none());
202+
assert!(mp.last().is_none());
203+
}
204+
205+
#[test]
206+
fn composite_pop() {
207+
let mut mp = sample();
208+
let popped = mp.pop().unwrap();
209+
assert_eq!(popped.x(), 5.0);
210+
assert_eq!(mp.len(), 2);
211+
}
212+
213+
#[test]
214+
fn composite_into_inner() {
215+
let inner = sample().into_inner();
216+
assert_eq!(inner.len(), 3);
217+
}
218+
219+
#[test]
220+
fn composite_into_iter() {
221+
let points: Vec<_> = sample().into_iter().collect();
222+
assert_eq!(points.len(), 3);
223+
}
224+
225+
#[test]
226+
fn composite_into_first_and_rest() {
227+
let (first, rest) = sample().into_first_and_rest().unwrap();
228+
assert_eq!(first.x(), 1.0);
229+
assert_eq!(rest.len(), 2);
230+
}
231+
232+
#[test]
233+
fn composite_into_first_and_rest_empty() {
234+
assert!(MultiPointGeometry::new().into_first_and_rest().is_none());
235+
}
236+
237+
// ── Debug / Clone / Eq ──────────────────────────────────────────────
238+
239+
#[test]
240+
fn debug_format() {
241+
let mp = MultiPointGeometry::from(&[[1, 2]]);
242+
assert!(format!("{mp:?}").contains("[1.0, 2.0]"));
243+
}
244+
245+
#[test]
246+
fn clone_and_eq() {
247+
let a = sample();
248+
assert_eq!(a.clone(), a);
249+
}
250+
251+
#[test]
252+
fn ne() {
253+
let a = MultiPointGeometry::from(&[[1, 2]]);
254+
let b = MultiPointGeometry::from(&[[3, 4]]);
255+
assert_ne!(a, b);
256+
}
257+
258+
// ── From conversions ────────────────────────────────────────────────
259+
260+
#[test]
261+
fn from_vec() {
262+
let mp = MultiPointGeometry::from(vec![(1.0, 2.0), (3.0, 4.0)]);
263+
assert_eq!(mp.len(), 2);
264+
}
265+
266+
#[test]
267+
fn from_slice() {
268+
let data = [(1.0, 2.0), (3.0, 4.0)];
269+
let mp = MultiPointGeometry::from(&data[..]);
270+
assert_eq!(mp.len(), 2);
271+
}
272+
}

0 commit comments

Comments
 (0)