hifitime 4.3.1

Ultra-precise date and time handling in Rust for scientific applications with leap second support
Documentation
use hifitime::efmt::consts::*;
use hifitime::prelude::*;

#[test]
fn epoch_parse_with_format() {
    use core::str::FromStr;
    let e = Epoch::from_gregorian_utc_hms(2015, 2, 7, 11, 22, 33);

    assert_eq!(
        ISO8601_DATE.parse("2015-02-07").unwrap(),
        Epoch::from_gregorian_utc_at_midnight(2015, 2, 7)
    );

    assert_eq!(ISO8601.parse("2015-02-07T11:22:33.0 UTC").unwrap(), e);
    assert_eq!(ISO8601_FLEX.parse("2015-02-07T11:22:33.0 UTC").unwrap(), e);
    assert_eq!(ISO8601_FLEX.parse("2015-02-07T11:22:33").unwrap(), e);

    assert_eq!(ISO8601_STD.parse("2015-02-07T11:22:33.0").unwrap(), e);

    #[cfg(feature = "std")]
    {
        // Test an epoch that's much more precise than usual time keepers
        let e_prec = Epoch::from_gregorian_utc(2015, 2, 7, 11, 22, 33, 123456789);
        assert_eq!(e_prec.to_isoformat(), "2015-02-07T11:22:33.123456");
        assert_ne!(
            e_prec.to_isoformat(),
            Formatter::new(e_prec, ISO8601).to_string()
        );
    }

    assert_eq!(RFC3339.parse("2015-02-07T11:22:33.0 UTC").unwrap(), e);

    assert!(RFC3339.parse("2018-02-13T23:08:32Z").is_ok());

    assert!(RFC3339.parse("2018-02-13T23:08:32.123Z").is_ok());

    assert!(RFC3339.parse("2018-02-13T23:08:32.123456983Z").is_ok());

    assert_eq!(
        ISO8601_ORDINAL
            .parse(&format!("{}", Formatter::new(e, ISO8601_ORDINAL)))
            .unwrap(),
        Epoch::from_gregorian_utc_at_midnight(2015, 2, 7) // Ordinal removes the knowledge below days
    );

    // Confirmation that https://github.com/nyx-space/hifitime/issues/202 is a documentation problem and not a functionality problem.
    let fmtd = Formatter::new(e, Format::from_str("%H:%M").unwrap());
    assert_eq!(format!("{fmtd}"), format!("11:22"));
}

#[test]
fn epoch_format_rfc2822() {
    let epoch = Epoch::from_gregorian_utc_hms(2015, 2, 7, 11, 22, 33);

    assert_eq!(
        format!("{}", Formatter::new(epoch, RFC2822_LONG)),
        "Saturday, 07 February 2015 11:22:33"
    );

    assert_eq!(
        RFC2822
            .parse("Saturday, 07 February 2015 11:22:33")
            .unwrap(),
        epoch
    );

    // Note that the space is optional when parsing, that's because of how the parsing is done.
    assert_eq!(
        RFC2822.parse("Saturday,07 February 2015 11:22:33").unwrap(),
        epoch
    );

    assert_eq!(
        format!("{}", Formatter::new(epoch, RFC2822)),
        "Sat, 07 Feb 2015 11:22:33"
    );

    assert_eq!(RFC2822.parse("Sat,07 Feb 2015 11:22:33").unwrap(), epoch);
    assert_eq!(
        RFC2822_LONG.parse("Sat,07 Feb 2015 11:22:33").unwrap(),
        epoch
    );

    // Ensure that we check the weekday is valid.
    assert_eq!(
        RFC2822.parse("Fri, 07 Feb 2015 11:22:33"),
        Err(HifitimeError::Parse {
            source: hifitime::ParsingError::WeekdayMismatch {
                found: Weekday::Friday,
                expected: Weekday::Saturday
            },
            details: "weekday and day number do not match"
        })
    );

    // In RFC2822, only the seconds are displayed, so adding microseconds here won't change the output
    assert_eq!(
        format!("{}", Formatter::new(epoch + 2 * Unit::Microsecond, RFC2822)),
        "Sat, 07 Feb 2015 11:22:33"
    );

    // But removing microseconds will cause a rounding the other way.
    assert_eq!(
        format!("{}", Formatter::new(epoch - 2 * Unit::Microsecond, RFC2822)),
        "Sat, 07 Feb 2015 11:22:32"
    );

    assert_eq!(
        Epoch::from_format_str("Sat, 07 Feb 2015 11:22:33", "%a, %d %b %Y %H:%M:%S").unwrap(),
        epoch
    );

    assert_eq!(
        Epoch::from_str_with_format("Sat, 07 Feb 2015 11:22:33", RFC2822).unwrap(),
        epoch
    );

    assert_eq!(
        Epoch::from_format_str("Sat, 07 Feb 15 11:22:33", "%a, %d %b %y %H:%M:%S").unwrap(),
        epoch
    );
}

