From e71fd38b46bb64deb128a3e93aeea4224a7df74d Mon Sep 17 00:00:00 2001 From: Valmo Trindade <70849974+valmojr@users.noreply.github.com> Date: Fri, 7 Aug 2026 14:28:10 -0300 Subject: [PATCH] Add unit coverage for shape drawing CoT payloads --- src/cot/draws/shape.rs | 58 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/cot/draws/shape.rs b/src/cot/draws/shape.rs index b0bb37c..bd212e5 100644 --- a/src/cot/draws/shape.rs +++ b/src/cot/draws/shape.rs @@ -315,3 +315,61 @@ fn escape_attr(value: &str) -> String { .replace('<', "<") .replace('>', ">") } + +#[cfg(test)] +mod tests { + use super::{parse_points, DrawEllipsePayload, DrawLinksPayload}; + use arma_rs::FromArma; + + const NOW: &str = "2026-08-07T17:00:00.000Z"; + const STALE: &str = "2026-08-07T18:00:00.000Z"; + + #[test] + fn parses_and_serializes_ellipse_shape_with_milsym() { + let payload = DrawEllipsePayload::from_arma( + r#"["ellipse<&","u-d-c-e",-30.1,-51.2,10,100,50,25,"Ellipse<&",600,-1,-1761607681,3,"SFGPUCI----K<&"]"# + .to_string(), + ) + .expect("ellipse payload should parse"); + + assert_eq!(payload.uuid, "ellipse<&"); + assert_eq!(payload.stale_seconds, 600); + assert_eq!(payload.major, 100.0); + assert_eq!(payload.minor, 50.0); + + let xml = payload.to_xml(NOW, STALE); + assert!(xml.contains("uid=\"ellipse<&\" type=\"u-d-c-e\"")); + assert!(xml.contains("")); + assert!(xml.contains("ffffffff")); + assert!(xml.contains("96ffffff")); + assert!(xml.contains("")); + assert!(xml.contains("<__milsym id=\"SFGPUCI----K<&\" />")); + } + + #[test] + fn parses_and_serializes_closed_link_shape_without_milsym() { + let payload = DrawLinksPayload::from_arma( + r#"["shape<&","u-d-f",1,2,3,"1,2,3;4,5,6","Polygon<&",300,-16777216,16777215,2,"dashed<&",true,""]"# + .to_string(), + ) + .expect("link shape payload should parse"); + + assert!(payload.closed); + assert_eq!(payload.stroke_style, "dashed<&"); + + let xml = payload.to_xml(NOW, STALE); + assert!(xml.contains("uid=\"shape<&\" type=\"u-d-f\"")); + assert_eq!(xml.matches("").count(), 2); + assert_eq!(xml.matches("").count(), 1); + assert!(xml.contains("")); + assert!(!xml.contains("<__milsym")); + } + + #[test] + fn point_parser_drops_invalid_shape_points() { + let points = parse_points("1,2,3;missing;bad,2,3;4,bad,6;7,8,bad;9,10,11"); + assert_eq!(points.len(), 2); + assert_eq!(points[0].lat, 1.0); + assert_eq!(points[1].lon, 10.0); + } +}