test: add tests for waybar_time formatter
This commit is contained in:
		
							parent
							
								
									8c41aaae04
								
							
						
					
					
						commit
						766c8a1035
					
				|  | @ -6,13 +6,21 @@ test_dep = [ | |||
|     jsoncpp, | ||||
|     spdlog, | ||||
| ] | ||||
| 
 | ||||
| waybar_test = executable( | ||||
|     'waybar_test', | ||||
| test_src = files( | ||||
|     'main.cpp', | ||||
|     'SafeSignal.cpp', | ||||
|     '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, | ||||
|     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