1*56d68f1eSafresh1use Test::More;
2*56d68f1eSafresh1
3*56d68f1eSafresh1# Skip if doing a regular install
4*56d68f1eSafresh1# Avoids mystery DST bugs [rt 128240], [GH40]
5*56d68f1eSafresh1plan skip_all => "DST tests not required for installation"
6*56d68f1eSafresh1  unless ( $ENV{AUTOMATED_TESTING} );
7b8851fccSafresh1
8b8851fccSafresh1my $is_win32 = ($^O =~ /Win32/);
9b8851fccSafresh1my $is_qnx = ($^O eq 'qnx');
10b8851fccSafresh1my $is_vos = ($^O eq 'vos');
11b8851fccSafresh1my $is_linux = ($^O =~ /linux/);
12b8851fccSafresh1my $is_bsd = ($^O =~ /bsd/);
13b8851fccSafresh1my $is_mac = ($^O =~ /darwin/);
14b8851fccSafresh1
15b8851fccSafresh1use Time::Piece;
16b8851fccSafresh1use Time::Seconds;
17b8851fccSafresh1
18b8851fccSafresh1#test using an epoch that can be DST
19b8851fccSafresh1#because sometimes funny stuff can occur [cpan #93095]
20b8851fccSafresh1#https://rt.cpan.org/Ticket/Display.html?id=93095#txn-1482590
21b8851fccSafresh1
22b8851fccSafresh1my $t = gmtime(1373371631); # 2013-07-09T12:07:11
23b8851fccSafresh1
24b8851fccSafresh1is($t->sec,               11);
25b8851fccSafresh1is($t->second,            11);
26b8851fccSafresh1is($t->min,               07);
27b8851fccSafresh1is($t->minute,            07);
28b8851fccSafresh1is($t->hour,              12);
29b8851fccSafresh1is($t->mday,               9);
30b8851fccSafresh1is($t->day_of_month,       9);
31b8851fccSafresh1is($t->mon,                7);
32b8851fccSafresh1is($t->_mon,               6);
33b8851fccSafresh1is($t->year,            2013);
34b8851fccSafresh1is($t->_year,            113);
35b8851fccSafresh1is($t->yy,              '13');
36b8851fccSafresh1
37b8851fccSafresh1cmp_ok($t->wday,        '==',         3);
38b8851fccSafresh1cmp_ok($t->_wday,       '==',         2);
39b8851fccSafresh1cmp_ok($t->day_of_week, '==',         2);
40b8851fccSafresh1cmp_ok($t->yday,        '==',        189);
41b8851fccSafresh1cmp_ok($t->day_of_year, '==',        189);
42b8851fccSafresh1
43b8851fccSafresh1# In GMT there should be no daylight savings ever.
44b8851fccSafresh1cmp_ok($t->isdst, '==', 0);
45b8851fccSafresh1cmp_ok($t->epoch, '==',   1373371631);
46b8851fccSafresh1cmp_ok($t->hms,   'eq',   '12:07:11');
47b8851fccSafresh1cmp_ok($t->time,  'eq',   '12:07:11');
48b8851fccSafresh1cmp_ok($t->ymd,   'eq', '2013-07-09');
49b8851fccSafresh1cmp_ok($t->date,  'eq', '2013-07-09');
50b8851fccSafresh1cmp_ok($t->mdy,   'eq', '07-09-2013');
51b8851fccSafresh1cmp_ok($t->dmy,   'eq', '09-07-2013');
52b8851fccSafresh1cmp_ok($t->cdate, 'eq', 'Tue Jul  9 12:07:11 2013');
53b8851fccSafresh1cmp_ok("$t",      'eq', 'Tue Jul  9 12:07:11 2013');
54b8851fccSafresh1cmp_ok($t->datetime, 'eq','2013-07-09T12:07:11');
55b8851fccSafresh1cmp_ok($t->daylight_savings, '==', 0);
56b8851fccSafresh1
57b8851fccSafresh1
58b8851fccSafresh1cmp_ok($t->week, '==', 28);
59b8851fccSafresh1
60b8851fccSafresh1# strftime tests
61b8851fccSafresh1
62b8851fccSafresh1# %a, %A, %b, %B, %c are locale-dependent
63b8851fccSafresh1
64b8851fccSafresh1# %C is unportable: sometimes its like asctime(3) or date(1),
65b8851fccSafresh1# sometimes it's the century (and whether for 2000 the century is
66b8851fccSafresh1# 20 or 19, is fun, too..as far as I can read SUSv2 it should be 20.)
67b8851fccSafresh1cmp_ok($t->strftime('%d'), '==', 9);
68b8851fccSafresh1
69b8851fccSafresh1SKIP: {
70b8851fccSafresh1  skip "can't strftime %D, %R, %T or %e on Win32", 1 if $is_win32;
71b8851fccSafresh1  cmp_ok($t->strftime('%D'), 'eq', '07/09/13'); # Yech!
72b8851fccSafresh1}
73b8851fccSafresh1SKIP:{
74b8851fccSafresh1  skip "can't strftime %D, %R, %T or %e on Win32", 1 if $is_win32;
75b8851fccSafresh1  skip "can't strftime %e on QNX", 1 if $is_qnx;
76b8851fccSafresh1  cmp_ok($t->strftime('%e'), 'eq', ' 9');       # should test with < 10
77b8851fccSafresh1}
78b8851fccSafresh1
79b8851fccSafresh1# %h is locale-dependent
80b8851fccSafresh1cmp_ok($t->strftime('%H'), 'eq', '12'); # should test with < 10
81b8851fccSafresh1
82b8851fccSafresh1cmp_ok($t->strftime('%I'), 'eq', '12'); # should test with < 10
83b8851fccSafresh1cmp_ok($t->strftime('%j'), '==',  190 ); # why ->yday+1 ?
84b8851fccSafresh1cmp_ok($t->strftime('%M'), 'eq', '07'); # should test with < 10
85b8851fccSafresh1
86b8851fccSafresh1# %p, %P, and %r are not widely implemented,
87b8851fccSafresh1# and are possibly unportable (am or AM or a.m., and so on)
88b8851fccSafresh1
89b8851fccSafresh1SKIP: {
90b8851fccSafresh1  skip "can't strftime %R on Win32 or QNX", 1 if $is_win32 or $is_qnx;
91b8851fccSafresh1  cmp_ok($t->strftime('%R'), 'eq', '12:07');    # should test with > 12
92b8851fccSafresh1}
93b8851fccSafresh1
94b8851fccSafresh1ok($t->strftime('%S') eq '11'); # should test with < 10
95b8851fccSafresh1
96b8851fccSafresh1SKIP: {
97b8851fccSafresh1  skip "can't strftime %T on Win32", 1 if $is_win32;
98b8851fccSafresh1  cmp_ok($t->strftime('%T'), 'eq', '12:07:11'); # < 12 and > 12
99b8851fccSafresh1}
100b8851fccSafresh1
101b8851fccSafresh1# There are bugs in the implementation of %u in many platforms.
102b8851fccSafresh1# (e.g. Linux seems to think, despite the man page, that %u
103b8851fccSafresh1# 1-based on Sunday...)
104b8851fccSafresh1
105b8851fccSafresh1cmp_ok($t->strftime('%U'), 'eq', '27'); # Sun cmp Mon
106b8851fccSafresh1
107b8851fccSafresh1SKIP: {
108b8851fccSafresh1    skip "can't strftime %V on Win32 or QNX or VOS", 1 if $is_win32 or $is_qnx or $is_vos;
109b8851fccSafresh1    # is this test really broken on Mac OS? -- rjbs, 2006-02-08
110b8851fccSafresh1    cmp_ok($t->strftime('%V'), 'eq', '28'); # Sun cmp Mon
111b8851fccSafresh1}
112b8851fccSafresh1
113b8851fccSafresh1cmp_ok($t->strftime('%w'), '==', 2);
114b8851fccSafresh1cmp_ok($t->strftime('%W'), 'eq', '27'); # Sun cmp Mon
115b8851fccSafresh1
116b8851fccSafresh1# %x is locale and implementation dependent.
117b8851fccSafresh1
118b8851fccSafresh1cmp_ok($t->strftime('%y'), '==', 13); # should test with 1999
119b8851fccSafresh1cmp_ok($t->strftime('%Y'), 'eq', '2013');
120b8851fccSafresh1
121b8851fccSafresh1ok(not $t->is_leap_year); # should test more with different dates
122b8851fccSafresh1
123b8851fccSafresh1cmp_ok($t->month_last_day, '==', 31); # test more
124b8851fccSafresh1
125b8851fccSafresh1
126b8851fccSafresh1SKIP: {
1275759b3d2Safresh1	skip "Extra tests for Linux, BSD only.", 8 unless $is_linux or $is_mac or $is_bsd;
128b8851fccSafresh1
129*56d68f1eSafresh1    local $ENV{TZ} = "EST5EDT4,M3.2.0/2,M11.1.0/2";
130b8851fccSafresh1    Time::Piece::_tzset();
131b8851fccSafresh1    my $lt = localtime(1373371631); #2013-07-09T12:07:11
132b8851fccSafresh1    cmp_ok(scalar($lt->tzoffset), 'eq', '-14400');
133b8851fccSafresh1    cmp_ok($lt->strftime("%Y-%m-%d %H:%M:%S %Z"), 'eq', '2013-07-09 08:07:11 EDT');
134b8851fccSafresh1    like  ($lt->strftime("%z"), qr/-0400|EDT/); #windows: %Z and %z are the same
1355759b3d2Safresh1    is    ($lt->strftime("%s"), 1373371631, 'Epoch output is the same with EDT');
136b8851fccSafresh1
137b8851fccSafresh1    $lt = localtime(1357733231); #2013-01-09T12:07:11
138b8851fccSafresh1    cmp_ok(scalar($lt->tzoffset), 'eq', '-18000');
139b8851fccSafresh1    cmp_ok($lt->strftime("%Y-%m-%d %H:%M:%S %Z"), 'eq', '2013-01-09 07:07:11 EST');
140b8851fccSafresh1    like  ($lt->strftime("%z"), qr/-0500|EST/);
1415759b3d2Safresh1    is    ($lt->strftime("%s"), 1357733231, 'Epoch output is the same with EST');
142b8851fccSafresh1}
143b8851fccSafresh1
144*56d68f1eSafresh1done_testing(56);
145