use strict;
use warnings;
use Test::More;
use Time::Zone;
# tz_offset: standard timezone abbreviations
is(tz_offset("GMT"), 0, "tz_offset GMT = 0");
is(tz_offset("UTC"), 0, "tz_offset UTC = 0");
is(tz_offset("EST"), -18000, "tz_offset EST = -18000");
is(tz_offset("CST"), -21600, "tz_offset CST = -21600");
is(tz_offset("MST"), -25200, "tz_offset MST = -25200");
is(tz_offset("PST"), -28800, "tz_offset PST = -28800");
is(tz_offset("CET"), 3600, "tz_offset CET = 3600");
is(tz_offset("JST"), 32400, "tz_offset JST = 32400");
is(tz_offset("IST"), 19800, "tz_offset IST = 19800");
is(tz_offset("NST"), -12600, "tz_offset NST = -12600 (Newfoundland Standard)");
is(tz_offset("NFT"), -12600, "tz_offset NFT = -12600 (Newfoundland)");
# tz_offset: Newfoundland Daylight (half-hour DST)
is(tz_offset("NDT"), -9000, "tz_offset NDT = -9000 (Newfoundland Daylight)");
# tz_offset: DST timezone abbreviations
is(tz_offset("EDT"), -14400, "tz_offset EDT = -14400");
is(tz_offset("CDT"), -18000, "tz_offset CDT = -18000");
is(tz_offset("MDT"), -21600, "tz_offset MDT = -21600");
is(tz_offset("PDT"), -25200, "tz_offset PDT = -25200");
is(tz_offset("BST"), 3600, "tz_offset BST = 3600");
is(tz_offset("CEST"), 7200, "tz_offset CEST = 7200");
# tz_offset: numeric offsets
is(tz_offset("+0000"), 0, "tz_offset +0000 = 0");
is(tz_offset("-0500"), -18000, "tz_offset -0500 = -18000");
is(tz_offset("+0530"), 19800, "tz_offset +0530 = 19800");
is(tz_offset("+0900"), 32400, "tz_offset +0900 = 32400");
is(tz_offset("-0800"), -28800, "tz_offset -0800 = -28800");
# tz_offset: Southeast Asian timezones (RT#123247)
is(tz_offset("ICT"), 25200, "tz_offset ICT = 25200 (Indochina Time, UTC+7)");
is(tz_offset("PHT"), 28800, "tz_offset PHT = 28800 (Philippine Time, UTC+8)");
is(tz_offset("ict"), 25200, "tz_offset ict case insensitive");
is(tz_offset("pht"), 28800, "tz_offset pht case insensitive");
# tz_offset: unknown zone returns undef
is(tz_offset("BOGUS"), undef, "tz_offset unknown zone returns undef");
# tz_offset: case insensitivity
is(tz_offset("gmt"), 0, "tz_offset case insensitive: gmt");
is(tz_offset("est"), -18000, "tz_offset case insensitive: est");
# tz_name: with explicit $dst parameter (deterministic, no system-time dependency)
# When $dst=0, offset -18000 (-5h) should resolve to a standard timezone (EST)
# When $dst=1, offset -18000 (-5h) should resolve to a DST timezone (CDT)
is(tz_name(-18000, 0), "est", "tz_name(-18000, dst=0) is est");
is(tz_name(-18000, 1), "cdt", "tz_name(-18000, dst=1) is cdt");
# tz_name: offset 0 is always GMT/UTC regardless of DST flag
like(tz_name(0, 0), qr/^(?:gmt|utc)$/i, "tz_name(0, dst=0) is GMT or UTC");
like(tz_name(0, 1), qr/^(?:gmt|utc)$/i, "tz_name(0, dst=1) is GMT or UTC");
# tz_name: offsets with only standard or only DST entries
is(tz_name(32400, 0), "jst", "tz_name(32400, dst=0) is jst (Japan Standard)");
is(tz_name(-25200, 1), "pdt", "tz_name(-25200, dst=1) is pdt (Pacific Daylight)");
is(tz_name(-28800, 0), "pst", "tz_name(-28800, dst=0) is pst (Pacific Standard)");
# tz_name: unknown offset returns correct +HHMM numeric string (RT#59298)
# 5400s = 90 minutes = UTC+1:30 → "+0130" (not "+9000" which the buggy code produced)
is(tz_name(5400, 0), "+0130", "tz_name(5400) returns +0130 (UTC+1:30)");
# Negative fractional-hour offset: -5400s = UTC-1:30 → "-0130"
# (Note: -9000 is now NDT/Newfoundland Daylight, so use -5400 instead)
is(tz_name(-5400, 0), "-0130", "tz_name(-5400) returns -0130 (UTC-1:30)");
# tz_local_offset: returns a sane value
{
my $offset = tz_local_offset();
ok(defined $offset, "tz_local_offset returns defined value");
cmp_ok($offset, '>=', -12 * 3600, "tz_local_offset >= -12 hours");
cmp_ok($offset, '<=', 14 * 3600, "tz_local_offset <= 14 hours");
}
done_testing;