Document and test Time::Piece.
[p5sagit/p5-mst-13.2.git] / t / lib / time-piece.t
1 BEGIN {
2     chdir 't' if -d 't';
3     @INC = '../lib';
4 }
5
6 BEGIN {
7     require Config; import Config;
8
9     if ($Config{extensions} !~ m!\bTime/Piece\b!) {
10         print "1..0 # Time::Piece not built\n";
11         exit 0;
12     }
13 }
14
15 print "1..75\n";
16
17 use Time::Piece;
18
19 print "ok 1\n";
20
21 my $t = gmtime(951827696); # 2001-02-29T12:34:56
22
23 print "not " unless $t->sec == 56;
24 print "ok 2\n";
25
26 print "not " unless $t->second == 56;
27 print "ok 3\n";
28
29 print "not " unless $t->min == 34;
30 print "ok 4\n";
31
32 #print "not " unless $t->minute == 34;
33 print "ok 5\n";
34
35 print "not " unless $t->hour == 12;
36 print "ok 6\n";
37
38 print "not " unless $t->mday == 29;
39 print "ok 7\n";
40
41 print "not " unless $t->day_of_month == 29;
42 print "ok 8\n";
43
44 print "not " unless $t->mon == 2;
45 print "ok 9\n";
46
47 print "not " unless $t->_mon == 1;
48 print "ok 10\n";
49
50 #print "not " unless $t->monname eq 'Feb';
51 print "ok 11\n";
52
53 print "not " unless $t->month eq 'Feb';
54 print "ok 12\n";
55
56 print "not " unless $t->year == 2000;
57 print "ok 13\n";
58
59 print "not " unless $t->_year == 100;
60 print "ok 14\n";
61
62 print "not " unless $t->wday == 3;
63 print "ok 15\n";
64
65 print "not " unless $t->_wday == 2;
66 print "ok 16\n";
67
68 print "not " unless $t->day_of_week == 2;
69 print "ok 17\n";
70
71 print "not " unless $t->wdayname eq 'Tue';
72 print "ok 18\n";
73
74 print "not " unless $t->day eq 'Tue';
75 print "ok 19\n";
76
77 print "not " unless $t->yday == 59;
78 print "ok 20\n";
79
80 print "not " unless $t->day_of_year == 59;
81 print "ok 21\n";
82
83 # In GMT there should be no daylight savings ever.
84
85 print "not " unless $t->isdst == 0;
86 print "ok 22\n";
87
88 print "not " unless $t->daylight_savings == 0;
89 print "ok 23\n";
90
91 print "not " unless $t->hms eq '12:34:56';
92 print "ok 24\n";
93
94 print "not " unless $t->time eq '12:34:56';
95 print "ok 25\n";
96
97 print "not " unless $t->ymd eq '2000-02-29';
98 print "ok 26\n";
99
100 print "not " unless $t->date eq '2000-02-29';
101 print "ok 27\n";
102
103 print "not " unless $t->mdy eq '02-29-2000';
104 print "ok 28\n";
105
106 print "not " unless $t->dmy eq '29-02-2000';
107 print "ok 29\n";
108
109 print "not " unless $t->cdate eq 'Tue Feb 29 12:34:56 2000';
110 print "ok 30\n";
111
112 print "not " unless "$t" eq 'Tue Feb 29 12:34:56 2000';
113 print "ok 31\n";
114
115 print "not " unless $t->datetime eq '2000-02-29T12:34:56';
116 print "ok 32\n";
117
118 print "not " unless $t->epoch == 951827696;
119 print "ok 33\n";
120
121 # ->tzoffset?
122
123 print "not " unless ($t->julian_day / 2451604.0075) - 1 < 0.001;
124 print "ok 34\n";
125
126 print "not " unless ($t->mjd        /   51603.5075) - 1 < 0.001;
127 print "ok 35\n";
128
129 print "not " unless $t->week == 9;
130 print "ok 36\n";
131
132 if ($Config{d_strftime}) {
133
134     # %a, %A, %b, %B, %c are locale-dependent
135
136     # %C is unportable: sometimes its like asctime(3) or date(1),
137     # sometimes it's the century (and whether for 2000 the century is
138     # 20 or 19, is fun, too..as far as I can read SUSv2 it should be 20.)
139
140     print "not " unless $t->strftime('%d') == 29;
141     print "ok 37\n";
142
143     print "not " unless $t->strftime('%D') eq '02/29/00'; # Yech!
144     print "ok 38\n";
145
146     print "not " unless $t->strftime('%e') eq '29'; # should test with < 10
147     print "ok 39\n";
148
149     print "not " unless $t->strftime('%H') eq '12'; # should test with < 10
150     print "ok 40\n";
151
152      # %h is locale-dependent
153
154     print "not " unless $t->strftime('%I') eq '12'; # should test with < 10
155     print "ok 41\n";
156
157     print "not " unless $t->strftime('%j') == 60; # why ->yday+1 ?
158     print "ok 42\n";
159
160     print "not " unless $t->strftime('%M') eq '34'; # should test with < 10
161     print "ok 43\n";
162
163     # %p, %P, and %r are not widely implemented,
164     # and are possibly unportable (am or AM or a.m., and so on)
165
166     print "not " unless $t->strftime('%R') eq '12:34'; # should test with > 12
167     print "ok 44\n";
168
169     print "not " unless $t->strftime('%S') eq '56'; # should test with < 10
170     print "ok 45\n";
171
172     print "not " unless $t->strftime('%T') eq '12:34:56'; # < 12 and > 12
173     print "ok 46\n";
174
175     # There are bugs in the implementation of %u in many platforms.
176     # (e.g. Linux seems to think, despite the man page, that %u
177     # 1-based on Sunday...)
178
179     print "not " unless $t->strftime('%U') eq '09'; # Sun cmp Mon
180     print "ok 47\n";
181
182     print "not " unless $t->strftime('%V') eq '09'; # Sun cmp Mon
183     print "ok 48\n";
184
185     print "not " unless $t->strftime('%w') == 2;
186     print "ok 49\n";
187
188     print "not " unless $t->strftime('%W') eq '09'; # Sun cmp Mon
189     print "ok 50\n";
190
191     # %x is locale and implementation dependent.
192
193     print "not " unless $t->strftime('%y') == 0; # should test with 1999
194     print "ok 51\n";
195
196     print "not " unless $t->strftime('%Y') eq '2000';
197     print "ok 52\n";
198
199     # %Z is locale and implementation dependent
200     # (there is NO standard for timezone names)
201
202 } else {
203     for (38...52) {
204         print "ok $_ # Skip: no strftime\n";
205     }
206 }
207
208 print "not " unless $t->date("") eq '20000229';
209 print "ok 53\n";
210
211 print "not " unless $t->ymd("") eq '20000229';
212 print "ok 54\n";
213 print "not " unless $t->mdy("/") eq '02/29/2000';
214 print "ok 55\n";
215
216 print "not " unless $t->dmy(".") eq '29.02.2000';
217 print "ok 56\n";
218
219 print "not " unless $t->date_separator() eq '-';
220 print "ok 57\n";
221
222 $t->date_separator("/");
223
224 print "not " unless $t->ymd eq '2000/02/29';
225 print "ok 58\n";
226
227 print "not " unless $t->date_separator() eq '/';
228 print "ok 59\n";
229
230 $t->date_separator("-");
231
232 print "not " unless $t->hms(".") eq '12.34.56';
233 print "ok 60\n";
234
235 print "not " unless $t->time_separator() eq ':';
236 print "ok 61\n";
237
238 $t->time_separator(".");
239
240 print "not " unless $t->hms eq '12.34.56';
241 print "ok 62\n";
242
243 print "not " unless $t->time_separator() eq '.';
244 print "ok 63\n";
245
246 $t->time_separator(":");
247
248 my @fidays = qw( sunnuntai maanantai tiistai keskiviikko torstai
249                  perjantai lauantai );
250 my @frdays = qw( Dimanche Lundi Merdi Mercredi Jeudi Vendredi Samedi );
251
252 print "not " unless $t->day(@fidays) eq "tiistai";
253 print "ok 64\n";
254
255 my @days = $t->day_list();
256
257 $t->day_list(@frdays);
258
259 print "not " unless $t->day eq "Merdi";
260 print "ok 65\n";
261
262 $t->day_list(@days);
263
264 print "not " unless $t->day eq "Tue";
265 print "ok 66\n";
266
267 my @months = $t->mon_list();
268
269 my @dumonths = qw(januari februari maart april mei juni
270                   juli augustus september oktober november december);
271
272 print "not " unless $t->month(@dumonths) eq "februari";
273 print "ok 67\n";
274
275 $t->mon_list(@dumonths);
276
277 print "not " unless $t->month eq "februari";
278 print "ok 68\n";
279
280 $t->mon_list(@months);
281
282 print "not " unless $t->month eq "Feb";
283 print "ok 69\n";
284
285 print "not " unless
286     $t->datetime(date => '/', T => ' ', time => '-') eq "2000/02/29 12-34-56";
287 print "ok 70\n";
288
289 print "not " unless $t->is_leap_year; # should test more with different dates
290 print "ok 71\n";
291
292 print "not " unless $t->month_last_day == 29; # test more
293 print "ok 72\n";
294
295 print "not " if Time::Piece::_is_leap_year(1900);
296 print "ok 73\n";
297
298 print "not " if Time::Piece::_is_leap_year(1901);
299 print "ok 74\n";
300
301 print "not " unless Time::Piece::_is_leap_year(1904);
302 print "ok 75\n";
303