test: add tests for waybar_time formatter
This commit is contained in:
parent
8c41aaae04
commit
766c8a1035
|
@ -6,13 +6,21 @@ test_dep = [
|
||||||
jsoncpp,
|
jsoncpp,
|
||||||
spdlog,
|
spdlog,
|
||||||
]
|
]
|
||||||
|
test_src = files(
|
||||||
waybar_test = executable(
|
|
||||||
'waybar_test',
|
|
||||||
'main.cpp',
|
'main.cpp',
|
||||||
'SafeSignal.cpp',
|
'SafeSignal.cpp',
|
||||||
'config.cpp',
|
'config.cpp',
|
||||||
'../src/config.cpp',
|
'../src/config.cpp',
|
||||||
|
)
|
||||||
|
|
||||||
|
if tz_dep.found()
|
||||||
|
test_dep += tz_dep
|
||||||
|
test_src += files('waybar_time.cpp')
|
||||||
|
endif
|
||||||
|
|
||||||
|
waybar_test = executable(
|
||||||
|
'waybar_test',
|
||||||
|
test_src,
|
||||||
dependencies: test_dep,
|
dependencies: test_dep,
|
||||||
include_directories: test_inc,
|
include_directories: test_inc,
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
#include "util/waybar_time.hpp"
|
||||||
|
|
||||||
|
#include <date/date.h>
|
||||||
|
#include <date/tz.h>
|
||||||
|
|
||||||
|
#include <catch2/catch.hpp>
|
||||||
|
#include <chrono>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
using namespace std::literals::chrono_literals;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check that the date/time formatter with locale and timezone support is working as expected.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const date::zoned_time<std::chrono::seconds> TEST_TIME = date::make_zoned(
|
||||||
|
"UTC", date::local_days{date::Monday[1] / date::January / 2022} + 13h + 4min + 5s);
|
||||||
|
|
||||||
|
TEST_CASE("Format UTC time", "[clock][util]") {
|
||||||
|
waybar::waybar_time tm{std::locale("C"), TEST_TIME};
|
||||||
|
|
||||||
|
REQUIRE(fmt::format("{}", tm).empty()); // no format specified
|
||||||
|
REQUIRE(fmt::format("{:%c %Z}", tm) == "Mon Jan 3 13:04:05 2022 UTC");
|
||||||
|
REQUIRE(fmt::format("{arg:%Y%m%d%H%M%S}", fmt::arg("arg", tm)) == "20220103130405");
|
||||||
|
|
||||||
|
/* Test a few locales that are most likely to be present */
|
||||||
|
SECTION("US locale") {
|
||||||
|
try {
|
||||||
|
tm.locale = std::locale("en_US");
|
||||||
|
|
||||||
|
REQUIRE(fmt::format("{}", tm).empty()); // no format specified
|
||||||
|
REQUIRE_THAT(fmt::format("{:%c}", tm), // HowardHinnant/date#704
|
||||||
|
Catch::Matchers::StartsWith("Mon 03 Jan 2022 01:04:05 PM"));
|
||||||
|
REQUIRE(fmt::format("{:%x %X}", tm) == "01/03/2022 01:04:05 PM");
|
||||||
|
REQUIRE(fmt::format("{arg:%Y%m%d%H%M%S}", fmt::arg("arg", tm)) == "20220103130405");
|
||||||
|
} catch (const std::runtime_error&) {
|
||||||
|
// locale not found; ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SECTION("GB locale") {
|
||||||
|
try {
|
||||||
|
tm.locale = std::locale("en_GB");
|
||||||
|
|
||||||
|
REQUIRE(fmt::format("{}", tm).empty()); // no format specified
|
||||||
|
REQUIRE_THAT(fmt::format("{:%c}", tm), // HowardHinnant/date#704
|
||||||
|
Catch::Matchers::StartsWith("Mon 03 Jan 2022 13:04:05"));
|
||||||
|
REQUIRE(fmt::format("{:%x %X}", tm) == "03/01/22 13:04:05");
|
||||||
|
REQUIRE(fmt::format("{arg:%Y%m%d%H%M%S}", fmt::arg("arg", tm)) == "20220103130405");
|
||||||
|
} catch (const std::runtime_error&) {
|
||||||
|
// locale not found; ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Format zoned time", "[clock][util]") {
|
||||||
|
waybar::waybar_time tm{std::locale("C"), date::make_zoned("America/New_York", TEST_TIME)};
|
||||||
|
|
||||||
|
REQUIRE(fmt::format("{}", tm).empty()); // no format specified
|
||||||
|
REQUIRE(fmt::format("{:%c %Z}", tm) == "Mon Jan 3 08:04:05 2022 EST");
|
||||||
|
REQUIRE(fmt::format("{arg:%Y%m%d%H%M%S}", fmt::arg("arg", tm)) == "20220103080405");
|
||||||
|
|
||||||
|
/* Test a few locales that are most likely to be present */
|
||||||
|
SECTION("US locale") {
|
||||||
|
try {
|
||||||
|
tm.locale = std::locale("en_US");
|
||||||
|
|
||||||
|
REQUIRE(fmt::format("{}", tm).empty()); // no format specified
|
||||||
|
REQUIRE_THAT(fmt::format("{:%c}", tm), // HowardHinnant/date#704
|
||||||
|
Catch::Matchers::StartsWith("Mon 03 Jan 2022 08:04:05 AM"));
|
||||||
|
REQUIRE(fmt::format("{:%x %X}", tm) == "01/03/2022 08:04:05 AM");
|
||||||
|
REQUIRE(fmt::format("{arg:%Y%m%d%H%M%S}", fmt::arg("arg", tm)) == "20220103080405");
|
||||||
|
} catch (const std::runtime_error&) {
|
||||||
|
// locale not found; ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("GB locale") {
|
||||||
|
try {
|
||||||
|
tm.locale = std::locale("en_GB");
|
||||||
|
|
||||||
|
REQUIRE(fmt::format("{}", tm).empty()); // no format specified
|
||||||
|
REQUIRE_THAT(fmt::format("{:%c}", tm), // HowardHinnant/date#704
|
||||||
|
Catch::Matchers::StartsWith("Mon 03 Jan 2022 08:04:05"));
|
||||||
|
REQUIRE(fmt::format("{:%x %X}", tm) == "03/01/22 08:04:05");
|
||||||
|
REQUIRE(fmt::format("{arg:%Y%m%d%H%M%S}", fmt::arg("arg", tm)) == "20220103080405");
|
||||||
|
} catch (const std::runtime_error&) {
|
||||||
|
// locale not found; ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue