udled 0.8.0

Tokenizer and parser
Documentation
use udled::{Span, WithSpan};

#[test]
fn span_validity() {
    assert!(Span::new(0, 1).is_valid());
    assert!(Span::new(5, 10).is_valid());

    assert!(!Span::default().is_valid());
    assert!(!Span::new(0, 0).is_valid());
    assert!(!Span::new(10, 5).is_valid());
}

#[test]
fn span_len() {
    assert_eq!(Span::new(0, 5).len(), 5);
    assert_eq!(Span::new(2, 2).len(), 0);
    assert_eq!(Span::new(10, 5).len(), 0);
}

#[test]
fn span_range() {
    let span = Span::new(2, 7);
    let range: std::ops::Range<usize> = span.range();
    assert_eq!(range, 2..7);
}

#[test]
fn span_contains() {
    let outer = Span::new(0, 10);
    assert!(outer.contains(Span::new(2, 5)));
    assert!(outer.contains(Span::new(0, 10)));
    assert!(!outer.contains(Span::new(5, 11)));
    assert!(!outer.contains(Span::new(15, 20)));
}

#[test]
fn span_with_start_end() {
    assert_eq!(Span::new(0, 10).with_start(3), Span::new(3, 10));
    assert_eq!(Span::new(0, 10).with_end(7), Span::new(0, 7));
}

#[test]
fn span_add() {
    assert_eq!(Span::new(0, 5) + Span::new(3, 8), Span::new(0, 8));
    assert_eq!(Span::new(0, 5) + Span::new(10, 15), Span::new(0, 15));
    assert_eq!(Span::new(0, 0) + Span::new(2, 5), Span::new(2, 5));
    assert_eq!(Span::new(2, 5) + Span::new(0, 0), Span::new(2, 5));
}

#[test]
fn span_add_assign() {
    let mut span = Span::new(0, 5);
    span += Span::new(3, 10);
    assert_eq!(span, Span::new(0, 10));
}

#[test]
fn span_slice() {
    assert_eq!(Span::new(0, 3).slice("hello"), Some("hel"));
    assert_eq!(Span::new(1, 4).slice("hello"), Some("ell"));
    assert_eq!(Span::new(0, 10).slice("hi"), None);
    assert_eq!(Span::new(2, 1).slice("hello"), None);
}

#[test]
fn span_display() {
    assert_eq!(format!("{}", Span::new(1, 5)), "[1:5]");
}

#[test]
fn span_range_bounds() {
    use std::ops::RangeBounds;

    let span = Span::new(2, 5);
    assert_eq!(span.start_bound(), std::ops::Bound::Included(&2));
    assert_eq!(span.end_bound(), std::ops::Bound::Excluded(&5));
}

#[test]
fn withspan_impls() {
    let span = Span::new(2, 5);
    assert_eq!(span.span(), span);

    let opt_some: Option<Span> = Some(Span::new(1, 3));
    assert_eq!(opt_some.span(), Span::new(1, 3));

    let opt_none: Option<Span> = None;
    assert_eq!(opt_none.span(), Span::new(0, 0));

    let vec = vec![Span::new(0, 2), Span::new(4, 6)];
    assert_eq!(vec.span(), Span::new(0, 6));

    let empty: Vec<Span> = Vec::new();
    assert_eq!(empty.span(), Span::default());
}