prange2 3.0.1

Parse numeric ranges for indexing
Documentation
use crate::*;

fn test(input: &str, expected: Result<&[u16], &str>) {
    let actual = parse(input)
        .map(|ranges| ranges.take(100).collect::<Vec<_>>())
        .map_err(|error| error.to_string());
    let actual = actual.as_deref().map_err(|x| x.as_str());
    assert_eq!(expected, actual);
}

#[test]
fn parse_empty() {
    test("", Ok(&[]));
}

#[test]
fn parse_one() {
    test("1", Ok(&[1]));
}

#[test]
fn parse_three() {
    test("1,5,13", Ok(&[1, 5, 13]));
}

#[test]
fn parse_one_range() {
    test("1-3", Ok(&[1, 2, 3]));
}

#[test]
fn parse_three_range() {
    test("1-3,4-6,8-9", Ok(&[1, 2, 3, 4, 5, 6, 8, 9]));
}

#[test]
fn parse_one_mixed() {
    test("1-3,5", Ok(&[1, 2, 3, 5]));
}

#[test]
fn parse_three_mixed() {
    test(
        "13,1-3,5,22-24,11-12,9",
        Ok(&[13, 1, 2, 3, 5, 22, 23, 24, 11, 12, 9]),
    );
}

#[test]
fn parse_intersection() {
    test("1-3,2-4", Ok(&[1, 2, 3, 2, 3, 4]));
}

#[test]
fn parse_open_left() {
    test("-3", Ok(&[1, 2, 3]));
}

#[test]
fn parse_open_right() {
    test("65533-", Ok(&[65533, 65534, 65535]));
}

#[test]
fn parse_reverse_range() {
    test("3-1", Ok(&[]));
}

#[test]
fn parse_err_illegal_char1() {
    test(
        "a",
        Err("Input contains an invalid character `a` at position 0"),
    );
}

#[test]
fn parse_err_illegal_char2() {
    test(
        "1-3,b",
        Err("Input contains an invalid character `b` at position 4"),
    );
}

#[test]
fn parse_err_integer() {
    test(
        "65536",
        Err("Input contains an invalid number `65536` at position 5"),
    );
}

#[test]
fn parse_err_empty_range1() {
    test(",", Err("Input contains an empty range at position 0"));
}

#[test]
fn parse_err_empty_range2() {
    test(",1", Err("Input contains an empty range at position 0"));
}

#[test]
fn parse_err_empty_range3() {
    test("1,", Err("Input contains an empty range at position 2"));
}

#[test]
fn parse_err_empty_range4() {
    test("1,,2", Err("Input contains an empty range at position 2"));
}

#[test]
fn parse_err_invalid_range1() {
    test("-", Err("Input contains an invalid range at position 1"));
}

#[test]
fn parse_err_invalid_range2() {
    test("1--2", Err("Input contains an invalid range at position 2"));
}

#[test]
fn parse_err_invalid_range3() {
    test("-1-2", Err("Input contains an invalid range at position 2"));
}

#[test]
fn parse_err_invalid_range4() {
    test("1-2-", Err("Input contains an invalid range at position 3"));
}