#[test]
fn regression_test_gh_244() {
    assert_eq!(
        Epoch::from_format_str("Y\u{c}ڰ%d\t\u{16}(\u{e}\u{f}\u{f}#\0d\u{f}AAAA918199\u{f}\u{f}4\u{1d}11-011-\0\0\0 \0\0\t\u{16}\t\u{16}(\u{e}MMMMMMMMMMMMMMMMMMMMMMM\u{f}\u{e}\u{c}\u{10}\u{f}\0\u{f}\u{f}\u{f}\0\u{1}\0\0 \0MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MMM%%%%Y\u{c}ڰd%z%Y\u{c}ڰd%z%%%Y\u{c}ڰd%z%Y\u{c}ڰ%d\t\u{16}(\u{e}\u{f}MMMMMMMMMMMMMMMMMMMMMMMM%%%%Y\u{c}ڰd%z%Y\u{c}ڰd%z%%%Y\u{c}ڰd%z%Y\u{c}ڰ%d\t\u{16}(\u{e}\u{f}\u{f}#\0d\u{f}AAAA918199\u{f}\u{f}4\u{1d}11-05j\t\u{16})\u{e}\u{f}\u{f}#\0d\u{f}AAAA9"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("HHHHHHHHHHH%A\n\nt%z%%AAHHHHHHHHHHHHd\0\0\0HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH/>HHHHHHHAڰ\nI\n%%A%", "%A\n\nt%z%%AA0000%z %AAڰ\nI\n%%A%%A\n\nt%z%%AA000000000%m%AAAAAA%z%A\n\nt%z%%AAHHHHHHHH\0\u{4}H.591)19u\u{f}\u{f}4\u{1d}11405j0%%%%%zڰd%z%%d\0\0"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB", "BBBBBBBBBBBBBBBBBBBBBBBBBBBBm%AAAAAc%z%A\n\nt%z%%AAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHAڰ\nI\n%%A%%A\n\nt%z%%AA000000000%m%AAAAAA%z%A\n\nt%z%%AAڰ\nI\n%%A%%A\n"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
}

#[test]
fn regression_test_gh_246() {
    assert_eq!(
        Epoch::from_format_str("J4JJJJJJ00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000I000000000000000000000000JJJJJ002344086123440861000000000000000000000000000000000JJJJJJJJJJJJJJJJJJJJJJ000000000000000000000000000000000000000000000JJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ0000000000JJJJJJJJJoJJJJJJJJJ0\u{5}\u{5}JJJJJJJJ0JJJJ0000000000000000000000000000000000000JJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ0000000000JJJJJJJJJoJJJJJJJJJ0\u{5}\u{5}JJJJJJJJ0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\u{10}JJJJJJlJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJd\0\0\0JJJJJJJJJJoJJJJJJJJJ9JJJJJJJJJJJ", "JJJJJJJJJ)JJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\u{5}2@0618JJ0JJJJJJ%S%J%JJJJJJJJJJNJJJJJJJJJJ0000000000JJJJJJJ7JJJJJ\nJ(JJ\0\0\0\u{5}\u{5}\u{5}\u{5}J4JJJJJJ0000200000000000000O000000000084311JJJJJJJJ0\0\0\0dJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\u{10}JJJJJJlJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJd\0\0\0JJJJJJJJJJoJJJJJJJJJ9JJJJJJJJJJJJJJJJJJJJ)JJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%JJJJJJJJJJJJJJ00000000000000000000000000000000000000000\u{15}00000000000000000000000000000000000000000JJJJJJJJ%JJJJJJJJ7JJJJJJJ(JJ\0\0\0\u{5}\u{5}\u{5}\u{5}J4JJJJJJ00002000000000000000000000000JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%J0000000000000000000000000000000000000000000JJJJJJJJ%JJJJJJJJ7JJJJJJJ(JJ\0\0\0\u{5}\u{5}\u{5}\u{5}J4JJJJJJ000000000000000000000000JJJJJJJJ"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("\u{1a}5%JJJJJJCJ0\0\0\0dTƻ%TJ+\0\0\0eT190333919002344086184311J7JJJJJJ0\0\0\u{10}dJJ%z%JJJJJJ_JJJ\u{5}JJJJJJJJJJJJJJJJJJ000000000000000000000000000000000000000000000JJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ0\u{5}\u{5}JJJJJJJJ0JJJJ00000\u{5}\u{5}JJJJJJJJ0JJJJ0000000000000000000000000000000000000JJ00JJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ0\u{10}00000000JJJJJJJJJo0\u{10}00000000JJJJJJJJJoJJJJJJJJJ000000000000000000000000000000000JJJJJJJJJJJJJJJJJJ", "JJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJIJJJJJJJJJJJJ>JJJJJ000\r000000JJJJJJJJJoJJJJJJJJJ0\u{5}\u{5}JJJJJJJJ0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\u{10}JJJJJJlJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJd\0\0\0JJJJJJJJJJoJJJJJJJJJ9JJJJJJJJJJJJJJJJJJJJ)JJJIJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\u{5}2@0618JJ0JJJJJJ%S%J%JJJJJJJJJJNJJ9JJJJJJJ0000000000JJJJJJJ7JJJJJJJJJJJJJJJJJJJJJJJJJ\u{5}2@0618JJ0JJJJJJ%S%J%JJJJJJJJJJNJJJJJJJJJJ0000000000JJJJJJJ7ƻ%TJ"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("20091@JJ0JJJJJJ%B%\u{5}00000000000000000000000:00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000JJJJJJJJ%JJJJJJJJ0000002018JJ0J00000000000000000000000000000000000000000000000000000000000000000000000000000000000JJJJJJJJ%JJJJJJJJ0000002018JJ0JJJJJJ%B%BAJJJ\u{1}\0JJ=JJJJJJB| minute%BAJJJ\u{1}\0JEJJJ%B%BAJJI\u{1}\0JJ=JJJJJJJJJJJJJ0000000000000000000JJJ0000002018JJ0J", "JJJJJ%B%BAJJJ\u{1}\0JJ=JJJJJJB| minute%BAJJJ\u{1}\0JEJJJ%B%BAJJI\u{1}\0JJ=JJJJJJJJJJJJJ000000000000000\u{1}\0JJ=JJJJJJJJJJJJJ0000000000000000000JJJ00JJJJJ%B%BAJJJ\u{1}\0JJ=JJJJJJB| minute%BAJJJ\u{1}\0JEJJJ%B%BAJJI\u{1}\0JJ=JJJJJJJJJJJJJ0000000000000000000JJJ0000002018JJ0JJJJJJ%B%BAJJJ\u{1}\0JJ=JJJJJJB| minute%BAJJJ\u{1}\0JEJJJ%B%BAJJI\u{1}\0JJ=JJJJJJJJJJJJJ000000000000000\u{1}\0JJ=JJJJJJJJJJJJJ0000000000000000000JJJ0000002018JJ0JJJJJJ%B%BAJJJ\u{1}\0JJ=JJJJJJBn minute%BAJJJ\u{1}\0JEJJJ%B%BAJJI\u{1}"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("\u{1e}\u{5}\u{5}3\u{5}0t\u{7f}m\u{10}\0\0\0\0\u{17}\u{5}\u{5}\u{5}200618JJ0JJJJ\u{5}0t\u{7f}m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\u{b}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\0\0\0\0%%%%%%%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjOjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjJ0JJJJ\u{5}0t\u{7f}m%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\u{b}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\0\0\0\0%%%%%%%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj~jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjOjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj", "jjjjjjjjjjjjjjjjjjjHjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj.0123JJ%A%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjijjjjjjjjjjjjjjjjjjjjjjjjjkjjjjjjjjjjjjjjjjjbjjjjjjjjjjj.0123JJ%A%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjijjjjjjjjjjjjjjjjjjjjjjjjjkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj.0123JJ%A%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj.0123JJ%A%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjHjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj.0123JJ%A%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjijjjjjjjjjjjjjjjjjjjjjjjjjkjjjjjjjjjjjjjjjjjbjjjjjjjjjjj.0123JJ%A%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjijjjjjjjjjjjjjjjjjjjjjjjjjkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj.0123JJ%A%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj.0123JJ%A%jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjk"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("Àt.036919002\u{13}44086123440861000000000000000000\0\u{10}0000000000000JJJJJJJJJJJJJJJJJJJJJJ000000000000000000000000000000000000000000000JJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ0000000000JJJJJJJJJoJJJJJJJJJ0\u{5}\u{5}JJJJJJJJ0JJJJ0000000000000000000000000000000000000JJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ0E\u{5}\0\0\0J0000000000JJJJJJJJJoJJJJJJJJJ0\u{5}\u{5}JJJJJJJJ0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\u{10}JJJJJJlJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJd\0\0\0JJJJJJJJJJoJJJJJJJJJ9JJJJJJJJJJJJJJJJJJJJ)JJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJ", "JJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\u{5}2@0618JJ0JJJJJJ%S%J%JJJJJJJJJJNJJJJJJJJJJ0000000000JJJJJJJJNJJJJJJJJJJ0000000000JJJJJJJ7JJJJJ\nJ(JJ\0\0\0\u{5}\u{5}\u{5}\u{5}J4JJJJJJ0000200000000000000O0000000minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJ7JJJJJ\nJ(JJ\0\0\0\u{5}\u{5}\u{5}\u{5}J4JJJJJJ0000200000000000000O0000000minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%%JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJd\0\0\0JJJJJJJJJJoJJJJJJJJJ9JJJJJJJJJJJJJJJJJJJJ)JJJJJJJJJJJJJJJJJJ%%%JJJJ-0000 02)9minJM%S%J%JJJ\u{1}\0JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%%%JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\u{5}2@0618JJ0JJJJJJ%S%J%JJJJJJJJJJNJJJJJJJJJJ0000000000JJJJJJJ7JJJJJ\nJ(JJ\0\0\0\u{5}\u{5}\u{5}\u{5}J4JJJJJJ0000200000000000000O0000000000"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("\u{1e}\u{5}\u{5}3\u{5}0t\u{7f}m\u{10}\0\0\0\0\u{17}\u{5}\u{5}\u{5}200618JJ0JJJJ\u{5}0t\u{7f}m\u{10}\0bbbbbbbb%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%<%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%m%m%J\"J\0\u{4}23Jm%m%J\"J\0%%%%%%%%%%%%%%%%%%%%%%%%%%%%", "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%m%m%J\"J\0\u{4}23Jm%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%m%m%J\"J\0\u{4}23Jm%m%J\"J\0\u{4}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%m%m%J\"J\0\u{4}23Jm%m%J\"J\0\u{4}bbbbbbbbbbbbbbbbbbbbbbbbbbbb%m%m%J\"J\0\u{4}23Jm%m%bJ"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("\u{1e}\u{5}\u{5}3\u{5}0t\u{7f}m\u{10}\0\0\0\0\u{17}\u{5}\u{5}\u{5}200618JJ0JJJJ\u{5}0t\u{7f}m\u{10}\0bbbbbbbb%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%<%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\u{b}%%", "%%%%AJJJJJJeA%JA%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%m%m%J\"J\0\u{4}23Jm%m%J\"J\0\u{4}bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%m%m%J\"J\0\u{4}23Jm%m%J\"J\0\u{4}bbbbbbbbbbbbbbbbbbbbbbbbbbbb%m%m%J\"J\0\u{4}23Jm%m%bJ"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("J4JJJJJJ000020000000000000000000000000\r000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000JJJJJJJJJJ16JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ00000000000000000000000000000000000\u{1c}0000000000000000000000000000000000000000000000000000000000000000000000000J0\0\00000000000\r000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000JJJJJJJJJJ16JJJJJJJJJJJJJJJJJJJJJJJJJJJJ", "JJJJJJJJJJJ00000000000000000000000000000000000\u{1c}0000000000000000000000000000000000000000000000000000000000000000000000000J0\0\0\0dMƻ%%MJ00000000000000000000000000000000000000000000000000000000000000000000000JJJJJJJJ%JJJJJJJJ7JJ00000000000000000JJJJJJJJJJJJJJJJJJJJJJJJJJJcJJJJJJJJKJJJJJJJJcJJJJKKJ\0\u{5}\u{5}\u{17}\0\u{1}\u{12}\u{5}\u{5}\u{1a}\u{5}+\u{5}N\u{5}\u{5}\u{5}j\0\0\0E\u{5}\u{5}\u{5}JJJJJ2J0\0\0\u{5}\u{5}\u{17}\0\u{1}\u{12}\u{5}\u{5}\u{1a}\u{5}\u{5}\u{5}\u{17}\0\u{1}\u{12}\u{5}\u{5}\u{1a}\u{5}+\u{5}N\u{5}\u{5}\u{5}j\0\0\0\u{5}\u{5}\u{5}\u{5}JJJJJCJ0\0\0\u{5}\u{5}\u{17}\0\u{1}\u{12}\u{5}\u{5}\u{1a}\u{5}+\u{5}N\u{5}\u{5}\u{5}j\0\u{1}\0\u{5}\u{5}\u{5}\u{5}\u{1a}5%JJJ\u{7f}dTƻ%TJ+\u{2}\0\0dTƻ%T\0\u{7f}dTƻ%TJ+\0d\0dTƻ%TJ+\u{5}N\u{5}\u{5}\u{5}j\0\u{1}\0\u{5}\u{5}\u{5}\u{5}\u{1a}5%JJJ\u{7f}dTƻ%TJ+\0\0\0dTƻ%T\0\u{7f}dTƻ%TJ+\0\0\0\u{4}\0ƻ%TJ0000000000000000000JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%JJJJJJ000000000JJJJJJJJ%JJJJJJJJ000#000JJJJJJJJ%JJJJJeJJ0\r00F02018JJ\0dMƻ%%MJ00000000000000000000000000000000000000000000000000000000000000000000000JJJJJJJJ%JJJJJJJJ7JJ00000000000000000JJJJJJJJJJJJJJJJJJJJJJJJJJJcJJJJJJJJKJJJJJJJJcJJJJKKJ\0\u{5}\u{5}\u{17}\0\u{1}\u{12}\u{5}\u{5}\u{1a}\u{5}+\u{5}N\u{5}\u{5}\u{5}j\0\0\0E\u{5}\u{5}\u{5}JJJJJ2J0\0\0\u{5}\u{5}\u{17}\0\u{1}\u{12}\u{5}\u{5}\u{1a}\u{5}\u{5}\u{5}\u{17}\0\u{1}\u{12}\u{5}\u{5}\u{1a}\u{5}+\u{5}N\u{5}\u{5}\u{5}j\0\0\0\u{5}\u{5}\u{5}\u{5}JJJJJCJ0\0\0\u{5}\u{5}\u{17}\0\u{1}\u{12}\u{5}\u{5}\u{1a}\u{5}+\u{5}N\u{5}\u{5}\u{5}j\0\u{1}\0\u{5}\u{5}\u{5}\u{5}\u{1a}5%JJJ\u{7f}dTƻ%TJ+\u{2}\0\0dTƻ%T\0\u{7f}dTƻ%TJ+\0d\0dTƻ%TJ+\u{5}N\u{5}\u{5}\u{5}j\0\u{1}\0\u{5}\u{5}\u{5}\u{5}\u{1a}5%JJJ\u{7f}dTƻ%TJ+\0\0\0dTƻ%T\0\u{7f}dTƻ%TJ+\0\0\0\u{4}\0ƻ%TJ0000000000000000000JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ%JJJJJJ000000000JJJJJJJJ%JJJJJJJJ000#000JJJJJJJJ%JJJJJeJJ0\r00F02018JJ0JJJ9JJ%B%BAJJJ\u{1}\0JJ=JJJJJJB| minute%6AJJJ\u{1}\0JEJJJ%b%BEJJJ%B%BAK000F02018JJ0JJJJJJ%B%BAJJJ"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("\0\u{8} 11-&.\u{f}\u{f}\0\u{f}\u{f}\u{f}\0\u{1}\u{3}\u{8} 11-&5j0\u{f}\u{f}\0\u{4}\u{1}\0\u{f}\u{f}\0\u{f}\u{f}\u{f}\0\u{1}\0\u{8} 11-&5j0\u{f}\u{f}\u{f}\0\u{1}\0\u{8} 11-&5j0%%f밀%f\r%\u{f}\0\u{f}\u{f}\u{f}\0\u{1}\u{3}\u{8} 11-&5j0\u{f}\u{f}\0\u{4}\u{1}\0\u{f}\u{f}\0\u{f}\u{f}\u{f}\0\u{1}\0\u{8} 11-&5j0\u{f}\u{f}\u{f}\0\u{1}\0\u{8} 11-&5j0%%f밀%f\r%", "Y\0%%f밀\u{8} 11-l5j0c%f밀5j0\u{f}\u{f}11-&5j0%%f밀%f\r%Y\0%%f밀\u{8} 11-Y\0%%f밀\u{8} 11-l5j0c%f밀5j0\u{f}\u{f}11-&5j0%%f밀%f\r%Y\0%%f밀\u{8} 11-l5j0c%f밀%f\r%Y\0%%f밀%f\r%"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA11:05j0%%\u{10}#\0d\u{f}\u{e}\u{c}\u{10}\u{f}\0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaaa@aaaaaaaaa%Jڰda@aaaaaaaaa%Jڰd%z%%d\0\0\u{f}\u{f}\u{f}#aaaaaaaaaaaaa@aaaaaaaaa%Jڰda@aaaaaaaaa%Jڰd%AAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAA$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaaaaa@aaaaaaaaa%Jڰda@aaaaaaaaa%Jڰd%z%%d\0\0\u{f}\u{f}\u{f}#aaaaaaaaaaaaa@aaaaaaaaa%Jڰda@aaaaaaaaa%Jڰd%z%%d\0\0\u{f}\u{f}\u{f}#aaaaaaaaaaaa@aaaaaaaaa%Jڰda@aaaaaaaaa%Jڰd%z%%d\0\0\u{f}\u{f}\u{f}#aaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\u{f}\n\u{f}4\u{1d}11-0\u{1b}j0%%%%%d%%d%Ha\u{f0030}$z\u{1d}%Y\0\0"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("aa%JMMMMMMMMMMMMMM000000000004222001Zaaaa@aaaaaaaaaaaa@aaaaaaaaa%a\01 aaaaaaaa@aaaaaaaaa%JMMMMMMMMMMMMMM000000000004222001Zaaaa@aaaaaaaaaaaa@aaaaaaaaa%aa%Jڰd%aanaaaaaaaa@aa\0\u{10}aaaaa%aa%Jڰd%zZaaaa@aaaaaaaaaaaa@aaaaaaa", "aa%aa%Jڰd%aanaaaaaaaa@aa\0\u{10}aaaaa%aa%Jڰd%z%%d\n\n\n\n\n\n\n\n\n\n\n\0\0\n\n\n*\n\n\n\n\n\na%Jڰd%aanaaaaaaaa@aa\0\u{10}aaaaa%aa%Jڰd%zZaaaa@aaaaaaaaaaaa@aaaaaaaaa%aa%Jڰd%aanaaaaaaaa@aa\0\u{10}aaaaa%aa%Jڰd%z%%d\n\n\n\n\n\n\n\n\n\n\n\0\0\n\n\n*\n\n\n\n\n\n\n\n\u{8}\n\n\nA\n\n\nI\n\n%,"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{17}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{13}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}\u{b}BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBHHHHHHHHHdHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\u{f}\u{f}\0\0\0\0 \0\00%%d밀%z\r%Y\0\0\0\t\u{4}>\u{f}1\u{1b}9\u{f}\u{f}4\u{1d}11-\0\0\0 \0\0\t\u{16}\t\u{16}(\u{e}\u{f}\u{f}#\0d\u{f}AAAA918199\u{f}\u{f}4\u{1d}11-05j0%%%%H%A05\u{7f}0%%%%H%AA-05j0%%%%H%A05j0%%HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH'HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\0d\u{f}\0\0H%A05\u{7f}0%%%%H%AA-05j0%%%%H%A05j0%%HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'HHHHHHHHHHHHHHHHHHHHHHHHHHHHH\0\t\u{4}>\u{f}\u{f}MMMM\0\0\u{2}\0"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
    assert_eq!(
        Epoch::from_format_str("MYڰN%z%dd#+.0000042222922222222222223222222222220422229222222222222232222222222222222$4J%%%J%%J%MM2>MMMM02222222%%J%MM2204J>MMMM0222204M.MM0000022022MMM232222222222222222$4J%%%J%%J%MM2>MMMM02222222%%J%MM2204J>MMMM0222204M.MM0000022022MMMMM.Mm$%J%MMMMM/>MMMM02$4J%%%J%%J%MM2>MMMM022222222$4J%%%J%%J%MMjS%%%%%d%%d%wa\u{f0030}\u{f}z\u{1d}%d%wa\u{f0030}\u{f}z\u{1d}%a\u{f0030}\u{f}z\u{1d}%d%wa\u{f0030}MMMM0222204M.MM0000022022MMM", "MM.Mm$%J%MMMMM/>MMMM02$4J%%%J%%J%MM2>MMMM022222222$4J%%%J%%J%MMjS%%%%%d%%d%wa\u{f0030}\u{f}z\u{1d}%d%wa\u{f0030}\u{f}z\u{1d}%a\u{f0030}\u{f}z\u{1d}%d%wa\u{f0030}MM.Mm$%J%MMMMM/>MMMM02$4J%%%J%%J%MM2>MMMM022222222$4J%%%J%%J%MMjS%%%%%d%%d%wa\u{f0030}\u{f}z\u{1d}%d%wa\u{f0030}\u{f}z\u{1d}%a\u{f0030}\u{f}z\u{1d}%d%wa\u{f0030}MMMM0222204M.MM0000022022MMMMM.Mm$%J%MMMMM/>MMMM02$4J%%%J%%J%MM2>MMMM022222222$4J%%%J%%J%M\u{7f}\0\0\u{8}\u{7f}-%%d%%d%wa\u{f0030}\u{f}z\u{1d}%d%wa\u{f0030}\u{f};\u{1d}%a\u{f0030}\u{f}z\u{1d}%d%wa\u{f0030}\u{f}z\u{1d}%Y\0\u{16}\t\u{16}(\t"),
        Err(HifitimeError::Parse {
            source: ParsingError::UnknownFormat,
            details: "when using format string"
        })
    );
}

// Regression tests for the two efmt weekday-token panics reachable from the safe
// public API in released 4.3.0:
//   * `%w` (WeekdayDecimal) parsing hit `todo!()` in Format::parse.
//   * weekday-only `%A`/`%a` formatting hit `unreachable!()` in Formatter.
// 2026-07-26 (Sunday) .. 2026-08-01 (Saturday) give one epoch per C89 weekday
// value (Sunday=0 .. Saturday=6).

#[test]
fn weekday_only_format_does_not_panic() {
    use core::str::FromStr;
    let e = Epoch::from_gregorian_utc_at_midnight(2026, 7, 29); // Wednesday

    // `%A`/`%a` alone previously reached `unreachable!()`.
    assert_eq!(
        Formatter::new(e, Format::from_str("%A").unwrap()).to_string(),
        "Wednesday"
    );
    assert_eq!(
        Formatter::new(e, Format::from_str("%a").unwrap()).to_string(),
        "Wed"
    );
    // `%w` alone already formatted; keep it as a control.
    assert_eq!(
        Formatter::new(e, Format::from_str("%w").unwrap()).to_string(),
        "3"
    );
}

#[test]
fn weekday_decimal_parse_roundtrips() {
    // `%w` parsing previously reached `todo!()`.
    let wednesday = Epoch::from_gregorian_utc_at_midnight(2026, 7, 29);
    assert_eq!(
        Epoch::from_format_str("3 2026-07-29", "%w %Y-%m-%d").unwrap(),
        wednesday
    );

    // Self-consistency: the formatter emits the `%w` value the parser reads back.
    use core::str::FromStr;
    let fmt = "%w %Y-%m-%d";
    let formatted = Formatter::new(wednesday, Format::from_str(fmt).unwrap()).to_string();
    assert_eq!(formatted, "3 2026-07-29");
    assert_eq!(Epoch::from_format_str(&formatted, fmt).unwrap(), wednesday);
}

#[test]
fn weekday_decimal_maps_every_c89_value() {
    // Exhaustive inverse of Weekday::to_c89_weekday over a full week.
    let week = [
        (26, 0, Weekday::Sunday),
        (27, 1, Weekday::Monday),
        (28, 2, Weekday::Tuesday),
        (29, 3, Weekday::Wednesday),
        (30, 4, Weekday::Thursday),
        (31, 5, Weekday::Friday),
    ];
    for (day, c89, wd) in week {
        let s = format!("{c89} 2026-07-{day:02}");
        let e = Epoch::from_format_str(&s, "%w %Y-%m-%d").unwrap();
        assert_eq!(e.weekday(), wd, "%w={c89} should be {wd:?}");
        assert_eq!(e, Epoch::from_gregorian_utc_at_midnight(2026, 7, day));
    }
    // Saturday (%w == 6) rolls into August.
    let e = Epoch::from_format_str("6 2026-08-01", "%w %Y-%m-%d").unwrap();
    assert_eq!(e.weekday(), Weekday::Saturday);
}

#[test]
fn weekday_decimal_parse_validates_against_date() {
    // 2026-07-29 is a Wednesday (%w == 3). Supplying 5 (Friday) must be rejected
    // with WeekdayMismatch, exactly like the `%A`/`%a` name tokens already are.
    assert_eq!(
        Epoch::from_format_str("5 2026-07-29", "%w %Y-%m-%d"),
        Err(HifitimeError::Parse {
            source: ParsingError::WeekdayMismatch {
                found: Weekday::Friday,
                expected: Weekday::Wednesday,
            },
            details: "weekday and day number do not match",
        })
    );
}

#[test]
fn weekday_decimal_parse_rejects_out_of_range() {
    // The C89 weekday decimal is 0..=6; 7 must be a value error, not a silent wrap.
    let err = Epoch::from_format_str("7 2026-07-29", "%w %Y-%m-%d").unwrap_err();
    assert!(
        matches!(
            err,
            HifitimeError::Parse {
                source: ParsingError::ValueError,
                ..
            }
        ),
        "expected a ValueError, got {err:?}"
    );
}