this_algorithm/tests/algorithm.rs

110 lines
3.4 KiB
Rust
Raw Permalink Normal View History

2023-05-12 17:16:55 -04:00
use std::str::FromStr;
2023-02-24 00:31:32 -05:00
use common::test_events;
2023-02-22 21:55:40 -05:00
use s2::cellid::CellID;
2023-03-02 18:55:40 -05:00
use xpin::Error;
use xpin::{Address, CELLID_LEVEL};
2023-02-22 21:55:40 -05:00
#[macro_use]
mod common;
2023-02-28 11:53:39 -05:00
use common::approx_geodetic_difference_m;
use common::ALLOWED_DISTANCE_ERROR_M;
2023-02-24 00:31:32 -05:00
use common::CELLID_LEVEL_23_BITMASK;
use common::CELLID_LEVEL_23_END_BIT;
2023-02-22 21:55:40 -05:00
2023-02-28 09:13:35 -05:00
#[test]
fn test_invalid_lat_lon() {
// Latitudes/longitudes are wrapped, so this is okay
assert!(Address::from_lat_lon(1.0_f64, 400.0_f64).is_ok());
2023-02-28 09:13:35 -05:00
assert_eq!(
Address::from_lat_lon(f64::INFINITY, 400.0_f64),
Err(Error::NaNLatLng)
2023-02-28 09:13:35 -05:00
);
assert_eq!(
Address::from_lat_lon(1.0_f64, f64::NAN),
Err(Error::NaNLatLng)
2023-02-28 09:13:35 -05:00
);
}
2023-02-28 11:53:39 -05:00
#[test]
fn test_decoding_lat_lon() {
let mut max_error_m = f64::MIN;
let mut min_error_m = f64::MAX;
2023-02-28 11:53:39 -05:00
for (idx, entry) in test_events().iter().enumerate() {
eprintln!("Testing row {idx}");
let addr = Address::from_lat_lon(entry.lat, entry.lon).unwrap();
let addr_latlon = addr.as_lat_lon();
// The difference between the input lat/lon and the encoded-then-decoded lat/lon
// This distance is essentially the error
// If you pick a point on the map, this is how far off the encoded point actually represents
let difference_m = approx_geodetic_difference_m(addr_latlon, (entry.lat, entry.lon));
2023-02-28 11:53:39 -05:00
// Compute the max and min differences for fun
if difference_m > max_error_m {
eprintln!("Setting max to {difference_m}");
max_error_m = difference_m;
2023-02-28 11:53:39 -05:00
}
if difference_m < min_error_m {
min_error_m = difference_m;
}
eprintln!("Distance in meters: {:?}", difference_m);
2023-02-28 11:53:39 -05:00
// Ensure the distance is not more than the allowed distance
assert!(difference_m <= ALLOWED_DISTANCE_ERROR_M);
2023-02-28 11:53:39 -05:00
// assert_eq!((entry.lat, entry.lon), (latlon.0, latlon.1));
}
eprintln!("Got max: {max_error_m} and min: {min_error_m}");
2023-02-28 11:53:39 -05:00
}
2023-02-22 21:55:40 -05:00
#[test]
fn test_cellid_translation() {
2023-02-24 00:31:32 -05:00
for (idx, entry) in test_events().iter().enumerate() {
2023-02-28 11:53:39 -05:00
eprintln!("Testing row {idx}");
2023-02-24 00:31:32 -05:00
let addr = Address::from_lat_lon(entry.lat, entry.lon).unwrap();
2023-02-28 09:20:06 -05:00
let addr_cellid = addr.as_cellid();
2023-02-22 21:55:40 -05:00
2023-02-24 00:31:32 -05:00
eprintln!(
"Entry: ({},{}) => {:0>64b}",
2023-02-28 09:20:30 -05:00
entry.lat, entry.lon, entry.cellid
2023-02-24 00:31:32 -05:00
);
eprintln!("\taddr: {addr}");
// Make sure the rust s2 implementation is accurate
2023-02-28 09:20:30 -05:00
assert_eq!(entry.cellid, CellID(entry.cellid).0);
2023-02-24 00:31:32 -05:00
assert_eq!(
2023-02-28 09:20:30 -05:00
(entry.cellid & CELLID_LEVEL_23_BITMASK) | CELLID_LEVEL_23_END_BIT,
CellID(entry.cellid).parent(CELLID_LEVEL).0
2023-02-24 00:31:32 -05:00
);
2023-02-22 21:55:40 -05:00
// Make sure the address is at the right level
2023-02-25 11:14:15 -05:00
assert_eq!(addr_cellid.level(), CELLID_LEVEL);
2023-02-22 21:55:40 -05:00
// Next, check if creating an address from a cellid matches itself
2023-02-28 09:20:30 -05:00
assert_eq!(addr, Address::from_cellid_u64(entry.cellid));
2023-03-11 14:56:51 -05:00
assert_eq!(
addr_cellid,
Address::from_cellid_u64(entry.cellid).as_cellid()
);
2023-02-22 21:55:40 -05:00
// Now check if the actual cell id matches
2023-02-28 09:20:30 -05:00
assert_eq_u64!(addr_cellid.0, CellID(entry.cellid).parent(CELLID_LEVEL).0);
2023-02-22 21:55:40 -05:00
}
}
#[test]
2023-02-24 00:31:32 -05:00
fn test_encoding() {
for (_idx, entry) in test_events().iter().enumerate() {
let addr = Address::from_lat_lon(entry.lat, entry.lon).unwrap();
2023-02-25 11:14:15 -05:00
eprintln!("({}, {}) => {addr}", entry.lat, entry.lon);
2023-02-24 00:31:32 -05:00
}
2023-02-28 09:13:35 -05:00
// TODO:
// assert!(false);
2023-02-24 00:31:32 -05:00
}
2023-02-22 21:55:40 -05:00
#[test]
fn test_decoding() {}