DateTime-Lite
view release on metacpan or search on metacpan
t/12.tz_database.t view on Meta::CPAN
};
# NOTE: TZif metadata: version and footer present for DST zones
subtest 'TZif metadata' => sub
{
# All zones must have a valid tzif_version (1, 2, 3, or 4)
my( $bad_version ) = $dbh->selectrow_array(
"SELECT COUNT(*) FROM zones WHERE tzif_version NOT IN (1,2,3,4)"
);
is( $bad_version, 0, 'all zones have valid tzif_version (1-4)' );
# DST zones should have a non-empty footer TZ string
my( $dst_no_footer ) = $dbh->selectrow_array(
q{SELECT COUNT(*) FROM zones
WHERE has_dst = 1
AND ( footer_tz_string IS NULL OR LENGTH(footer_tz_string) = 0 )}
);
is( $dst_no_footer, 0,
'all DST zones have a non-empty POSIX footer TZ string' );
# UTC/non-DST zones should have an empty or NULL footer
my $ny = $dbh->selectrow_hashref(
"SELECT tzif_version, footer_tz_string FROM zones WHERE name = ?",
undef, "America/New_York"
);
ok( defined( $ny ), 'America/New_York has metadata' );
if( defined( $ny ) )
{
cmp_ok( $ny->{tzif_version}, '>=', 2,
'America/New_York has TZif version >= 2 (footer supported)' );
like( $ny->{footer_tz_string}, qr/EST5?EDT/,
'America/New_York footer contains EST/EDT rule' );
}
my $tokyo = $dbh->selectrow_hashref(
"SELECT footer_tz_string FROM zones WHERE name = ?",
undef, "Asia/Tokyo"
);
ok( defined( $tokyo ), 'Asia/Tokyo has metadata' );
if( defined( $tokyo ) )
{
like( $tokyo->{footer_tz_string}, qr/JST/,
'Asia/Tokyo footer contains JST' );
}
};
# Historical offset lookups via spans
# These use dates within the stored transitions so they work with the
# current span-based lookup regardless of POSIX footer support.
subtest 'Historical offset lookups via spans' => sub
{
my @tests = (
# zone unix_ts exp_off exp_dst exp_abbr label
[ 'Asia/Tokyo', timegm(0,0,15,1,3,1951), 32400, 0, 'JST', 'Tokyo 1951 (historical)' ],
[ 'Asia/Tokyo', timegm(0,0,15,1,3,1980), 32400, 0, 'JST', 'Tokyo 1980 (historical)' ],
[ 'America/New_York', timegm(0,0,15,14,6,2000), -14400, 1, 'EDT', 'NY 2000-07 summer (historical)' ],
[ 'America/New_York', timegm(0,0,15,14,11,2000), -18000, 0, 'EST', 'NY 2000-12 winter (historical)' ],
[ 'America/New_York', timegm(0,0,15,14,6,2006), -14400, 1, 'EDT', 'NY 2006-07 summer (historical)' ],
[ 'America/New_York', timegm(0,0,15,14,11,2006), -18000, 0, 'EST', 'NY 2006-12 winter (historical)' ],
[ 'Europe/Paris', timegm(0,0,15,14,5,1995), 7200, 1, 'CEST', 'Paris 1995 summer (historical)' ],
[ 'Europe/Paris', timegm(0,0,15,14,11,1995), 3600, 0, 'CET', 'Paris 1995 winter (historical)' ],
[ 'Etc/UTC', timegm(0,0,12,1,0,2026), 0, 0, 'UTC', 'UTC any date' ],
);
foreach my $t ( @tests )
{
my( $zone, $ts, $exp_off, $exp_dst, $exp_abbr, $label ) = @$t;
my $r = $dbh->selectrow_hashref(
q{SELECT s.offset, s.is_dst, s.short_name
FROM spans s
JOIN zones z ON z.zone_id = s.zone_id
WHERE z.name = ?
AND ( s.utc_start IS NULL OR s.utc_start <= ? )
AND ( s.utc_end IS NULL OR s.utc_end > ? )
LIMIT 1},
undef, $zone, $ts, $ts
);
ok( defined( $r ), "$label: span found" );
next unless( defined( $r ) );
is( $r->{offset}, $exp_off, "$label: offset=$exp_off" );
is( $r->{is_dst}, $exp_dst, "$label: is_dst=$exp_dst" );
is( $r->{short_name}, $exp_abbr, "$label: abbr=$exp_abbr" );
}
};
# v_zone_name view: resolves both canonical names and aliases
subtest 'v_zone_name' => sub
{
my $r = $dbh->selectrow_hashref(
"SELECT * FROM v_zone_name WHERE input_name = ?",
undef, "Japan"
);
ok( defined( $r ), "v_zone_name: Japan resolves" );
is( $r->{canonical_name}, 'Asia/Tokyo', "v_zone_name: Japan -> Asia/Tokyo" );
is( $r->{is_alias}, 1, "v_zone_name: Japan is_alias=1" );
my $r2 = $dbh->selectrow_hashref(
"SELECT * FROM v_zone_name WHERE input_name = ?",
undef, "Asia/Tokyo"
);
ok( defined( $r2 ), "v_zone_name: Asia/Tokyo resolves" );
is( $r2->{canonical_name}, 'Asia/Tokyo', "v_zone_name: Asia/Tokyo canonical" );
is( $r2->{is_alias}, 0, "v_zone_name: Asia/Tokyo is_alias=0" );
};
# NOTE: No duplicate zone names
subtest 'No duplicate zone names' => sub
{
my( $dup_zones ) = $dbh->selectrow_array(
"SELECT COUNT(*) FROM (SELECT name, COUNT(*) c FROM zones GROUP BY name HAVING c > 1)"
);
is( $dup_zones, 0, 'no duplicate zone names' );
my( $dup_aliases ) = $dbh->selectrow_array(
"SELECT COUNT(*) FROM (SELECT alias, COUNT(*) c FROM aliases GROUP BY alias HAVING c > 1)"
);
is( $dup_aliases, 0, 'no duplicate alias names' );
};
# No zone appears as both a canonical zone and an alias
subtest 'No zone as alias' => sub
( run in 1.620 second using v1.01-cache-2.11-cpan-39bf76dae61 )