@@ -120,15 +120,20 @@ mod tests {
120120 mod iso_8601 {
121121 use std:: env;
122122
123+ use chrono:: { TimeZone , Utc } ;
124+
123125 use crate :: ParseDateTimeError ;
124126 use crate :: { parse_datetime, tests:: TEST_TIME } ;
125127
126128 #[ test]
127129 fn test_t_sep ( ) {
128130 env:: set_var ( "TZ" , "UTC" ) ;
129131 let dt = "2021-02-15T06:37:47" ;
130- let actual = parse_datetime ( dt) ;
131- assert_eq ! ( actual. unwrap( ) . timestamp( ) , TEST_TIME ) ;
132+ let actual = parse_datetime ( dt) . unwrap ( ) ;
133+ assert_eq ! (
134+ actual,
135+ Utc . timestamp_opt( TEST_TIME , 0 ) . unwrap( ) . fixed_offset( )
136+ ) ;
132137 }
133138
134139 #[ test]
@@ -400,7 +405,6 @@ mod tests {
400405 #[ test]
401406 fn test_invalid_input ( ) {
402407 let result = parse_datetime ( "foobar" ) ;
403- println ! ( "{result:?}" ) ;
404408 assert_eq ! ( result, Err ( ParseDateTimeError :: InvalidInput ) ) ;
405409
406410 let result = parse_datetime ( "invalid 1" ) ;
@@ -618,13 +622,9 @@ mod tests {
618622 }
619623
620624 mod test_relative {
621- use chrono:: NaiveDate ;
622625
623- use crate :: { items, parse_datetime} ;
624- use std:: {
625- env,
626- io:: { self , Write } ,
627- } ;
626+ use crate :: parse_datetime;
627+ use std:: env;
628628
629629 #[ test]
630630 fn test_month ( ) {
@@ -677,45 +677,50 @@ mod tests {
677677 "2024-03-29T00:00:00+00:00" ,
678678 ) ;
679679 }
680+ }
681+
682+ mod test_gnu {
683+ use crate :: parse_datetime;
684+
680685 fn make_gnu_date ( input : & str , fmt : & str ) -> String {
681686 std:: process:: Command :: new ( "date" )
682687 . arg ( "-d" )
683688 . arg ( input)
684689 . arg ( format ! ( "+{fmt}" ) )
685690 . output ( )
686691 . map ( |mut output| {
687- io:: stdout ( ) . write_all ( & output. stdout ) . unwrap ( ) ;
692+ // io::stdout().write_all(&output.stdout).unwrap();
688693 output. stdout . pop ( ) ; // remove trailing \n
689694 String :: from_utf8 ( output. stdout ) . expect ( "from_utf8" )
690695 } )
691696 . unwrap ( )
692697 }
693698
694- #[ test]
695- fn chrono_date ( ) {
696- const FMT : & str = "%Y-%m-%d %H:%M:%S" ;
697- let year = 262144 ;
698- let input = format ! ( "{year}-01-01 00:00:00" ) ;
699-
700- assert ! ( NaiveDate :: from_ymd_opt( year, 1 , 1 ) . is_none( ) ) ;
701- assert ! ( chrono:: DateTime :: parse_from_str( & input, FMT ) . is_err( ) ) ;
702- // the parsing works, but hydration fails
703- assert ! ( items:: parse( & mut input. to_string( ) . as_str( ) ) . is_ok( ) ) ;
704- assert ! ( parse_datetime( & input) . is_err( ) ) ;
705- // GNU date works
706- assert_eq ! ( make_gnu_date( & input, FMT ) , input) ;
699+ fn has_gnu_date ( ) -> bool {
700+ std:: process:: Command :: new ( "date" )
701+ . arg ( "--version" )
702+ . output ( )
703+ . map ( |output| String :: from_utf8 ( output. stdout ) . unwrap ( ) )
704+ . map ( |output| output. starts_with ( "date (GNU coreutils)" ) )
705+ . unwrap_or ( false )
707706 }
708707
709708 #[ test]
710709 fn gnu_compat ( ) {
710+ // skip if GNU date is not present
711+ if !has_gnu_date ( ) {
712+ eprintln ! ( "GNU date not found, skipping gnu_compat tests" ) ;
713+ return ;
714+ }
715+
711716 const FMT : & str = "%Y-%m-%d %H:%M:%S" ;
712717 let input = "0000-03-02 00:00:00" ;
713718 assert_eq ! (
714719 make_gnu_date( input, FMT ) ,
715720 parse_datetime( input) . unwrap( ) . format( FMT ) . to_string( )
716721 ) ;
717722
718- let input = "262144 -03-10 00:00:00" ;
723+ let input = "2621 -03-10 00:00:00" ;
719724 assert_eq ! (
720725 make_gnu_date( input, FMT ) ,
721726 parse_datetime( input)
@@ -724,7 +729,7 @@ mod tests {
724729 . to_string( )
725730 ) ;
726731
727- let input = "10384 -03-10 00:00:00" ;
732+ let input = "1038 -03-10 00:00:00" ;
728733 assert_eq ! (
729734 make_gnu_date( input, FMT ) ,
730735 parse_datetime( input)
0 commit comments