Commit | Line | Data |
---|---|---|
16433e2b SP |
1 | use Test::More tests => 93; |
2 | ||
3 | my $is_win32 = ($^O =~ /Win32/); | |
be8a15fc | 4 | my $is_qnx = ($^O eq 'qnx'); |
16433e2b SP |
5 | BEGIN { use_ok('Time::Piece'); } |
6 | ok(1); | |
7 | ||
8 | my $t = gmtime(951827696); # 2000-02-29T12:34:56 | |
9 | ||
10 | is($t->sec, 56); | |
11 | is($t->second, 56); | |
12 | is($t->min, 34); | |
13 | is($t->minute, 34); | |
14 | is($t->hour, 12); | |
15 | is($t->mday, 29); | |
16 | is($t->day_of_month, 29); | |
17 | is($t->mon, 2); | |
18 | is($t->_mon, 1); | |
19 | is($t->monname, 'Feb'); | |
20 | is($t->month, 'Feb'); | |
21 | is($t->fullmonth, 'February'); | |
22 | is($t->year, 2000); | |
23 | is($t->_year, 100); | |
24 | is($t->yy, '00'); | |
25 | ||
26 | cmp_ok($t->wday, '==', 3); | |
27 | cmp_ok($t->_wday, '==', 2); | |
28 | cmp_ok($t->day_of_week, '==', 2); | |
29 | cmp_ok($t->wdayname, 'eq', 'Tue'); | |
30 | cmp_ok($t->day, 'eq', 'Tue'); | |
31 | cmp_ok($t->fullday, 'eq', 'Tuesday'); | |
32 | cmp_ok($t->yday, '==', 59); | |
33 | cmp_ok($t->day_of_year, '==', 59); | |
34 | ||
35 | # In GMT there should be no daylight savings ever. | |
36 | cmp_ok($t->isdst, '==', 0); | |
37 | cmp_ok($t->epoch, '==', 951827696); | |
38 | cmp_ok($t->hms, 'eq', '12:34:56'); | |
39 | cmp_ok($t->time, 'eq', '12:34:56'); | |
40 | cmp_ok($t->ymd, 'eq', '2000-02-29'); | |
41 | cmp_ok($t->date, 'eq', '2000-02-29'); | |
42 | cmp_ok($t->mdy, 'eq', '02-29-2000'); | |
43 | cmp_ok($t->dmy, 'eq', '29-02-2000'); | |
44 | cmp_ok($t->cdate, 'eq', 'Tue Feb 29 12:34:56 2000'); | |
45 | cmp_ok("$t", 'eq', 'Tue Feb 29 12:34:56 2000'); | |
46 | cmp_ok($t->datetime, 'eq','2000-02-29T12:34:56'); | |
47 | cmp_ok($t->daylight_savings, '==', 0); | |
48 | ||
49 | # ->tzoffset? | |
50 | cmp_ok(($t->julian_day / 2451604.0243 ) - 1, '<', 0.001); | |
51 | cmp_ok(($t->mjd / 51603.52426) - 1, '<', 0.001); | |
52 | cmp_ok($t->week, '==', 9); | |
53 | ||
54 | # strftime tests | |
55 | ||
56 | # %a, %A, %b, %B, %c are locale-dependent | |
57 | ||
58 | # %C is unportable: sometimes its like asctime(3) or date(1), | |
59 | # sometimes it's the century (and whether for 2000 the century is | |
60 | # 20 or 19, is fun, too..as far as I can read SUSv2 it should be 20.) | |
61 | cmp_ok($t->strftime('%d'), '==', 29); | |
62 | ||
63 | SKIP: { | |
be8a15fc | 64 | skip "can't strftime %D, %R, %T or %e on Win32", 1 if $is_win32; |
16433e2b | 65 | cmp_ok($t->strftime('%D'), 'eq', '02/29/00'); # Yech! |
be8a15fc AG |
66 | } |
67 | SKIP:{ | |
68 | skip "can't strftime %D, %R, %T or %e on Win32", 1 if $is_win32; | |
69 | skip "can't strftime %e on QNX", 1 if $is_qnx; | |
16433e2b SP |
70 | cmp_ok($t->strftime('%e'), 'eq', '29'); # should test with < 10 |
71 | } | |
72 | ||
73 | # %h is locale-dependent | |
74 | cmp_ok($t->strftime('%H'), 'eq', '12'); # should test with < 10 | |
75 | ||
76 | cmp_ok($t->strftime('%I'), 'eq', '12'); # should test with < 10 | |
77 | cmp_ok($t->strftime('%j'), '==', 60 ); # why ->yday+1 ? | |
78 | cmp_ok($t->strftime('%M'), 'eq', '34'); # should test with < 10 | |
79 | ||
80 | # %p, %P, and %r are not widely implemented, | |
81 | # and are possibly unportable (am or AM or a.m., and so on) | |
82 | ||
83 | SKIP: { | |
be8a15fc | 84 | skip "can't strftime %R on Win32 or QNX", 1 if $is_win32 or $is_qnx; |
16433e2b SP |
85 | cmp_ok($t->strftime('%R'), 'eq', '12:34'); # should test with > 12 |
86 | } | |
87 | ||
88 | ok($t->strftime('%S') eq '56'); # should test with < 10 | |
89 | ||
90 | SKIP: { | |
91 | skip "can't strftime %T on Win32", 1 if $is_win32; | |
92 | cmp_ok($t->strftime('%T'), 'eq', '12:34:56'); # < 12 and > 12 | |
93 | } | |
94 | ||
95 | # There are bugs in the implementation of %u in many platforms. | |
96 | # (e.g. Linux seems to think, despite the man page, that %u | |
97 | # 1-based on Sunday...) | |
98 | ||
99 | cmp_ok($t->strftime('%U'), 'eq', '09'); # Sun cmp Mon | |
100 | ||
101 | SKIP: { | |
be8a15fc | 102 | skip "can't strftime %V on Win32 or QNX", 1 if $is_win32 or $is_qnx; |
16433e2b SP |
103 | # is this test really broken on Mac OS? -- rjbs, 2006-02-08 |
104 | cmp_ok($t->strftime('%V'), 'eq', '09'); # Sun cmp Mon | |
105 | } | |
106 | ||
107 | cmp_ok($t->strftime('%w'), '==', 2); | |
108 | cmp_ok($t->strftime('%W'), 'eq', '09'); # Sun cmp Mon | |
109 | ||
110 | # %x is locale and implementation dependent. | |
111 | ||
112 | cmp_ok($t->strftime('%y'), '==', 0); # should test with 1999 | |
113 | cmp_ok($t->strftime('%Y'), 'eq', '2000'); | |
114 | ||
115 | # %Z is locale and implementation dependent | |
116 | # (there is NO standard for timezone names) | |
117 | cmp_ok($t->date(""), 'eq', '20000229'); | |
118 | cmp_ok($t->ymd("") , 'eq', '20000229'); | |
119 | cmp_ok($t->mdy("/"), 'eq', '02/29/2000'); | |
120 | cmp_ok($t->dmy("."), 'eq', '29.02.2000'); | |
121 | cmp_ok($t->date_separator, 'eq', '-'); | |
122 | ||
123 | $t->date_separator("/"); | |
124 | cmp_ok($t->date_separator, 'eq', '/'); | |
125 | cmp_ok($t->ymd, 'eq', '2000/02/29'); | |
126 | ||
127 | $t->date_separator("-"); | |
128 | cmp_ok($t->time_separator, 'eq', ':'); | |
129 | cmp_ok($t->hms("."), 'eq', '12.34.56'); | |
130 | ||
131 | $t->time_separator("."); | |
132 | cmp_ok($t->time_separator, 'eq', '.'); | |
133 | cmp_ok($t->hms, 'eq', '12.34.56'); | |
134 | ||
135 | $t->time_separator(":"); | |
136 | ||
137 | my @fidays = qw( sunnuntai maanantai tiistai keskiviikko torstai | |
138 | perjantai lauantai ); | |
139 | my @frdays = qw( Dimanche Lundi Merdi Mercredi Jeudi Vendredi Samedi ); | |
140 | ||
141 | cmp_ok($t->day(@fidays), 'eq', "tiistai"); | |
142 | my @days = $t->day_list(); | |
143 | ||
144 | $t->day_list(@frdays); | |
145 | ||
146 | cmp_ok($t->day, 'eq', "Merdi"); | |
147 | ||
148 | $t->day_list(@days); | |
149 | ||
150 | cmp_ok($t->day, 'eq', "Tue"); | |
151 | ||
152 | my @months = $t->mon_list(); | |
153 | ||
154 | my @dumonths = qw(januari februari maart april mei juni | |
155 | juli augustus september oktober november december); | |
156 | ||
157 | cmp_ok($t->month(@dumonths), 'eq', "februari"); | |
158 | ||
159 | $t->mon_list(@dumonths); | |
160 | ||
161 | cmp_ok($t->month, 'eq', "februari"); | |
162 | ||
163 | $t->mon_list(@months); | |
164 | ||
165 | cmp_ok($t->month, 'eq', "Feb"); | |
166 | ||
167 | cmp_ok( | |
168 | $t->datetime(date => '/', T => ' ', time => '-'), | |
169 | 'eq', | |
170 | "2000/02/29 12-34-56" | |
171 | ); | |
172 | ||
173 | ok($t->is_leap_year); # should test more with different dates | |
174 | ||
175 | cmp_ok($t->month_last_day, '==', 29); # test more | |
176 | ||
177 | ok(!Time::Piece::_is_leap_year(1900)); | |
178 | ||
179 | ok(!Time::Piece::_is_leap_year(1901)); | |
180 | ||
181 | ok(Time::Piece::_is_leap_year(1904)); | |
182 | ||
183 | cmp_ok(Time::Piece->strptime("1945", "%Y")->year, '==', 1945, "Year is 1945?"); | |
184 | ||
185 | cmp_ok(Time::Piece->strptime("13:00", "%H:%M")->hour, '==', 13, "Hour is 13?"); | |
186 | ||
187 | # Test week number | |
188 | # [from Ilya Martynov] | |
189 | cmp_ok(Time::Piece->strptime("2002/06/10 0", '%Y/%m/%d %H')->week, '==', 24); | |
190 | cmp_ok(Time::Piece->strptime("2002/06/10 1", '%Y/%m/%d %H')->week, '==', 24); | |
191 | cmp_ok(Time::Piece->strptime("2002/06/10 2", '%Y/%m/%d %H')->week, '==', 24); | |
192 | cmp_ok(Time::Piece->strptime("2002/06/10 12", '%Y/%m/%d %H')->week, '==', 24); | |
193 | cmp_ok(Time::Piece->strptime("2002/06/10 13", '%Y/%m/%d %H')->week, '==', 24); | |
194 | cmp_ok(Time::Piece->strptime("2002/06/10 14", '%Y/%m/%d %H')->week, '==', 24); | |
195 | cmp_ok(Time::Piece->strptime("2002/06/10 23", '%Y/%m/%d %H')->week, '==', 24); | |
196 | ||
197 | # Test that strptime populates all relevant fields | |
198 | cmp_ok(Time::Piece->strptime("2002/07/10", '%Y/%m/%d')->wday, '==', 4); | |
199 | cmp_ok(Time::Piece->strptime("2002/12/31", '%Y/%m/%d')->yday, '==', 364); | |
200 | cmp_ok(Time::Piece->strptime("2002/07/10", '%Y/%m/%d')->isdst, '==', 0); | |
201 | cmp_ok(Time::Piece->strptime("2002/07/10", '%Y/%m/%d')->day_of_week, '==', 3); | |
202 | ||
203 | cmp_ok( | |
204 | Time::Piece->strptime("2000/02/29 12:34:56", '%Y/%m/%d %H:%M:%S')->epoch, | |
205 | '==', | |
206 | 951827696 | |
207 | ); |