diff --git a/src/cot/lrf.rs b/src/cot/lrf.rs index f791047..8d1521c 100644 --- a/src/cot/lrf.rs +++ b/src/cot/lrf.rs @@ -57,3 +57,48 @@ impl LaserRangeFinderClearPayload { fn normalize_degrees(degrees: f64) -> f64 { degrees.rem_euclid(360.0) } + +#[cfg(test)] +mod tests { + use super::{LaserRangeFinderClearPayload, LaserRangeFinderPayload}; + use arma_rs::FromArma; + use chrono::DateTime; + + #[test] + fn parses_lrf_payload_and_serializes_normalized_message() { + let payload = LaserRangeFinderPayload::from_arma( + r#"["laser-1",-5,-10,2.5]"#.to_string(), + ) + .expect("LRF payload should parse"); + + assert_eq!(payload.uid, "laser-1"); + assert_eq!(payload.distance_meters, -5.0); + assert_eq!(payload.azimuth_degrees, -10.0); + assert_eq!(payload.elevation_degrees, 2.5); + + let message = payload.to_lrf_message(); + let fields: Vec<_> = message.split(',').collect(); + assert_eq!(fields.len(), 6); + assert_eq!(fields[0], "1"); + assert_eq!(fields[1], "laser-1"); + assert!(DateTime::parse_from_rfc3339(fields[2]).is_ok()); + assert_eq!(fields[3], "0.00"); + assert_eq!(fields[4], "350.00"); + assert_eq!(fields[5], "2.50"); + } + + #[test] + fn parses_clear_payload_and_serializes_range_error() { + let payload = LaserRangeFinderClearPayload::from_arma(r#""laser-2""#.to_string()) + .expect("clear LRF payload should parse"); + assert_eq!(payload.uid, "laser-2"); + + let message = payload.to_lrf_message(); + let fields: Vec<_> = message.split(',').collect(); + assert_eq!(fields.len(), 4); + assert_eq!(fields[0], "1"); + assert_eq!(fields[1], "laser-2"); + assert!(DateTime::parse_from_rfc3339(fields[2]).is_ok()); + assert_eq!(fields[3], "RANGE_ERROR"); + } +}