use strict;
use warnings;
use DateTime::TimeZone::Local;
use File::Basename qw( basename );
use File::Spec;
use Sys::Hostname qw( hostname );
use Test::More;
use lib File::Spec->catdir( File::Spec->curdir, 't' );
BEGIN { require 'check_datetime_version.pl' }
unless ( $^O =~ /win32/i )
{
plan skip_all => 'These tests only run on Windows';
}
my $Registry;
eval <<'EOF';
use DateTime::TimeZone::Local::Win32;
use Win32::TieRegistry ( TiedRef => \$Registry, Delimiter => q{/} );
EOF
if ($@)
{
plan skip_all => 'These tests require Win32::TieRegistry';
}
my $tzi_key =
$Registry->Open
( 'LMachine/SYSTEM/CurrentControlSet/Control/TimeZoneInformation/',
{ Access => Win32::TieRegistry::KEY_READ() | Win32::TieRegistry::KEY_WRITE() }
);
plan skip_all => 'These tests require write access to TimeZoneInformation registry key'
unless $tzi_key;
my @win_tz_names = windows_tz_names();
plan tests => @win_tz_names + 6;
my $WindowsTZKey;
{
foreach my $win_tz_name (@win_tz_names)
{
set_and_test_windows_tz( $win_tz_name, undef, $tzi_key );
}
# We test these explicitly because we want to make sure that at
# least a few known names do work, rather than just relying on
# looping through a list.
for my $pair ( [ 'Eastern Standard Time', 'America/New_York' ],
[ 'Dateline Standard Time', 'Pacific/Majuro' ],
[ 'Israel Standard Time', 'Asia/Jerusalem' ],
)
{
set_and_test_windows_tz( @{ $pair }, $tzi_key );
}
}
sub windows_tz_names
{
$WindowsTZKey =
$Registry->Open( 'LMachine/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Time Zones/',
{ Access => Win32::TieRegistry::KEY_READ() }
);
$WindowsTZKey ||=
$Registry->Open( 'LMachine/SOFTWARE/Microsoft/Windows/CurrentVersion/Time Zones/',
{ Access => Win32::TieRegistry::KEY_READ() }
);
return unless $WindowsTZKey;
return $WindowsTZKey->SubKeyNames();
}
sub set_and_test_windows_tz
{
my $windows_tz_name = shift;
my $olson_name = shift;
my $tzi_key = shift;
if ( defined $tzi_key
&& defined $tzi_key->{'/TimeZoneKeyName'}
&& $tzi_key->{'/TimeZoneKeyName'} ne '' )
{
local $tzi_key->{'/TimeZoneKeyName'} = $windows_tz_name;
test_windows_zone( $windows_tz_name, $olson_name );
}
else
{
local $tzi_key->{'/StandardName'} =
( $WindowsTZKey->{ $windows_tz_name . q{/} }
? $WindowsTZKey->{ $windows_tz_name . '/Std' }
: 'MAKE BELIEVE VALUE'
);
test_windows_zone( $windows_tz_name, $olson_name );
}
}
sub test_windows_zone
{
my $windows_tz_name = shift;
my $olson_name = shift;
my $tz = DateTime::TimeZone::Local::Win32->FromRegistry();
ok( $tz && DateTime::TimeZone->is_valid_name( $tz->name() ),
"$windows_tz_name - found valid Olson time zone from Windows" );
if ( defined $olson_name )
{
my $desc = "$windows_tz_name was mapped to $olson_name";
if ($tz)
{
is( $tz->name(), $olson_name, $desc );
}
else
{
fail($desc);
}
}
}