use jismeshcode::prelude::*;
#[test]
fn test_invalid_latitude() {
assert!(Coordinate::new(91.0, 139.0).is_err());
assert!(Coordinate::new(-91.0, 139.0).is_err());
assert!(Coordinate::new(100.0, 139.0).is_err());
assert!(Coordinate::new(-100.0, 139.0).is_err());
}
#[test]
fn test_invalid_longitude() {
assert!(Coordinate::new(35.0, 181.0).is_err());
assert!(Coordinate::new(35.0, -181.0).is_err());
assert!(Coordinate::new(35.0, 200.0).is_err());
assert!(Coordinate::new(35.0, -200.0).is_err());
}
#[test]
fn test_out_of_japan_range() {
assert!(Coordinate::new(10.0, 139.0).is_err()); assert!(Coordinate::new(50.0, 139.0).is_err()); assert!(Coordinate::new(35.0, 100.0).is_err()); assert!(Coordinate::new(35.0, 160.0).is_err());
assert!(Coordinate::new(48.8566, 2.3522).is_err());
assert!(Coordinate::new(40.7128, -74.0060).is_err()); }
#[test]
fn test_japan_range_boundaries() {
assert!(Coordinate::new(20.0, 122.0).is_ok());
assert!(Coordinate::new(46.0, 154.0).is_ok());
assert!(Coordinate::new(19.9, 122.0).is_err());
assert!(Coordinate::new(46.1, 154.0).is_err());
}
#[test]
fn test_empty_mesh_code() {
assert!(MeshCode::from_str("").is_err());
}
#[test]
fn test_invalid_mesh_code_length() {
assert!(MeshCode::from_str("1").is_err());
assert!(MeshCode::from_str("12").is_err());
assert!(MeshCode::from_str("123").is_err());
assert!(MeshCode::from_str("12345").is_err()); assert!(MeshCode::from_str("1234567").is_err()); }
#[test]
fn test_non_numeric_mesh_code() {
assert!(MeshCode::from_str("abcd").is_err());
assert!(MeshCode::from_str("53a9").is_err());
assert!(MeshCode::from_str("5339-46").is_err());
assert!(MeshCode::from_str("5339 46").is_err());
assert!(MeshCode::from_str("5339.46").is_err());
}
#[test]
fn test_invalid_digit_values() {
assert!(MeshCode::from_str("533988").is_ok()); assert!(MeshCode::from_str("533999").is_ok()); }
#[test]
fn test_mesh_code_with_leading_zeros() {
assert!(MeshCode::from_str("0001").is_ok());
assert!(MeshCode::from_str("0012").is_ok());
assert!(MeshCode::from_str("00123456").is_ok());
}
#[test]
fn test_invalid_level_conversion() {
let first = MeshCode::from_str("5339").unwrap();
assert!(to_level(first, MeshLevel::Second).is_err());
assert!(to_level(first, MeshLevel::Third).is_err());
let second = MeshCode::from_str("533946").unwrap();
assert!(to_level(second, MeshLevel::Third).is_err());
}
#[test]
fn test_valid_level_conversion() {
let third = MeshCode::from_str("53394611").unwrap();
assert!(to_level(third, MeshLevel::Second).is_ok());
assert!(to_level(third, MeshLevel::First).is_ok());
assert!(to_level(third, MeshLevel::Third).is_ok()); }
#[test]
fn test_neighbor_at_boundaries() {
let north_mesh = MeshCode::from_str("6945").unwrap(); let north_neighbors = neighbors(north_mesh);
assert!(north_neighbors.len() <= 8);
let south_mesh = MeshCode::from_str("3028").unwrap(); let south_neighbors = neighbors(south_mesh);
assert!(south_neighbors.len() <= 8);
}
#[test]
fn test_neighbor_out_of_range() {
let coord = Coordinate::new(20.1, 122.1).unwrap(); let mesh = coord_to_mesh(coord, MeshLevel::Third).unwrap();
let _sw_neighbor = neighbor(mesh, Direction::SouthWest);
}
#[test]
fn test_empty_bounding_box() {
let coord = Coordinate::new(35.6812, 139.7671).unwrap();
let bbox = BoundingBox::new(coord, coord);
let meshes: Vec<_> = mesh_codes_in_bbox(bbox, MeshLevel::Third).collect();
assert!(meshes.len() > 0);
}
#[test]
fn test_inverted_bounding_box() {
let sw = Coordinate::new(35.7, 139.8).unwrap();
let ne = Coordinate::new(35.6, 139.7).unwrap();
let bbox = BoundingBox::new(sw, ne);
let _meshes: Vec<_> = mesh_codes_in_bbox(bbox, MeshLevel::Third).collect();
}
#[test]
fn test_floating_point_precision() {
let coord1 = Coordinate::new(35.681200, 139.767100).unwrap();
let coord2 = Coordinate::new(35.681201, 139.767101).unwrap();
let mesh1 = coord_to_mesh(coord1, MeshLevel::Third).unwrap();
let mesh2 = coord_to_mesh(coord2, MeshLevel::Third).unwrap();
assert_eq!(mesh1.as_string(), mesh2.as_string());
}
#[test]
fn test_coordinate_at_mesh_boundary() {
let mesh = MeshCode::from_str("53394611").unwrap();
let bounds = mesh_to_bounds(mesh);
let sw_coord = bounds.south_west();
let converted = coord_to_mesh(sw_coord, MeshLevel::Third).unwrap();
let converted_bounds = mesh_to_bounds(converted);
assert!(
converted_bounds.contains(sw_coord) || bounds.contains(sw_coord),
"Coordinate at boundary should be in one of the adjacent meshes"
);
}
#[test]
fn test_large_number_of_meshes() {
let sw = Coordinate::new(35.0, 139.0).unwrap();
let ne = Coordinate::new(36.0, 140.0).unwrap();
let bbox = BoundingBox::new(sw, ne);
let count = mesh_codes_in_bbox(bbox, MeshLevel::Third).count();
assert!(
count > 5000,
"Expected more than 5000 meshes, got {}",
count
);
assert!(
count < 15000,
"Expected less than 15000 meshes, got {}",
count
);
}
#[test]
fn test_mesh_code_copy_trait() {
let mesh1 = MeshCode::from_str("5339").unwrap();
let mesh2 = mesh1; let mesh3 = mesh1;
assert_eq!(mesh1.as_string(), mesh2.as_string());
assert_eq!(mesh1.as_string(), mesh3.as_string());
}