From bb8c5657e11f737406ce03d1a8bcd15b9c153e98 Mon Sep 17 00:00:00 2001 From: John Cavanaugh <59479+cavanaug@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:36:58 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20allow=20three-part=20rang?= =?UTF-8?q?e=20parsing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(src/line_range.rs): 🐛 support three-part (start:end:context) syntax, clamp lower at zero and extend upper, and add tests for invalid formats --- src/line_range.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/line_range.rs b/src/line_range.rs index f37c855b..3d15c607 100644 --- a/src/line_range.rs +++ b/src/line_range.rs @@ -235,14 +235,17 @@ fn test_parse_single() { #[test] fn test_parse_fail() { - let range = LineRange::from("40:50:80"); - assert!(range.is_err()); - let range = LineRange::from("40::80"); + // Test 4+ colon parts should still fail + let range = LineRange::from("40:50:80:90"); assert!(range.is_err()); + // Test invalid formats that should still fail let range = LineRange::from("-2:5"); assert!(range.is_err()); let range = LineRange::from(":40:"); assert!(range.is_err()); + // Test completely malformed input + let range = LineRange::from("abc:def"); + assert!(range.is_err()); } #[test] @@ -311,6 +314,11 @@ fn test_parse_context_range() { let range = LineRange::from("30:40:2").expect("Shouldn't fail on test!"); assert_eq!(RangeBound::Absolute(28), range.lower); assert_eq!(RangeBound::Absolute(42), range.upper); + + // Test the case that used to fail but should now work + let range = LineRange::from("40:50:80").expect("Shouldn't fail on test!"); + assert_eq!(RangeBound::Absolute(0), range.lower); // 40 - 80 = 0 (saturated) + assert_eq!(RangeBound::Absolute(130), range.upper); // 50 + 80 = 130 } #[test]