use crate::TextRange;
pub trait TextRangeExt {
fn as_byte_range(&self) -> std::ops::Range<usize>;
fn as_u32_range(&self) -> std::ops::Range<u32>;
fn intersects(&self, other: TextRange) -> bool;
}
impl TextRangeExt for TextRange {
#[inline]
fn as_byte_range(&self) -> std::ops::Range<usize> {
usize::from(self.start())..usize::from(self.end())
}
#[inline]
fn as_u32_range(&self) -> std::ops::Range<u32> {
u32::from(self.start())..u32::from(self.end())
}
#[inline]
fn intersects(&self, other: TextRange) -> bool {
self.start() <= other.end() && other.start() <= self.end()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::TextSize;
fn range(start: u32, end: u32) -> TextRange {
TextRange::new(TextSize::from(start), TextSize::from(end))
}
#[test]
fn as_byte_range_matches_manual_conversion() {
let r = range(3, 17);
assert_eq!(r.as_byte_range(), 3usize..17usize);
assert_eq!(
r.as_byte_range(),
usize::from(r.start())..usize::from(r.end())
);
}
#[test]
fn as_u32_range_matches_manual_conversion() {
let r = range(0, 42);
assert_eq!(r.as_u32_range(), 0u32..42u32);
}
#[test]
fn intersects_overlapping_ranges() {
assert!(range(0, 10).intersects(range(5, 15)));
assert!(range(5, 15).intersects(range(0, 10)));
}
#[test]
fn intersects_touching_endpoints_is_true() {
assert!(range(0, 10).intersects(range(10, 20)));
}
#[test]
fn intersects_disjoint_returns_false() {
assert!(!range(0, 5).intersects(range(6, 10)));
assert!(!range(6, 10).intersects(range(0, 5)));
}
#[test]
fn zero_width_caret_intersects_containing_range() {
assert!(range(10, 10).intersects(range(10, 15)));
assert!(!range(10, 10).intersects(range(5, 9)));
}
}