bacnet-cli 0.14.0

BACnet command-line tool for device discovery, reading, and writing
use super::*;

#[test]
fn reference_times_take_minutes_seconds_and_hundredths() {
    let (date, time) = parse_reference_time("2026-10-05T09:30").unwrap();
    assert_eq!(
        date,
        Date {
            year: 126,
            month: 10,
            day: 5,
            day_of_week: 1,
        }
    );
    assert_eq!(
        time,
        Time {
            hour: 9,
            minute: 30,
            second: 0,
            hundredths: 0,
        }
    );
    let (_, time) = parse_reference_time("2026-10-05 09:30:15.25").unwrap();
    assert_eq!((time.second, time.hundredths), (15, 25));
    for bad in [
        "2026-10-05",
        "2026-02-30T09:00",
        "2026-10-05T24:00",
        "2026-10-05T09:00:00.5",
        "2026/10/05T09:00",
        "1899-12-31T23:59",
    ] {
        assert!(parse_reference_time(bad).is_err(), "{bad}");
    }
}

#[test]
fn a_start_picks_the_range_and_count_defaults() {
    let by_position = RangeOptions {
        position: Some(3),
        ..RangeOptions::default()
    };
    assert_eq!(
        by_position.spec().unwrap(),
        Some(RangeSpec::ByPosition {
            reference_index: 3,
            count: 100
        })
    );
    let backward = RangeOptions {
        sequence: Some(40),
        count: Some(-5),
        ..RangeOptions::default()
    };
    assert_eq!(
        backward.spec().unwrap(),
        Some(RangeSpec::BySequenceNumber {
            reference_seq: 40,
            count: -5
        })
    );
    assert_eq!(RangeOptions::default().spec().unwrap(), None);
    let count_alone = RangeOptions {
        count: Some(5),
        ..RangeOptions::default()
    };
    assert!(count_alone.spec().is_err());
    let zero = RangeOptions {
        position: Some(1),
        count: Some(0),
        ..RangeOptions::default()
    };
    assert!(zero.spec().is_err());
}

#[test]
fn all_pages_forward_from_the_start_given() {
    let all = RangeOptions {
        all: true,
        ..RangeOptions::default()
    };
    assert_eq!(all.pages().unwrap(), (LogCursor::Oldest, 100));
    let from = RangeOptions {
        all: true,
        sequence: Some(9),
        count: Some(25),
        ..RangeOptions::default()
    };
    assert_eq!(from.pages().unwrap(), (LogCursor::Sequence(9), 25));
    let backward = RangeOptions {
        all: true,
        count: Some(-25),
        ..RangeOptions::default()
    };
    assert!(backward.pages().is_err());
}