From 0fc8e5241c6bad35b7ca66cece328dab137afeab Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Sat, 24 Oct 2026 07:52:11 +0200 Subject: [PATCH] Reject surveyor bearing angles outside 0-90 degrees (#2024) Found while testing crates/engine/src/units.rs:279-294 (bearing, via parse_dms 297-317) Co-authored-by: Claude Haiku 5.5 --- crates/engine/src/units.rs | 3 +++ crates/engine/tests/units_bearing.rs | 11 +++++++++++ 2 files changed, 14 insertions(+) create mode 100644 crates/engine/tests/units_bearing.rs diff --git a/crates/engine/src/units.rs b/crates/engine/src/units.rs index 236ec5af..ce0d55e7 100644 --- a/crates/engine/src/units.rs +++ b/crates/engine/src/units.rs @@ -302,6 +302,9 @@ fn bearing(t: &str) -> Option { None => (rest.strip_suffix('w')?, false), }; let a = parse_dms(ang_s.trim())?; + if !(0.0..=90.0).contains(&a) { + return None; + } let deg = match (north, east) { (true, true) => 90.0 - a, (true, false) => 90.0 + a, diff --git a/crates/engine/tests/units_bearing.rs b/crates/engine/tests/units_bearing.rs new file mode 100644 index 00000000..010a5a42 --- /dev/null +++ b/crates/engine/tests/units_bearing.rs @@ -0,0 +1,11 @@ +use cadcraft_engine::units::parse_angle; + +#[test] +fn bearing_rejects_out_of_range_angles() { + for s in ["n100e", "n-45e", "n91e", "s-1w", "n-0.5e"] { + assert_eq!(parse_angle(s), None, "{s}"); + } + for s in ["n0e", "n90e", "s45w"] { + assert!(parse_angle(s).is_some(), "{s}"); + } +}