// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #include #include "../common/time_utc.h" TEST_CASE("Time_round trip", "[time_UTC][parse_UTC_to_ms]") { // Current time → string → ms → back to string auto now = std::chrono::system_clock::now(); std::string utc = time_UTC(now); uint64_t ms = parse_UTC_to_ms(utc); // Allow small rounding differences due to truncation auto back_tp = std::chrono::system_clock::time_point(std::chrono::milliseconds(ms)); auto diff = duration_cast(now - back_tp).count(); INFO("UTC: " << utc); CHECK(std::abs(diff) < 2); // within 2ms round-trip tolerance } TEST_CASE("Time_parse_UTC_to_ms", "[parse_UTC_to_ms]") { uint64_t ms = parse_UTC_to_ms("1970-01-01T00:00:00.000Z"); CHECK(ms == 0); ms = parse_UTC_to_ms("1970-01-01T00:00:00.001Z"); CHECK(ms == 1); ms = parse_UTC_to_ms("1970-01-01T00:00:00.530Z"); CHECK(ms == 530); ms = parse_UTC_to_ms("1970-01-01T00:00:01.000Z"); CHECK(ms == 1000); ms = parse_UTC_to_ms("1972-01-01T00:00:00.006Z"); CHECK(ms == 2 * 365 * 24 * 60 * 60 * 1000UL + 6); ms = parse_UTC_to_ms("2025-11-01T14:32:15.123Z"); CHECK(ms > 0); } TEST_CASE("Time_to_UTC", "[time_UTC]") { using namespace std::chrono; auto tp = system_clock::time_point(milliseconds(0)); std::string s = time_UTC(tp); CHECK(s == "1970-01-01T00:00:00.000Z"); // Regex to validate ISO format std::regex iso(R"(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$)"); CHECK(std::regex_match(s, iso)); }