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}"); + } +}