diff options
author | Timothy Flynn <trflynn89@pm.me> | 2022-01-24 14:42:51 -0500 |
---|---|---|
committer | Linus Groh <mail@linusgroh.de> | 2022-01-25 18:39:36 +0000 |
commit | b1ea585149ecd9663aae9607c1b1c508cc98aec2 (patch) | |
tree | 05a8bfb05d4f71fc1270a0d5e0cc1cd162e5c31c /Tests | |
parent | 6095500263f20b073c5b603b37337a7589fb89eb (diff) | |
download | serenity-b1ea585149ecd9663aae9607c1b1c508cc98aec2.zip |
LibC: Implement tzset with time zone awareness in accordance with POSIX
Diffstat (limited to 'Tests')
-rw-r--r-- | Tests/LibC/TestLibCTime.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/Tests/LibC/TestLibCTime.cpp b/Tests/LibC/TestLibCTime.cpp index fcf2327639..4fa829e2a2 100644 --- a/Tests/LibC/TestLibCTime.cpp +++ b/Tests/LibC/TestLibCTime.cpp @@ -10,6 +10,25 @@ const auto expected_epoch = "Thu Jan 1 00:00:00 1970\n"sv; +class TimeZoneGuard { +public: + TimeZoneGuard() + : m_tz(getenv("TZ")) + { + } + + ~TimeZoneGuard() + { + if (m_tz) + setenv("TZ", m_tz, 1); + else + unsetenv("TZ"); + } + +private: + char const* m_tz { nullptr }; +}; + TEST_CASE(asctime) { time_t epoch = 0; @@ -41,3 +60,48 @@ TEST_CASE(ctime_r) EXPECT_EQ(expected_epoch, StringView(result)); } + +TEST_CASE(tzset) +{ + TimeZoneGuard guard; + + auto set_tz = [](char const* tz) { + setenv("TZ", tz, 1); + tzset(); + }; + + set_tz("UTC"); + EXPECT_EQ(timezone, 0); + EXPECT_EQ(altzone, 0); + EXPECT_EQ(daylight, 0); + EXPECT_EQ(tzname[0], "UTC"sv); + EXPECT_EQ(tzname[1], "UTC"sv); + + set_tz("America/New_York"); + EXPECT_EQ(timezone, 5 * 60 * 60); + EXPECT_EQ(altzone, 4 * 60 * 60); + EXPECT_EQ(daylight, 1); + EXPECT_EQ(tzname[0], "EST"sv); + EXPECT_EQ(tzname[1], "EDT"sv); + + set_tz("America/Phoenix"); + EXPECT_EQ(timezone, 7 * 60 * 60); + EXPECT_EQ(altzone, 7 * 60 * 60); + EXPECT_EQ(daylight, 0); + EXPECT_EQ(tzname[0], "MST"sv); + EXPECT_EQ(tzname[1], "MST"sv); + + set_tz("America/Asuncion"); + EXPECT_EQ(timezone, 4 * 60 * 60); + EXPECT_EQ(altzone, 3 * 60 * 60); + EXPECT_EQ(daylight, 1); + EXPECT_EQ(tzname[0], "-04"sv); + EXPECT_EQ(tzname[1], "-03"sv); + + set_tz("CET"); + EXPECT_EQ(timezone, -1 * 60 * 60); + EXPECT_EQ(altzone, -2 * 60 * 60); + EXPECT_EQ(daylight, 1); + EXPECT_EQ(tzname[0], "CET"sv); + EXPECT_EQ(tzname[1], "CEST"sv); +} |