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