#[cfg(test)]
mod tests {
use crate::reader::Wkb;
const Z_FLAG: u32 = 0x80000000;
const M_FLAG: u32 = 0x40000000;
const SRID_FLAG: u32 = 0x20000000;
fn make_ewkb_header(
type_id_base: u32,
has_z: bool,
has_m: bool,
has_srid: bool,
is_little_endian: bool,
) -> Vec<u8> {
let mut type_val = type_id_base;
if has_z {
type_val |= Z_FLAG;
}
if has_m {
type_val |= M_FLAG;
}
if has_srid {
type_val |= SRID_FLAG;
}
let mut header = vec![if is_little_endian { 0x01 } else { 0x00 }];
if is_little_endian {
header.extend_from_slice(&type_val.to_le_bytes());
} else {
header.extend_from_slice(&type_val.to_be_bytes());
}
header
}
fn srid_bytes(srid: u32, is_little_endian: bool) -> [u8; 4] {
if is_little_endian {
srid.to_le_bytes()
} else {
srid.to_be_bytes()
}
}
#[test]
fn test_ewkb_point_srid_flag_but_no_srid_data() {
let mut ewkb_data = make_ewkb_header(1, false, false, true, true); ewkb_data.extend_from_slice(&1.0f64.to_le_bytes()); ewkb_data.extend_from_slice(&2.0f64.to_le_bytes()); let result = Wkb::try_new(&ewkb_data);
assert!(result.is_err());
}
#[test]
fn test_ewkb_point_srid_flag_buffer_too_short_for_srid_value() {
let mut ewkb_data = make_ewkb_header(1, false, false, true, true); ewkb_data.extend_from_slice(&[0u8; 2]); let result = Wkb::try_new(&ewkb_data);
assert!(result.is_err());
}
#[test]
fn test_ewkb_point_with_srid_buffer_too_short_for_coords() {
let mut ewkb_data = make_ewkb_header(1, false, false, true, true); ewkb_data.extend_from_slice(&srid_bytes(4326, true)); ewkb_data.extend_from_slice(&[0u8; 8]); let result = Wkb::try_new(&ewkb_data);
assert!(result.is_err());
}
#[test]
fn test_ewkb_linestring_with_srid_buffer_too_short_for_num_points() {
let mut ewkb_data = make_ewkb_header(2, false, false, true, true); ewkb_data.extend_from_slice(&srid_bytes(4326, true)); let result = Wkb::try_new(&ewkb_data);
assert!(result.is_err());
}
#[test]
fn test_ewkb_linestring_with_srid_num_points_too_large_for_buffer() {
let mut ewkb_data = make_ewkb_header(2, false, false, true, true); ewkb_data.extend_from_slice(&srid_bytes(4326, true)); ewkb_data.extend_from_slice(&10u32.to_le_bytes()); ewkb_data.extend_from_slice(&1.0f64.to_le_bytes()); ewkb_data.extend_from_slice(&2.0f64.to_le_bytes());
let result = Wkb::try_new(&ewkb_data);
assert!(result.is_err());
}
#[test]
fn test_ewkb_polygon_with_srid_buffer_too_short_for_num_rings() {
let mut ewkb_data = make_ewkb_header(3, false, false, true, true); ewkb_data.extend_from_slice(&srid_bytes(4326, true)); let result = Wkb::try_new(&ewkb_data);
assert!(result.is_err());
}
#[test]
fn test_ewkb_multipoint_srid_flag_but_no_srid_data_for_outer_geom() {
let mut ewkb_data = make_ewkb_header(4, false, false, true, true); ewkb_data.extend_from_slice(&1u32.to_le_bytes()); let mut contained_point = make_ewkb_header(1, false, false, false, true); contained_point.extend_from_slice(&1.0f64.to_le_bytes());
contained_point.extend_from_slice(&2.0f64.to_le_bytes());
ewkb_data.extend(contained_point);
let result = Wkb::try_new(&ewkb_data);
assert!(result.is_err());
}
#[test]
fn test_ewkb_point_xyz_flag_but_xy_data() {
let mut ewkb_data = make_ewkb_header(1, true, false, false, true); ewkb_data.extend_from_slice(&1.0f64.to_le_bytes()); ewkb_data.extend_from_slice(&2.0f64.to_le_bytes()); let result = Wkb::try_new(&ewkb_data);
assert!(result.is_err());
}
#[test]
fn test_ewkb_linestring_xyzm_flag_but_xyz_data_for_points() {
let type_id_base = 2; let mut ewkb_data = make_ewkb_header(type_id_base, true, true, false, true); ewkb_data.extend_from_slice(&1u32.to_le_bytes()); ewkb_data.extend_from_slice(&1.0f64.to_le_bytes()); ewkb_data.extend_from_slice(&2.0f64.to_le_bytes()); ewkb_data.extend_from_slice(&3.0f64.to_le_bytes()); let result = Wkb::try_new(&ewkb_data);
assert!(result.is_err());
}
}