#[cfg(test)]
mod tests {
use crate::reader::Wkb;
fn make_wkb_header(type_id: u32, is_little_endian: bool) -> Vec<u8> {
let mut header = vec![if is_little_endian { 0x01 } else { 0x00 }];
if is_little_endian {
header.extend_from_slice(&type_id.to_le_bytes());
} else {
header.extend_from_slice(&type_id.to_be_bytes());
}
header
}
#[test]
fn test_wkb_invalid_byte_order() {
let wkb_data = vec![0x02, 0x01, 0x00, 0x00, 0x00]; let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_buffer_too_short_for_header() {
let wkb_data = vec![0x01, 0x01, 0x00]; let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_point_xy_buffer_too_short_for_coords() {
let mut wkb_data = make_wkb_header(1, true); wkb_data.extend_from_slice(&[0u8; 8]); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_point_xyz_buffer_too_short_for_coords() {
let mut wkb_data = make_wkb_header(1001, true); wkb_data.extend_from_slice(&[0u8; 16]); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_linestring_buffer_too_short_for_num_points() {
let wkb_data = make_wkb_header(2, true); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_linestring_num_points_too_large_for_buffer() {
let mut wkb_data = make_wkb_header(2, true); wkb_data.extend_from_slice(&10u32.to_le_bytes()); wkb_data.extend_from_slice(&1.0f64.to_le_bytes()); wkb_data.extend_from_slice(&2.0f64.to_le_bytes());
let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_linestring_invalid_num_points_value() {
let mut wkb_data = make_wkb_header(2, true); wkb_data.extend_from_slice(&u32::MAX.to_le_bytes());
let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_polygon_buffer_too_short_for_num_rings() {
let wkb_data = make_wkb_header(3, true); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_polygon_buffer_too_short_for_ring_num_points() {
let mut wkb_data = make_wkb_header(3, true); wkb_data.extend_from_slice(&1u32.to_le_bytes()); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_polygon_ring_num_points_too_large_for_buffer() {
let mut wkb_data = make_wkb_header(3, true); wkb_data.extend_from_slice(&1u32.to_le_bytes()); wkb_data.extend_from_slice(&4u32.to_le_bytes()); wkb_data.extend_from_slice(&0.0f64.to_le_bytes());
wkb_data.extend_from_slice(&0.0f64.to_le_bytes());
let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_multipoint_buffer_too_short_for_num_multipoints_header() {
let wkb_data = make_wkb_header(4, true); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_multipoint_buffer_too_short_for_contained_point_header() {
let mut wkb_data = make_wkb_header(4, true); wkb_data.extend_from_slice(&1u32.to_le_bytes()); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_multipoint_buffer_too_short_for_contained_point_coords() {
let mut wkb_data = make_wkb_header(4, true); wkb_data.extend_from_slice(&1u32.to_le_bytes()); wkb_data.extend(make_wkb_header(1, true)); wkb_data.extend_from_slice(&[0u8; 8]); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_multilinestring_buffer_too_short_for_num_multilinestrings_header() {
let wkb_data = make_wkb_header(5, true); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_multilinestring_buffer_too_short_for_contained_linestring_header() {
let mut wkb_data = make_wkb_header(5, true); wkb_data.extend_from_slice(&1u32.to_le_bytes()); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_multilinestring_buffer_too_short_for_contained_linestring_num_points() {
let mut wkb_data = make_wkb_header(5, true); wkb_data.extend_from_slice(&1u32.to_le_bytes()); wkb_data.extend(make_wkb_header(2, true)); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_multipolygon_buffer_too_short_for_num_multipolygons_header() {
let wkb_data = make_wkb_header(6, true); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_multipolygon_buffer_too_short_for_contained_polygon_header() {
let mut wkb_data = make_wkb_header(6, true); wkb_data.extend_from_slice(&1u32.to_le_bytes()); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_geomcollection_buffer_too_short_for_num_geometries_header() {
let wkb_data = make_wkb_header(7, true); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
#[test]
fn test_wkb_geomcollection_buffer_too_short_for_contained_geometry_header() {
let mut wkb_data = make_wkb_header(7, true); wkb_data.extend_from_slice(&1u32.to_le_bytes()); let result = Wkb::try_new(&wkb_data);
assert!(result.is_err());
}
}