summaryrefslogtreecommitdiff
path: root/tests/misc/date
blob: 1b94da45dab0bcfd8574f2dc8defe53d1c56d17f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#!/bin/sh

: ${PERL=perl}
: ${srcdir=.}

$PERL -e 1 > /dev/null 2>&1 || {
  echo 1>&2 "$0: configure didn't find a usable version of Perl," \
    "so can't run this test"
  exit 77
}

exec $PERL -w -I$srcdir/.. -MCoreutils -- - <<\EOF
require 5.003;
use strict;

(my $ME = $0) =~ s|.*/||;

# Turn off localisation of executable's ouput.
@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;

# Export TZ=UTC0 so that zone-dependent strings match.
$ENV{TZ} = 'UTC0';

my $t0 = '08:17:48';
my $d0 = '1997-01-19';
my $d1 = "$d0 $t0 +0";

my $ts = '08:17:49'; # next second
my $tm = '08:18:48'; # next minute
my $th = '09:17:48'; # next hour

my $dd = '1997-01-20'; # next day
my $dw = '1997-01-26'; # next week
my $dm = '1997-02-19'; # next month
my $dy = '1998-01-19'; # next month

my $fmt = "'+%Y-%m-%d %T'";

my @Tests =
    (
     # test-name, [option, option, ...] {OUT=>'expected-output'}
     #
     ['1', "-d '$d1' +'%% %a %A %b %B'", {OUT=>'% Sun Sunday Jan January'}],

     # [Actually, skip it on *all* systems. -- this Perl code is run at
     # distribution-build-time, not at configure/test time.  ]

     # Skip the test of %c on SunOS4 systems.  Such systems would fail this
     # test because their underlying strftime doesn't handle the %c format
     # properly.  GNU strftime must rely on the underlying host library
     # function to get locale-dependent behavior, as strftime is the only
     # portable interface to that behavior.
     # ['2', "-d '$d1' +'%c'", {OUT=>"Sun Jan 19 $t0 1997"}],

     ['3', "-d '$d1' +'%d_%D_%e_%h_%H'", {OUT=>'19_01/19/97_19_Jan_08'}],
     ['4', "-d '$d1' +'%I_%j_%k_%l_%m'", {OUT=>'08_019_ 8_ 8_01'}],
     ['5', "-d '$d1' +'%M_%n_%p_%r'", {OUT=>"17_\n_AM_$t0 AM"}],
     ['6', "-d '$d1' +'%s_%S_%t_%T'", {OUT=>"853661868_48_\t_$t0"}],
     ['7', "-d '$d1' +'%U_%V_%w_%W'", {OUT=>'03_03_0_02'}],
     ['8', "-d '$d1' +'%x_%X_%y_%Y'", {OUT=>"01/19/97_${t0}_97_1997"}],
     ['9', "-d '$d1' +'%z'", {OUT=>'+0000'}],

     ['leap-1', "--date '02/29/1996 1 year' +%Y-%m-%d", {OUT=>'1997-03-01'}],

     ['U95-1', "--date '1995-1-1' +%U", {OUT=>'01'}],
     ['U95-2', "--date '1995-1-7' +%U", {OUT=>'01'}],
     ['U95-3', "--date '1995-1-8' +%U", {OUT=>'02'}],

     ['U92-1', "--date '1992-1-1' +%U", {OUT=>'00'}],
     ['U92-2', "--date '1992-1-4' +%U", {OUT=>'00'}],
     ['U92-3', "--date '1992-1-5' +%U", {OUT=>'01'}],

     ['V92-1', "--date '1992-1-1' +%V", {OUT=>'01'}],
     ['V92-2', "--date '1992-1-5' +%V", {OUT=>'01'}],
     ['V92-3', "--date '1992-1-6' +%V", {OUT=>'02'}],

     ['W92-1', "--date '1992-1-1' +%W", {OUT=>'00'}],
     ['W92-2', "--date '1992-1-5' +%W", {OUT=>'00'}],
     ['W92-3', "--date '1992-1-6' +%W", {OUT=>'01'}],

     ['millen-1', "--date '1998-1-1 3 years' +%Y", {OUT=>'2001'}],

     ['rel-0', "-d '$d1 now' '+%Y-%m-%d %T'", {OUT=>"$d0 $t0"}],

     ['rel-1a', "-d '$d1 yesterday' $fmt", {OUT=>"1997-01-18 $t0"}],
     ['rel-1b', "-d '$d1 tomorrow' $fmt", {OUT=>"1997-01-20 $t0"}],

     ['rel-2a', "-d '$d1 6 years ago' $fmt", {OUT=>"1991-01-19 $t0"}],
     ['rel-2b', "-d '$d1 7 months ago' $fmt", {OUT=>"1996-06-19 $t0"}],
     ['rel-2c', "-d '$d1 8 weeks ago' $fmt", {OUT=>"1996-11-24 $t0"}],
     ['rel-2d', "-d '$d1 1 day ago' $fmt", {OUT=>"1997-01-18 $t0"}],
     ['rel-2e', "-d '$d1 2 hours ago' $fmt", {OUT=>"$d0 06:17:48"}],
     ['rel-2f', "-d '$d1 3 minutes ago' $fmt", {OUT=>"$d0 08:14:48"}],
     ['rel-2g', "-d '$d1 4 seconds ago' $fmt", {OUT=>"$d0 08:17:44"}],

     ['rel-3a', "-d '$d1 4 seconds ago' $fmt", {OUT=>"$d0 08:17:44"}],

     ['next-s', "-d '$d1 next second' '+%Y-%m-%d %T'", {OUT=>"$d0 $ts"}],
     ['next-m', "-d '$d1 next minute' '+%Y-%m-%d %T'", {OUT=>"$d0 $tm"}],
     ['next-h', "-d '$d1 next hour'   '+%Y-%m-%d %T'", {OUT=>"$d0 $th"}],
     ['next-d', "-d '$d1 next day'    '+%Y-%m-%d %T'", {OUT=>"$dd $t0"}],
     ['next-w', "-d '$d1 next week'   '+%Y-%m-%d %T'", {OUT=>"$dw $t0"}],
     ['next-mo', "-d '$d1 next month' '+%Y-%m-%d %T'", {OUT=>"$dm $t0"}],
     ['next-y', "-d '$d1 next year'   '+%Y-%m-%d %T'", {OUT=>"$dy $t0"}],

     ['utc-0', "-u -d '08/01/97 6:00' '+%D,%H:%M'", {OUT=>"08/01/97,06:00"},
	       {ENV => 'TZ=UTC+4'}],

     ['utc-0a', "-u -d '08/01/97 6:00 UTC +4 hours' '+%D,%H:%M'",
      {OUT=>"08/01/97,10:00"}],
     # Make sure --file=FILE works with -u.
     ['utc-1', "-u --file=f '+%Y-%m-%d %T'",
      {AUX=>{f=>"$d0 $t0\n$d0 $t0\n"}},
      {OUT=>"$d0 $t0\n$d0 $t0"},
      {ENV => 'TZ=UTC+1'}],

     ['utc-1a', "-u --file=f '+%Y-%m-%d %T'",
      {AUX=>{f=>"$d0 $t0 UTC +1 hour\n$d0 $t0 UTC +1 hour\n"}},
      {OUT=>"$d0 $th\n$d0 $th"}],

     # This would infloop (or appear to) prior to coreutils-4.5.5,
     # due to a bug in strftime.c.
     ['wide-fmt', "-d '1999-06-01'", '+%3004Y', {OUT=>'0' x 3000 . '1999'}],

     # Ensure that we can parse MONTHNAME-DAY-YEAR.
     ['moname-d-y', '--iso -d May-23-2003', {OUT=>'2003-05-23'}],

     ['epoch', '--iso=sec -d @31536000',
      {OUT=>'1971-01-01T00:00:00+0000'}],

     ['ns-10', '--iso=ns', '-d "1969-12-31 13:00:00.00000001-1100"',
      {OUT=>'1970-01-01T00:00:00,000000010+0000'}],

     ['ns-max32', '--iso=ns', '-d "2038-01-19 03:14:07.999999999"',
      {OUT=>'2038-01-19T03:14:07,999999999+0000'}],

     ['ns-relative',
      '--iso=ns', "-d'1970-01-01 00:00:00.1234567 UTC +961062237.987654321 sec'",
      {OUT=>'2000-06-15T09:43:58,111111021+0000'}],

     # Since coreutils/lib/getdate.y revision 1.96 (post-coreutils-5.3.0),
     # a command like the following would mistakenly exit nonzero with an
     # `invalid date ...' diagnostic, but when run in a time zone for
     # which daylight savings time is in effect for the starting date.
     # Unfortunately (for ease of testing), if you set TZ at all, this
     # failure is not triggered, hence the removal of TZ from the environment.
     ['cross-dst', "-d'2005-03-27 +1 day'", '+%Y', {OUT=>'2005'},
		  {ENV_DEL => 'TZ'},
		  ],

     ['empty-fmt', '+', {OUT=>''}],
    );

# Repeat the cross-dst test, using Jan 1, 2005 and every interval from 1..364.
foreach my $i (1..364)
  {
    push @Tests, ["cross-dst$i",
		  "-d'2005-01-01 +$i day'", '+%Y', {OUT=>'2005'},
		  {ENV_DEL => 'TZ'},
		  ];
  }

foreach my $t (@Tests)
  {
    # Append "\n" to each OUT=> RHS.
    foreach my $e (@$t)
      {
        !ref $e || ref $e ne 'HASH'
	  and next;
        defined $e->{OUT}
          and $e->{OUT} .= "\n";
      }
  }

my $save_temps = $ENV{DEBUG};
my $verbose = $ENV{VERBOSE};

my $prog = 'date';
my $fail = run_tests ($ME, $prog, \@Tests, $save_temps, $verbose);
exit $fail;
EOF