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 )