From 8dd88c7b6b9fc27f2fb92c56903336d42c796cf0 Mon Sep 17 00:00:00 2001 From: zubin <79480850+zubincarvalho@users.noreply.github.com> Date: Sun, 8 Nov 2026 23:51:35 -0800 Subject: [PATCH] Add tests for string offset arithmetic and StringRange --- crates/string-offset/src/lib_tests.rs | 75 ++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/crates/string-offset/src/lib_tests.rs b/crates/string-offset/src/lib_tests.rs index 7c0c63e1c44..9ee6a668c3b 100644 --- a/crates/string-offset/src/lib_tests.rs +++ b/crates/string-offset/src/lib_tests.rs @@ -1,4 +1,6 @@ -use crate::CharCounter; +use num_traits::SaturatingSub; + +use crate::{ByteOffset, CharCounter, CharOffset, StringRange}; #[test] fn test_char_counter_sequential() { @@ -49,3 +51,74 @@ fn test_char_counter_nonsequential() { // Skip ahead to the emoji. assert_eq!(counter.char_offset(9), Some(7.into())); } + +#[test] +fn test_offset_arithmetic() { + let mut offset = CharOffset::from(5); + assert_eq!(offset + CharOffset::from(3), CharOffset::from(8)); + assert_eq!(offset + 2, CharOffset::from(7)); + assert_eq!(offset - CharOffset::from(2), CharOffset::from(3)); + assert_eq!(offset - 5, CharOffset::zero()); + + offset += 4; + offset -= CharOffset::from(1); + assert_eq!(offset.as_usize(), 8); + assert_eq!(offset.to_string(), "8"); +} + +#[test] +fn test_offset_add_signed() { + assert_eq!(ByteOffset::from(10).add_signed(-4), ByteOffset::from(6)); + assert_eq!(ByteOffset::from(10).add_signed(4), ByteOffset::from(14)); + assert_eq!(ByteOffset::from(3).add_signed(-3), ByteOffset::zero()); +} + +#[test] +fn test_char_offset_add_assign_i32() { + let mut offset = CharOffset::from(5); + offset += 3; + assert_eq!(offset, CharOffset::from(8)); + offset += -2i32; + assert_eq!(offset, CharOffset::from(6)); +} + +#[test] +fn test_offset_saturating_sub() { + let small = ByteOffset::from(2); + let large = ByteOffset::from(7); + assert_eq!(large.saturating_sub(&small), ByteOffset::from(5)); + assert_eq!(small.saturating_sub(&large), ByteOffset::zero()); +} + +#[test] +fn test_offset_ranges() { + assert_eq!( + CharOffset::range(2..5), + CharOffset::from(2)..CharOffset::from(5) + ); + let empty = ByteOffset::from(4).empty_range(); + assert_eq!(empty, ByteOffset::from(4)..ByteOffset::from(4)); + assert!(empty.is_empty()); +} + +#[test] +fn test_extend_range_end() { + let mut range = StringRange { + char_range: 0..4, + byte_range: 0..6, + }; + range.extend_range_end(&StringRange { + char_range: 2..7, + byte_range: 3..10, + }); + assert_eq!(range.char_range, 0..7); + assert_eq!(range.byte_range, 0..10); + + // A range that ends earlier must not shrink the current one. + range.extend_range_end(&StringRange { + char_range: 1..3, + byte_range: 1..4, + }); + assert_eq!(range.char_range, 0..7); + assert_eq!(range.byte_range, 0..10); +}