use std::ops::{Bound, Range, RangeBounds};
use crate::model::{SegmentId, Sequence};
pub(crate) fn normalize_sequence<R: RangeBounds<Sequence>>(range: &R) -> Range<Sequence> {
let start = match range.start_bound() {
Bound::Included(&s) => s,
Bound::Excluded(&s) => s.saturating_add(1),
Bound::Unbounded => 0,
};
let end = match range.end_bound() {
Bound::Included(&e) => e.saturating_add(1),
Bound::Excluded(&e) => e,
Bound::Unbounded => Sequence::MAX,
};
start..end
}
pub(crate) fn normalize_segment_id<R: RangeBounds<SegmentId>>(range: &R) -> Range<SegmentId> {
let start = match range.start_bound() {
Bound::Included(&s) => s,
Bound::Excluded(&s) => s.saturating_add(1),
Bound::Unbounded => 0,
};
let end = match range.end_bound() {
Bound::Included(&e) => e.saturating_add(1),
Bound::Excluded(&e) => e,
Bound::Unbounded => SegmentId::MAX,
};
start..end
}
#[cfg(test)]
mod tests {
use super::*;
use std::ops::Bound;
#[test]
fn should_normalize_full_range() {
let range = normalize_sequence(&(..));
assert_eq!(range, 0..u64::MAX);
}
#[test]
fn should_normalize_range_from() {
let range = normalize_sequence(&(100u64..));
assert_eq!(range, 100..u64::MAX);
}
#[test]
fn should_normalize_range_to() {
let range = normalize_sequence(&(..100u64));
assert_eq!(range, 0..100);
}
#[test]
fn should_normalize_range() {
let range = normalize_sequence(&(50u64..150));
assert_eq!(range, 50..150);
}
#[test]
fn should_normalize_range_inclusive() {
let range = normalize_sequence(&(50u64..=150));
assert_eq!(range, 50..151);
}
#[test]
fn should_normalize_range_to_inclusive() {
let range = normalize_sequence(&(..=100u64));
assert_eq!(range, 0..101);
}
#[test]
fn should_handle_max_value_inclusive() {
let range = normalize_sequence(&(0..=u64::MAX));
assert_eq!(range, 0..u64::MAX);
}
#[test]
fn should_handle_excluded_start() {
let range = normalize_sequence(&(Bound::Excluded(10u64), Bound::Unbounded));
assert_eq!(range, 11..u64::MAX);
}
#[test]
fn should_normalize_segment_id_full_range() {
let range = normalize_segment_id(&(..));
assert_eq!(range, 0..u32::MAX);
}
#[test]
fn should_normalize_segment_id_range_from() {
let range = normalize_segment_id(&(10u32..));
assert_eq!(range, 10..u32::MAX);
}
#[test]
fn should_normalize_segment_id_range_to() {
let range = normalize_segment_id(&(..100u32));
assert_eq!(range, 0..100);
}
#[test]
fn should_normalize_segment_id_range() {
let range = normalize_segment_id(&(5u32..15));
assert_eq!(range, 5..15);
}
#[test]
fn should_normalize_segment_id_range_inclusive() {
let range = normalize_segment_id(&(5u32..=15));
assert_eq!(range, 5..16);
}
#[test]
fn should_normalize_segment_id_range_to_inclusive() {
let range = normalize_segment_id(&(..=10u32));
assert_eq!(range, 0..11);
}
#[test]
fn should_normalize_segment_id_handle_max_value_inclusive() {
let range = normalize_segment_id(&(0..=u32::MAX));
assert_eq!(range, 0..u32::MAX);
}
#[test]
fn should_normalize_segment_id_handle_excluded_start() {
let range = normalize_segment_id(&(Bound::Excluded(10u32), Bound::Unbounded));
assert_eq!(range, 11..u32::MAX);
}
}