| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1 |
// Formatting library for C++ - time formatting tests |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
2 |
// |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
3 |
// Copyright (c) 2012 - present, Victor Zverovich |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
4 |
// All rights reserved. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
5 |
// |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
6 |
// For the license information refer to format.h. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
7 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
8 |
#include "fmt/chrono.h" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
9 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
10 |
#include <algorithm> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
11 |
#include <ctime> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
12 |
#include <vector> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
13 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
14 |
#include "gtest-extra.h" // EXPECT_THROW_MSG |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
15 |
#include "util.h" // get_locale |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
16 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
17 |
using fmt::runtime; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
18 |
using testing::Contains; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
19 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
20 |
template <typename Duration> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
21 |
using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
22 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
23 |
#if defined(__MINGW32__) && !defined(_UCRT) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
24 |
// Only C89 conversion specifiers when using MSVCRT instead of UCRT |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
25 |
# define FMT_HAS_C99_STRFTIME 0 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
26 |
#else |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
27 |
# define FMT_HAS_C99_STRFTIME 1 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
28 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
29 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
30 |
#if defined(__cpp_lib_chrono) && __cpp_lib_chrono >= 201907L |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
31 |
using days = std::chrono::days; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
32 |
#else |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
33 |
using days = std::chrono::duration<std::chrono::hours::rep, std::ratio<86400>>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
34 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
35 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
36 |
auto make_tm() -> std::tm { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
37 |
auto time = std::tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
38 |
time.tm_mday = 1; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
39 |
return time; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
40 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
41 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
42 |
auto make_hour(int h) -> std::tm { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
43 |
auto time = make_tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
44 |
time.tm_hour = h; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
45 |
return time; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
46 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
47 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
48 |
auto make_minute(int m) -> std::tm { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
49 |
auto time = make_tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
50 |
time.tm_min = m; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
51 |
return time; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
52 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
53 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
54 |
auto make_second(int s) -> std::tm { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
55 |
auto time = make_tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
56 |
time.tm_sec = s; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
57 |
return time; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
58 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
59 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
60 |
std::string system_strftime(const std::string& format, const std::tm* timeptr, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
61 |
std::locale* locptr = nullptr) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
62 |
auto loc = locptr ? *locptr : std::locale::classic(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
63 |
auto& facet = std::use_facet<std::time_put<char>>(loc); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
64 |
std::ostringstream os; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
65 |
os.imbue(loc); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
66 |
facet.put(os, os, ' ', timeptr, format.c_str(), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
67 |
format.c_str() + format.size()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
68 |
#ifdef _WIN32 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
69 |
// Workaround a bug in older versions of Universal CRT. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
70 |
auto str = os.str(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
71 |
if (str == "-0000") str = "+0000"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
72 |
return str; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
73 |
#else |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
74 |
return os.str(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
75 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
76 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
77 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
78 |
FMT_CONSTEXPR std::tm make_tm(int year, int mon, int mday, int hour, int min, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
79 |
int sec) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
80 |
auto tm = std::tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
81 |
tm.tm_sec = sec; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
82 |
tm.tm_min = min; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
83 |
tm.tm_hour = hour; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
84 |
tm.tm_mday = mday; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
85 |
tm.tm_mon = mon - 1; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
86 |
tm.tm_year = year - 1900; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
87 |
return tm; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
88 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
89 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
90 |
TEST(chrono_test, format_tm) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
91 |
auto tm = std::tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
92 |
tm.tm_year = 116; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
93 |
tm.tm_mon = 3; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
94 |
tm.tm_mday = 25; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
95 |
tm.tm_hour = 11; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
96 |
tm.tm_min = 22; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
97 |
tm.tm_sec = 33; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
98 |
EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
99 |
"The date is 2016-04-25 11:22:33."); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
100 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "2016"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
101 |
EXPECT_EQ(fmt::format("{:%C}", tm), "20"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
102 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
103 |
EXPECT_EQ(fmt::format("{:%e}", tm), "25"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
104 |
EXPECT_EQ(fmt::format("{:%D}", tm), "04/25/16"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
105 |
EXPECT_EQ(fmt::format("{:%F}", tm), "2016-04-25"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
106 |
EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
107 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
108 |
// Short year |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
109 |
tm.tm_year = 999 - 1900; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
110 |
tm.tm_mon = 0; // for %G |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
111 |
tm.tm_mday = 2; // for %G |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
112 |
tm.tm_wday = 3; // for %G |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
113 |
tm.tm_yday = 1; // for %G |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
114 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "0999"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
115 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), "0999"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
116 |
EXPECT_EQ(fmt::format("{:%G}", tm), "0999"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
117 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
118 |
tm.tm_year = 27 - 1900; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
119 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "0027"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
120 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), "0027"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
121 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
122 |
// Overflow year |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
123 |
tm.tm_year = 2147483647; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
124 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "2147485547"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
125 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
126 |
tm.tm_year = -2147483648; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
127 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "-2147481748"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
128 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
129 |
// for week on the year |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
130 |
// https://www.cl.cam.ac.uk/~mgk25/iso-time.html |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
131 |
std::vector<std::tm> tm_list = { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
132 |
make_tm(1975, 12, 29, 12, 14, 16), // W01 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
133 |
make_tm(1977, 1, 2, 12, 14, 16), // W53 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
134 |
make_tm(1999, 12, 27, 12, 14, 16), // W52 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
135 |
make_tm(1999, 12, 31, 12, 14, 16), // W52 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
136 |
make_tm(2000, 1, 1, 12, 14, 16), // W52 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
137 |
make_tm(2000, 1, 2, 12, 14, 16), // W52 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
138 |
make_tm(2000, 1, 3, 12, 14, 16) // W1 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
139 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
140 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
141 |
#if !FMT_HAS_C99_STRFTIME |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
142 |
GTEST_SKIP() << "Skip the rest of this test because it relies on strftime() " |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
143 |
"conforming to C99, but on this platform, MINGW + MSVCRT, " |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
144 |
"the function conforms only to C89."; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
145 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
146 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
147 |
const std::string iso_week_spec = "%Y-%m-%d: %G %g %V"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
148 |
for (auto ctm : tm_list) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
149 |
// Calculate tm_yday, tm_wday, etc. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
150 |
std::time_t t = std::mktime(&ctm); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
151 |
tm = *std::localtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
152 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
153 |
auto fmt_spec = fmt::format("{{:{}}}", iso_week_spec); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
154 |
EXPECT_EQ(system_strftime(iso_week_spec, &tm), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
155 |
fmt::format(fmt::runtime(fmt_spec), tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
156 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
157 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
158 |
// Every day from 1970-01-01 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
159 |
std::time_t time_now = std::time(nullptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
160 |
for (std::time_t t = 6 * 3600; t < time_now; t += 86400) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
161 |
tm = *std::localtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
162 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
163 |
auto fmt_spec = fmt::format("{{:{}}}", iso_week_spec); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
164 |
EXPECT_EQ(system_strftime(iso_week_spec, &tm), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
165 |
fmt::format(fmt::runtime(fmt_spec), tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
166 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
167 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
168 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
169 |
// MSVC: |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
170 |
// minkernel\crts\ucrt\src\appcrt\time\wcsftime.cpp(971) : Assertion failed: |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
171 |
// timeptr->tm_year >= -1900 && timeptr->tm_year <= 8099 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
172 |
#ifndef _WIN32 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
173 |
TEST(chrono_test, format_tm_future) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
174 |
auto tm = std::tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
175 |
tm.tm_year = 10445; // 10000+ years |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
176 |
tm.tm_mon = 3; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
177 |
tm.tm_mday = 25; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
178 |
tm.tm_hour = 11; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
179 |
tm.tm_min = 22; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
180 |
tm.tm_sec = 33; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
181 |
EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
182 |
"The date is 12345-04-25 11:22:33."); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
183 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "12345"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
184 |
EXPECT_EQ(fmt::format("{:%C}", tm), "123"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
185 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
186 |
EXPECT_EQ(fmt::format("{:%D}", tm), "04/25/45"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
187 |
EXPECT_EQ(fmt::format("{:%F}", tm), "12345-04-25"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
188 |
EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
189 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
190 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
191 |
TEST(chrono_test, format_tm_past) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
192 |
auto tm = std::tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
193 |
tm.tm_year = -2001; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
194 |
tm.tm_mon = 3; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
195 |
tm.tm_mday = 25; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
196 |
tm.tm_hour = 11; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
197 |
tm.tm_min = 22; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
198 |
tm.tm_sec = 33; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
199 |
EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
200 |
"The date is -101-04-25 11:22:33."); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
201 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "-101"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
202 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
203 |
// macOS %C - "-1" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
204 |
// Linux %C - "-2" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
205 |
// fmt %C - "-1" |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
206 |
EXPECT_EQ(fmt::format("{:%C}", tm), "-1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
207 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
208 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
209 |
// macOS %D - "04/25/01" (%y) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
210 |
// Linux %D - "04/25/99" (%y) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
211 |
// fmt %D - "04/25/01" (%y) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
212 |
EXPECT_EQ(fmt::format("{:%D}", tm), "04/25/01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
213 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
214 |
EXPECT_EQ(fmt::format("{:%F}", tm), "-101-04-25"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
215 |
EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
216 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
217 |
tm.tm_year = -1901; // -1 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
218 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "-001"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
219 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
220 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
221 |
tm.tm_year = -1911; // -11 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
222 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "-011"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
223 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
224 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
225 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
226 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
227 |
TEST(chrono_test, grow_buffer) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
228 |
auto s = std::string("{:"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
229 |
for (int i = 0; i < 30; ++i) s += "%c"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
230 |
s += "}\n"; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
231 |
auto t = std::time(nullptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
232 |
(void)fmt::format(fmt::runtime(s), *std::localtime(&t)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
233 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
234 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
235 |
TEST(chrono_test, format_to_empty_container) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
236 |
auto time = std::tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
237 |
time.tm_sec = 42; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
238 |
auto s = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
239 |
fmt::format_to(std::back_inserter(s), "{:%S}", time); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
240 |
EXPECT_EQ(s, "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
241 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
242 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
243 |
TEST(chrono_test, empty_result) { EXPECT_EQ(fmt::format("{}", std::tm()), ""); } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
244 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
245 |
auto equal(const std::tm& lhs, const std::tm& rhs) -> bool { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
246 |
return lhs.tm_sec == rhs.tm_sec && lhs.tm_min == rhs.tm_min && |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
247 |
lhs.tm_hour == rhs.tm_hour && lhs.tm_mday == rhs.tm_mday && |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
248 |
lhs.tm_mon == rhs.tm_mon && lhs.tm_year == rhs.tm_year && |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
249 |
lhs.tm_wday == rhs.tm_wday && lhs.tm_yday == rhs.tm_yday && |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
250 |
lhs.tm_isdst == rhs.tm_isdst; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
251 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
252 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
253 |
TEST(chrono_test, gmtime) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
254 |
auto t = std::time(nullptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
255 |
auto tm = *std::gmtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
256 |
EXPECT_TRUE(equal(tm, fmt::gmtime(t))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
257 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
258 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
259 |
template <typename TimePoint> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
260 |
auto strftime_full_utc(TimePoint tp) -> std::string { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
261 |
auto t = std::chrono::system_clock::to_time_t(tp); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
262 |
auto tm = *std::gmtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
263 |
return system_strftime("%Y-%m-%d %H:%M:%S", &tm); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
264 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
265 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
266 |
TEST(chrono_test, system_clock_time_point) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
267 |
auto t1 = std::chrono::time_point_cast<std::chrono::seconds>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
268 |
std::chrono::system_clock::now()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
269 |
EXPECT_EQ(strftime_full_utc(t1), fmt::format("{:%Y-%m-%d %H:%M:%S}", t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
270 |
EXPECT_EQ(strftime_full_utc(t1), fmt::format("{}", t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
271 |
EXPECT_EQ(strftime_full_utc(t1), fmt::format("{:}", t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
272 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
273 |
auto t2 = sys_time<std::chrono::seconds>(std::chrono::seconds(42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
274 |
EXPECT_EQ(strftime_full_utc(t2), fmt::format("{:%Y-%m-%d %H:%M:%S}", t2)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
275 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
276 |
std::vector<std::string> spec_list = { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
277 |
"%%", "%n", "%t", "%Y", "%EY", "%y", "%Oy", "%Ey", "%C", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
278 |
"%EC", "%G", "%g", "%b", "%h", "%B", "%m", "%Om", "%U", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
279 |
"%OU", "%W", "%OW", "%V", "%OV", "%j", "%d", "%Od", "%e", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
280 |
"%Oe", "%a", "%A", "%w", "%Ow", "%u", "%Ou", "%H", "%OH", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
281 |
"%I", "%OI", "%M", "%OM", "%S", "%OS", "%x", "%Ex", "%X", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
282 |
"%EX", "%D", "%F", "%R", "%T", "%p"}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
283 |
#ifndef _WIN32 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
284 |
// Disabled on Windows because these formats are not consistent among |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
285 |
// platforms. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
286 |
spec_list.insert(spec_list.end(), {"%c", "%Ec", "%r"}); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
287 |
#elif !FMT_HAS_C99_STRFTIME |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
288 |
// Only C89 conversion specifiers when using MSVCRT instead of UCRT |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
289 |
spec_list = {"%%", "%Y", "%y", "%b", "%B", "%m", "%U", "%W", "%j", "%d", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
290 |
"%a", "%A", "%w", "%H", "%I", "%M", "%S", "%x", "%X", "%p"}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
291 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
292 |
spec_list.push_back("%Y-%m-%d %H:%M:%S"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
293 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
294 |
for (const auto& spec : spec_list) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
295 |
auto t = std::chrono::system_clock::to_time_t(t1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
296 |
auto tm = *std::gmtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
297 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
298 |
auto sys_output = system_strftime(spec, &tm); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
299 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
300 |
auto fmt_spec = fmt::format("{{:{}}}", spec); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
301 |
EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
302 |
EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
303 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
304 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
305 |
// Timezone formatters tests makes sense for localtime. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
306 |
#if FMT_HAS_C99_STRFTIME |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
307 |
spec_list = {"%z", "%Z"}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
308 |
#else |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
309 |
spec_list = {"%Z"}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
310 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
311 |
for (const auto& spec : spec_list) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
312 |
auto t = std::chrono::system_clock::to_time_t(t1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
313 |
auto tm = *std::localtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
314 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
315 |
auto sys_output = system_strftime(spec, &tm); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
316 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
317 |
auto fmt_spec = fmt::format("{{:{}}}", spec); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
318 |
EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
319 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
320 |
if (spec == "%z") { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
321 |
sys_output.insert(sys_output.end() - 2, 1, ':'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
322 |
EXPECT_EQ(sys_output, fmt::format("{:%Ez}", tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
323 |
EXPECT_EQ(sys_output, fmt::format("{:%Oz}", tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
324 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
325 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
326 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
327 |
// Separate tests for UTC, since std::time_put can use local time and ignoring |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
328 |
// the timezone in std::tm (if it presents on platform). |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
329 |
if (fmt::detail::has_member_data_tm_zone<std::tm>::value) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
330 |
auto t = std::chrono::system_clock::to_time_t(t1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
331 |
auto tm = *std::gmtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
332 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
333 |
std::vector<std::string> tz_names = {"GMT", "UTC"}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
334 |
EXPECT_THAT(tz_names, Contains(fmt::format("{:%Z}", t1))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
335 |
EXPECT_THAT(tz_names, Contains(fmt::format("{:%Z}", tm))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
336 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
337 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
338 |
if (fmt::detail::has_member_data_tm_gmtoff<std::tm>::value) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
339 |
auto t = std::chrono::system_clock::to_time_t(t1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
340 |
auto tm = *std::gmtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
341 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
342 |
EXPECT_EQ(fmt::format("{:%z}", t1), "+0000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
343 |
EXPECT_EQ(fmt::format("{:%z}", tm), "+0000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
344 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
345 |
EXPECT_EQ(fmt::format("{:%Ez}", t1), "+00:00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
346 |
EXPECT_EQ(fmt::format("{:%Ez}", tm), "+00:00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
347 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
348 |
EXPECT_EQ(fmt::format("{:%Oz}", t1), "+00:00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
349 |
EXPECT_EQ(fmt::format("{:%Oz}", tm), "+00:00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
350 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
351 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
352 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
353 |
#if FMT_USE_LOCAL_TIME |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
354 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
355 |
TEST(chrono_test, localtime) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
356 |
auto t = std::time(nullptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
357 |
auto tm = *std::localtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
358 |
EXPECT_TRUE(equal(tm, fmt::localtime(t))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
359 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
360 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
361 |
template <typename Duration> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
362 |
auto strftime_full_local(std::chrono::local_time<Duration> tp) -> std::string { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
363 |
auto t = std::chrono::system_clock::to_time_t( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
364 |
std::chrono::current_zone()->to_sys(tp)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
365 |
auto tm = *std::localtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
366 |
return system_strftime("%Y-%m-%d %H:%M:%S", &tm); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
367 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
368 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
369 |
TEST(chrono_test, local_system_clock_time_point) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
370 |
# ifdef _WIN32 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
371 |
return; // Not supported on Windows. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
372 |
# endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
373 |
auto t1 = std::chrono::time_point_cast<std::chrono::seconds>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
374 |
std::chrono::current_zone()->to_local(std::chrono::system_clock::now())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
375 |
EXPECT_EQ(strftime_full_local(t1), fmt::format("{:%Y-%m-%d %H:%M:%S}", t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
376 |
EXPECT_EQ(strftime_full_local(t1), fmt::format("{}", t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
377 |
EXPECT_EQ(strftime_full_local(t1), fmt::format("{:}", t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
378 |
using time_point = std::chrono::local_time<std::chrono::seconds>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
379 |
auto t2 = time_point(std::chrono::seconds(86400 + 42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
380 |
EXPECT_EQ(strftime_full_local(t2), fmt::format("{:%Y-%m-%d %H:%M:%S}", t2)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
381 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
382 |
std::vector<std::string> spec_list = { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
383 |
"%%", "%n", "%t", "%Y", "%EY", "%y", "%Oy", "%Ey", "%C", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
384 |
"%EC", "%G", "%g", "%b", "%h", "%B", "%m", "%Om", "%U", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
385 |
"%OU", "%W", "%OW", "%V", "%OV", "%j", "%d", "%Od", "%e", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
386 |
"%Oe", "%a", "%A", "%w", "%Ow", "%u", "%Ou", "%H", "%OH", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
387 |
"%I", "%OI", "%M", "%OM", "%S", "%OS", "%x", "%Ex", "%X", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
388 |
"%EX", "%D", "%F", "%R", "%T", "%p", "%z", "%Z"}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
389 |
# ifndef _WIN32 |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
390 |
// Disabled on Windows because these formats are not consistent among |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
391 |
// platforms. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
392 |
spec_list.insert(spec_list.end(), {"%c", "%Ec", "%r"}); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
393 |
# elif !FMT_HAS_C99_STRFTIME |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
394 |
// Only C89 conversion specifiers when using MSVCRT instead of UCRT |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
395 |
spec_list = {"%%", "%Y", "%y", "%b", "%B", "%m", "%U", "%W", "%j", "%d", "%a", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
396 |
"%A", "%w", "%H", "%I", "%M", "%S", "%x", "%X", "%p", "%Z"}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
397 |
# endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
398 |
spec_list.push_back("%Y-%m-%d %H:%M:%S"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
399 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
400 |
for (const auto& spec : spec_list) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
401 |
auto t = std::chrono::system_clock::to_time_t( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
402 |
std::chrono::current_zone()->to_sys(t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
403 |
auto tm = *std::localtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
404 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
405 |
auto sys_output = system_strftime(spec, &tm); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
406 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
407 |
auto fmt_spec = fmt::format("{{:{}}}", spec); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
408 |
EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
409 |
EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
410 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
411 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
412 |
if (std::find(spec_list.cbegin(), spec_list.cend(), "%z") != |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
413 |
spec_list.cend()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
414 |
auto t = std::chrono::system_clock::to_time_t( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
415 |
std::chrono::current_zone()->to_sys(t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
416 |
auto tm = *std::localtime(&t); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
417 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
418 |
auto sys_output = system_strftime("%z", &tm); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
419 |
sys_output.insert(sys_output.end() - 2, 1, ':'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
420 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
421 |
EXPECT_EQ(sys_output, fmt::format("{:%Ez}", t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
422 |
EXPECT_EQ(sys_output, fmt::format("{:%Ez}", tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
423 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
424 |
EXPECT_EQ(sys_output, fmt::format("{:%Oz}", t1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
425 |
EXPECT_EQ(sys_output, fmt::format("{:%Oz}", tm)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
426 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
427 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
428 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
429 |
#endif // FMT_USE_LOCAL_TIME |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
430 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
431 |
#ifndef FMT_STATIC_THOUSANDS_SEPARATOR |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
432 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
433 |
TEST(chrono_test, format_default) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
434 |
EXPECT_EQ(fmt::format("{}", std::chrono::seconds(42)), "42s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
435 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::atto>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
436 |
"42as"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
437 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::femto>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
438 |
"42fs"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
439 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::pico>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
440 |
"42ps"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
441 |
EXPECT_EQ(fmt::format("{}", std::chrono::nanoseconds(42)), "42ns"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
442 |
EXPECT_EQ(fmt::format("{}", std::chrono::microseconds(42)), "42µs"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
443 |
EXPECT_EQ(fmt::format("{}", std::chrono::milliseconds(42)), "42ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
444 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::centi>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
445 |
"42cs"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
446 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::deci>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
447 |
"42ds"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
448 |
EXPECT_EQ(fmt::format("{}", std::chrono::seconds(42)), "42s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
449 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::deca>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
450 |
"42das"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
451 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::hecto>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
452 |
"42hs"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
453 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::kilo>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
454 |
"42ks"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
455 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::mega>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
456 |
"42Ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
457 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::giga>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
458 |
"42Gs"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
459 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::tera>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
460 |
"42Ts"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
461 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::peta>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
462 |
"42Ps"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
463 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::exa>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
464 |
"42Es"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
465 |
EXPECT_EQ(fmt::format("{}", std::chrono::minutes(42)), "42min"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
466 |
EXPECT_EQ(fmt::format("{}", std::chrono::hours(42)), "42h"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
467 |
EXPECT_EQ(fmt::format("{}", days(42)), "42d"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
468 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
469 |
fmt::format("{}", std::chrono::duration<int, std::ratio<15, 1>>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
470 |
"42[15]s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
471 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
472 |
fmt::format("{}", std::chrono::duration<int, std::ratio<15, 4>>(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
473 |
"42[15/4]s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
474 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
475 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
476 |
TEST(chrono_test, duration_align) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
477 |
auto s = std::chrono::seconds(42); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
478 |
EXPECT_EQ(fmt::format("{:5}", s), "42s "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
479 |
EXPECT_EQ(fmt::format("{:{}}", s, 5), "42s "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
480 |
EXPECT_EQ(fmt::format("{:>5}", s), " 42s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
481 |
EXPECT_EQ(fmt::format("{:*^7}", s), "**42s**"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
482 |
EXPECT_EQ(fmt::format("{:12%H:%M:%S}", std::chrono::seconds(12345)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
483 |
"03:25:45 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
484 |
EXPECT_EQ(fmt::format("{:>12%H:%M:%S}", std::chrono::seconds(12345)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
485 |
" 03:25:45"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
486 |
EXPECT_EQ(fmt::format("{:~^12%H:%M:%S}", std::chrono::seconds(12345)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
487 |
"~~03:25:45~~"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
488 |
EXPECT_EQ(fmt::format("{:{}%H:%M:%S}", std::chrono::seconds(12345), 12), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
489 |
"03:25:45 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
490 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
491 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
492 |
TEST(chrono_test, tm_align) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
493 |
auto t = make_tm(1975, 12, 29, 12, 14, 16); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
494 |
EXPECT_EQ(fmt::format("{:%F %T}", t), "1975-12-29 12:14:16"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
495 |
EXPECT_EQ(fmt::format("{:30%F %T}", t), "1975-12-29 12:14:16 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
496 |
EXPECT_EQ(fmt::format("{:{}%F %T}", t, 30), "1975-12-29 12:14:16 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
497 |
EXPECT_EQ(fmt::format("{:<30%F %T}", t), "1975-12-29 12:14:16 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
498 |
EXPECT_EQ(fmt::format("{:^30%F %T}", t), " 1975-12-29 12:14:16 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
499 |
EXPECT_EQ(fmt::format("{:>30%F %T}", t), " 1975-12-29 12:14:16"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
500 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
501 |
EXPECT_EQ(fmt::format("{:*<30%F %T}", t), "1975-12-29 12:14:16***********"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
502 |
EXPECT_EQ(fmt::format("{:*^30%F %T}", t), "*****1975-12-29 12:14:16******"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
503 |
EXPECT_EQ(fmt::format("{:*>30%F %T}", t), "***********1975-12-29 12:14:16"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
504 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
505 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
506 |
TEST(chrono_test, tp_align) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
507 |
auto tp = std::chrono::time_point_cast<std::chrono::microseconds>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
508 |
std::chrono::system_clock::from_time_t(0)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
509 |
EXPECT_EQ(fmt::format("{:%M:%S}", tp), "00:00.000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
510 |
EXPECT_EQ(fmt::format("{:15%M:%S}", tp), "00:00.000000 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
511 |
EXPECT_EQ(fmt::format("{:{}%M:%S}", tp, 15), "00:00.000000 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
512 |
EXPECT_EQ(fmt::format("{:<15%M:%S}", tp), "00:00.000000 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
513 |
EXPECT_EQ(fmt::format("{:^15%M:%S}", tp), " 00:00.000000 "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
514 |
EXPECT_EQ(fmt::format("{:>15%M:%S}", tp), " 00:00.000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
515 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
516 |
EXPECT_EQ(fmt::format("{:*<15%M:%S}", tp), "00:00.000000***"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
517 |
EXPECT_EQ(fmt::format("{:*^15%M:%S}", tp), "*00:00.000000**"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
518 |
EXPECT_EQ(fmt::format("{:*>15%M:%S}", tp), "***00:00.000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
519 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
520 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
521 |
TEST(chrono_test, format_specs) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
522 |
EXPECT_EQ(fmt::format("{:%%}", std::chrono::seconds(0)), "%"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
523 |
EXPECT_EQ(fmt::format("{:%n}", std::chrono::seconds(0)), "\n"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
524 |
EXPECT_EQ(fmt::format("{:%t}", std::chrono::seconds(0)), "\t"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
525 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::seconds(0)), "00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
526 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::seconds(60)), "00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
527 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::seconds(42)), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
528 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::milliseconds(1234)), "01.234"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
529 |
EXPECT_EQ(fmt::format("{:%M}", std::chrono::minutes(0)), "00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
530 |
EXPECT_EQ(fmt::format("{:%M}", std::chrono::minutes(60)), "00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
531 |
EXPECT_EQ(fmt::format("{:%M}", std::chrono::minutes(42)), "42"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
532 |
EXPECT_EQ(fmt::format("{:%M}", std::chrono::seconds(61)), "01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
533 |
EXPECT_EQ(fmt::format("{:%H}", std::chrono::hours(0)), "00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
534 |
EXPECT_EQ(fmt::format("{:%H}", std::chrono::hours(24)), "00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
535 |
EXPECT_EQ(fmt::format("{:%H}", std::chrono::hours(14)), "14"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
536 |
EXPECT_EQ(fmt::format("{:%H}", std::chrono::minutes(61)), "01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
537 |
EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(0)), "12"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
538 |
EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(12)), "12"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
539 |
EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(24)), "12"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
540 |
EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(4)), "04"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
541 |
EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(14)), "02"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
542 |
EXPECT_EQ(fmt::format("{:%j}", days(12345)), "12345"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
543 |
EXPECT_EQ(fmt::format("{:%j}", std::chrono::hours(12345 * 24 + 12)), "12345"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
544 |
EXPECT_EQ(fmt::format("{:%H:%M:%S}", std::chrono::seconds(12345)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
545 |
"03:25:45"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
546 |
EXPECT_EQ(fmt::format("{:%R}", std::chrono::seconds(12345)), "03:25"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
547 |
EXPECT_EQ(fmt::format("{:%T}", std::chrono::seconds(12345)), "03:25:45"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
548 |
EXPECT_EQ(fmt::format("{:%Q}", std::chrono::seconds(12345)), "12345"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
549 |
EXPECT_EQ(fmt::format("{:%q}", std::chrono::seconds(12345)), "s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
550 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
551 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
552 |
TEST(chrono_test, invalid_specs) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
553 |
auto sec = std::chrono::seconds(0); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
554 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%a}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
555 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
556 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%A}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
557 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
558 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%c}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
559 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
560 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%x}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
561 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
562 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Ex}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
563 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
564 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%X}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
565 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
566 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%EX}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
567 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
568 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%D}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
569 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
570 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%F}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
571 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
572 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Ec}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
573 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
574 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%w}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
575 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
576 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%u}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
577 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
578 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%b}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
579 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
580 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%B}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
581 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
582 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%z}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
583 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
584 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Z}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
585 |
"no date"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
586 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Eq}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
587 |
"invalid format"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
588 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Oq}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
589 |
"invalid format"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
590 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:abc}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
591 |
"invalid format"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
592 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:.2f}"), sec), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
593 |
"invalid format"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
594 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
595 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
596 |
auto format_tm(const std::tm& time, fmt::string_view spec, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
597 |
const std::locale& loc) -> std::string { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
598 |
auto& facet = std::use_facet<std::time_put<char>>(loc); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
599 |
std::ostringstream os; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
600 |
os.imbue(loc); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
601 |
facet.put(os, os, ' ', &time, spec.begin(), spec.end()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
602 |
return os.str(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
603 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
604 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
605 |
TEST(chrono_test, locale) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
606 |
auto loc = get_locale("ja_JP.utf8"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
607 |
if (loc == std::locale::classic()) return; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
608 |
# define EXPECT_TIME(spec, time, duration) \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
609 |
{ \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
610 |
auto jp_loc = std::locale("ja_JP.utf8"); \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
611 |
EXPECT_EQ(format_tm(time, spec, jp_loc), \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
612 |
fmt::format(jp_loc, "{:L" spec "}", duration)); \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
613 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
614 |
EXPECT_TIME("%OH", make_hour(14), std::chrono::hours(14)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
615 |
EXPECT_TIME("%OI", make_hour(14), std::chrono::hours(14)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
616 |
EXPECT_TIME("%OM", make_minute(42), std::chrono::minutes(42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
617 |
EXPECT_TIME("%OS", make_second(42), std::chrono::seconds(42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
618 |
auto time = make_tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
619 |
time.tm_hour = 3; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
620 |
time.tm_min = 25; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
621 |
time.tm_sec = 45; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
622 |
auto sec = std::chrono::seconds(12345); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
623 |
EXPECT_TIME("%r", time, sec); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
624 |
EXPECT_TIME("%p", time, sec); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
625 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
626 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
627 |
using dms = std::chrono::duration<double, std::milli>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
628 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
629 |
TEST(chrono_test, format_default_fp) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
630 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<float>(1.234)), "1.234s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
631 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<float, std::milli>(1.234)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
632 |
"1.234ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
633 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<double>(1.234)), "1.234s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
634 |
EXPECT_EQ(fmt::format("{}", dms(1.234)), "1.234ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
635 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
636 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
637 |
TEST(chrono_test, format_precision) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
638 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
639 |
(void)fmt::format(runtime("{:.2%Q}"), std::chrono::seconds(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
640 |
fmt::format_error, "precision not allowed for this argument type"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
641 |
EXPECT_EQ(fmt::format("{:.0}", dms(1.234)), "1ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
642 |
EXPECT_EQ(fmt::format("{:.1}", dms(1.234)), "1.2ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
643 |
EXPECT_EQ(fmt::format("{:.{}}", dms(1.234), 2), "1.23ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
644 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
645 |
EXPECT_EQ(fmt::format("{:.0}", dms(12.56)), "13ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
646 |
EXPECT_EQ(fmt::format("{:.1}", dms(12.56)), "12.6ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
647 |
EXPECT_EQ(fmt::format("{:.2}", dms(12.56)), "12.56ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
648 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
649 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
650 |
TEST(chrono_test, format_full_specs) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
651 |
EXPECT_EQ(fmt::format("{:6.0}", dms(1.234)), "1ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
652 |
EXPECT_EQ(fmt::format("{:6.1}", dms(1.234)), "1.2ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
653 |
EXPECT_EQ(fmt::format("{:>8.{}}", dms(1.234), 2), " 1.23ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
654 |
EXPECT_EQ(fmt::format("{:^{}.{}}", dms(1.234), 7, 1), " 1.2ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
655 |
EXPECT_EQ(fmt::format("{0:^{2}.{1}}", dms(1.234), 2, 8), " 1.23ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
656 |
EXPECT_EQ(fmt::format("{:=^{}.{}}", dms(1.234), 9, 3), "=1.234ms="); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
657 |
EXPECT_EQ(fmt::format("{:*^10.4}", dms(1.234)), "*1.2340ms*"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
658 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
659 |
EXPECT_EQ(fmt::format("{:6.0}", dms(12.56)), "13ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
660 |
EXPECT_EQ(fmt::format("{:>8.{}}", dms(12.56), 0), " 13ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
661 |
EXPECT_EQ(fmt::format("{:^{}.{}}", dms(12.56), 6, 0), " 13ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
662 |
EXPECT_EQ(fmt::format("{0:^{2}.{1}}", dms(12.56), 0, 8), " 13ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
663 |
EXPECT_EQ(fmt::format("{:=^{}.{}}", dms(12.56), 9, 0), "==13ms==="); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
664 |
EXPECT_EQ(fmt::format("{:*^10.0}", dms(12.56)), "***13ms***"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
665 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
666 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
667 |
TEST(chrono_test, format_simple_q) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
668 |
EXPECT_EQ(fmt::format("{:%Q %q}", std::chrono::duration<float>(1.234)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
669 |
"1.234 s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
670 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
671 |
fmt::format("{:%Q %q}", std::chrono::duration<float, std::milli>(1.234)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
672 |
"1.234 ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
673 |
EXPECT_EQ(fmt::format("{:%Q %q}", std::chrono::duration<double>(1.234)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
674 |
"1.234 s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
675 |
EXPECT_EQ(fmt::format("{:%Q %q}", dms(1.234)), "1.234 ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
676 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
677 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
678 |
TEST(chrono_test, format_precision_q) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
679 |
EXPECT_THROW_MSG( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
680 |
(void)fmt::format(runtime("{:.2%Q %q}"), std::chrono::seconds(42)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
681 |
fmt::format_error, "precision not allowed for this argument type"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
682 |
EXPECT_EQ(fmt::format("{:.1%Q %q}", dms(1.234)), "1.2 ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
683 |
EXPECT_EQ(fmt::format("{:.{}%Q %q}", dms(1.234), 2), "1.23 ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
684 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
685 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
686 |
TEST(chrono_test, format_full_specs_q) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
687 |
EXPECT_EQ(fmt::format("{:7.0%Q %q}", dms(1.234)), "1 ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
688 |
EXPECT_EQ(fmt::format("{:7.1%Q %q}", dms(1.234)), "1.2 ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
689 |
EXPECT_EQ(fmt::format("{:>8.{}%Q %q}", dms(1.234), 2), " 1.23 ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
690 |
EXPECT_EQ(fmt::format("{:^{}.{}%Q %q}", dms(1.234), 8, 1), " 1.2 ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
691 |
EXPECT_EQ(fmt::format("{0:^{2}.{1}%Q %q}", dms(1.234), 2, 9), " 1.23 ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
692 |
EXPECT_EQ(fmt::format("{:=^{}.{}%Q %q}", dms(1.234), 10, 3), "=1.234 ms="); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
693 |
EXPECT_EQ(fmt::format("{:*^11.4%Q %q}", dms(1.234)), "*1.2340 ms*"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
694 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
695 |
EXPECT_EQ(fmt::format("{:7.0%Q %q}", dms(12.56)), "13 ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
696 |
EXPECT_EQ(fmt::format("{:>8.{}%Q %q}", dms(12.56), 0), " 13 ms"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
697 |
EXPECT_EQ(fmt::format("{:^{}.{}%Q %q}", dms(12.56), 8, 0), " 13 ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
698 |
EXPECT_EQ(fmt::format("{0:^{2}.{1}%Q %q}", dms(12.56), 0, 9), " 13 ms "); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
699 |
EXPECT_EQ(fmt::format("{:=^{}.{}%Q %q}", dms(12.56), 9, 0), "==13 ms=="); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
700 |
EXPECT_EQ(fmt::format("{:*^11.0%Q %q}", dms(12.56)), "***13 ms***"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
701 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
702 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
703 |
TEST(chrono_test, invalid_width_id) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
704 |
EXPECT_THROW((void)fmt::format(runtime("{:{o}"), std::chrono::seconds(0)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
705 |
fmt::format_error); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
706 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
707 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
708 |
TEST(chrono_test, invalid_colons) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
709 |
EXPECT_THROW((void)fmt::format(runtime("{0}=:{0::"), std::chrono::seconds(0)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
710 |
fmt::format_error); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
711 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
712 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
713 |
TEST(chrono_test, negative_durations) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
714 |
EXPECT_EQ(fmt::format("{:%Q}", std::chrono::seconds(-12345)), "-12345"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
715 |
EXPECT_EQ(fmt::format("{:%H:%M:%S}", std::chrono::seconds(-12345)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
716 |
"-03:25:45"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
717 |
EXPECT_EQ(fmt::format("{:%M:%S}", std::chrono::duration<double>(-1)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
718 |
"-00:01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
719 |
EXPECT_EQ(fmt::format("{:%q}", std::chrono::seconds(-12345)), "s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
720 |
EXPECT_EQ(fmt::format("{:%S}", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
721 |
std::chrono::duration<signed char, std::milli>(-127)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
722 |
"-00.127"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
723 |
auto min = std::numeric_limits<int>::min(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
724 |
EXPECT_EQ(fmt::format("{}", min), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
725 |
fmt::format("{:%Q}", std::chrono::duration<int>(min))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
726 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
727 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
728 |
TEST(chrono_test, special_durations) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
729 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::duration<double>(1e20)), "40"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
730 |
auto nan = std::numeric_limits<double>::quiet_NaN(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
731 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
732 |
fmt::format("{:%I %H %M %S %R %r}", std::chrono::duration<double>(nan)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
733 |
"nan nan nan nan nan:nan nan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
734 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<float, std::exa>(1)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
735 |
"1Es"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
736 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<float, std::atto>(1)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
737 |
"1as"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
738 |
EXPECT_EQ(fmt::format("{:%R}", std::chrono::duration<char, std::mega>{2}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
739 |
"03:33"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
740 |
EXPECT_EQ(fmt::format("{:%T}", std::chrono::duration<char, std::mega>{2}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
741 |
"03:33:20"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
742 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
743 |
fmt::format("{:.3%S}", std::chrono::duration<float, std::pico>(1.234e12)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
744 |
"01.234"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
745 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
746 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
747 |
TEST(chrono_test, unsigned_duration) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
748 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<unsigned>(42)), "42s"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
749 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
750 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
751 |
TEST(chrono_test, weekday) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
752 |
auto loc = get_locale("es_ES.UTF-8"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
753 |
std::locale::global(loc); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
754 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
755 |
auto sat = fmt::weekday(6); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
756 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
757 |
auto tm = std::tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
758 |
tm.tm_wday = static_cast<int>(sat.c_encoding()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
759 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
760 |
EXPECT_EQ(fmt::format("{}", sat), "Sat"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
761 |
EXPECT_EQ(fmt::format("{:%a}", sat), "Sat"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
762 |
EXPECT_EQ(fmt::format("{:%A}", sat), "Saturday"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
763 |
EXPECT_EQ(fmt::format("{:%a}", tm), "Sat"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
764 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
765 |
if (loc != std::locale::classic()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
766 |
auto saturdays = std::vector<std::string>{"sáb", "sá."}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
767 |
EXPECT_THAT(saturdays, Contains(fmt::format(loc, "{:L}", sat))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
768 |
EXPECT_THAT(saturdays, Contains(fmt::format(loc, "{:%a}", sat))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
769 |
EXPECT_THAT(saturdays, Contains(fmt::format(loc, "{:%a}", tm))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
770 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
771 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
772 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
773 |
TEST(chrono_test, cpp20_duration_subsecond_support) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
774 |
using attoseconds = std::chrono::duration<long long, std::atto>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
775 |
// Check that 18 digits of subsecond precision are supported. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
776 |
EXPECT_EQ(fmt::format("{:%S}", attoseconds{999999999999999999}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
777 |
"00.999999999999999999"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
778 |
EXPECT_EQ(fmt::format("{:%S}", attoseconds{673231113420148734}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
779 |
"00.673231113420148734"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
780 |
EXPECT_EQ(fmt::format("{:%S}", attoseconds{-673231113420148734}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
781 |
"-00.673231113420148734"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
782 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::nanoseconds{13420148734}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
783 |
"13.420148734"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
784 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::nanoseconds{-13420148734}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
785 |
"-13.420148734"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
786 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::milliseconds{1234}), "01.234"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
787 |
// Check subsecond presision modifier. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
788 |
EXPECT_EQ(fmt::format("{:.6%S}", std::chrono::nanoseconds{1234}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
789 |
"00.000001"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
790 |
EXPECT_EQ(fmt::format("{:.18%S}", std::chrono::nanoseconds{1234}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
791 |
"00.000001234000000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
792 |
EXPECT_EQ(fmt::format("{:.{}%S}", std::chrono::nanoseconds{1234}, 6), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
793 |
"00.000001"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
794 |
EXPECT_EQ(fmt::format("{:.6%S}", std::chrono::milliseconds{1234}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
795 |
"01.234000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
796 |
EXPECT_EQ(fmt::format("{:.6%S}", std::chrono::milliseconds{-1234}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
797 |
"-01.234000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
798 |
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12345}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
799 |
"12.34"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
800 |
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12375}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
801 |
"12.37"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
802 |
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{-12375}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
803 |
"-12.37"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
804 |
EXPECT_EQ(fmt::format("{:.0%S}", std::chrono::milliseconds{12054}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
805 |
"12"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
806 |
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{99999}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
807 |
"39.99"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
808 |
EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{1000}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
809 |
"01.00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
810 |
EXPECT_EQ(fmt::format("{:.3%S}", std::chrono::milliseconds{1}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
811 |
"00.001"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
812 |
EXPECT_EQ(fmt::format("{:.3%S}", std::chrono::seconds{1234}), "34.000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
813 |
EXPECT_EQ(fmt::format("{:.3%S}", std::chrono::hours{1234}), "00.000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
814 |
EXPECT_EQ(fmt::format("{:.5%S}", dms(1.234)), "00.00123"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
815 |
EXPECT_EQ(fmt::format("{:.8%S}", dms(1.234)), "00.00123400"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
816 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
817 |
// Check that {:%H:%M:%S} is equivalent to {:%T}. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
818 |
auto dur = std::chrono::milliseconds{3601234}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
819 |
auto formatted_dur = fmt::format("{:%T}", dur); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
820 |
EXPECT_EQ(formatted_dur, "01:00:01.234"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
821 |
EXPECT_EQ(fmt::format("{:%H:%M:%S}", dur), formatted_dur); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
822 |
EXPECT_EQ(fmt::format("{:.6%H:%M:%S}", dur), "01:00:01.234000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
823 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
824 |
using nanoseconds_dbl = std::chrono::duration<double, std::nano>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
825 |
EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{-123456789}), "-00.123456789"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
826 |
EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{9123456789}), "09.123456789"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
827 |
// Verify that only the seconds part is extracted and printed. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
828 |
EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{99123456789}), "39.123456789"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
829 |
EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{99123000000}), "39.123000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
830 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
831 |
// Now the hour is printed, and we also test if negative doubles work. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
832 |
auto dur = nanoseconds_dbl{-99123456789}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
833 |
auto formatted_dur = fmt::format("{:%T}", dur); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
834 |
EXPECT_EQ(formatted_dur, "-00:01:39.123456789"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
835 |
EXPECT_EQ(fmt::format("{:%H:%M:%S}", dur), formatted_dur); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
836 |
EXPECT_EQ(fmt::format("{:.3%H:%M:%S}", dur), "-00:01:39.123"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
837 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
838 |
// Check that durations with precision greater than std::chrono::seconds have |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
839 |
// fixed precision, and print zeros even if there is no fractional part. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
840 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::microseconds{7000000}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
841 |
"07.000000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
842 |
EXPECT_EQ(fmt::format("{:%S}", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
843 |
std::chrono::duration<long long, std::ratio<1, 3>>(1)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
844 |
"00.333333"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
845 |
EXPECT_EQ(fmt::format("{:%S}", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
846 |
std::chrono::duration<long long, std::ratio<1, 7>>(1)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
847 |
"00.142857"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
848 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
849 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
850 |
fmt::format("{:%S}", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
851 |
std::chrono::duration<signed char, std::ratio<1, 100>>(0x80)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
852 |
"-01.28"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
853 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
854 |
EXPECT_EQ( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
855 |
fmt::format("{:%M:%S}", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
856 |
std::chrono::duration<short, std::ratio<1, 100>>(0x8000)), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
857 |
"-05:27.68"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
858 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
859 |
// Check that floating point seconds with ratio<1,1> are printed. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
860 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::duration<double>{1.5}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
861 |
"01.500000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
862 |
EXPECT_EQ(fmt::format("{:%M:%S}", std::chrono::duration<double>{-61.25}), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
863 |
"-01:01.250000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
864 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
865 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
866 |
#endif // FMT_STATIC_THOUSANDS_SEPARATOR |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
867 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
868 |
// Disable the utc_clock test for windows, as the icu.dll used for tzdb |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
869 |
// (time zone database) is not shipped with many windows versions. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
870 |
#if FMT_USE_UTC_TIME && !defined(_WIN32) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
871 |
TEST(chrono_test, utc_clock) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
872 |
auto t1 = std::chrono::system_clock::now(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
873 |
auto t1_utc = std::chrono::utc_clock::from_sys(t1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
874 |
EXPECT_EQ(fmt::format("{:%Y-%m-%d %H:%M:%S}", t1), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
875 |
fmt::format("{:%Y-%m-%d %H:%M:%S}", t1_utc)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
876 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
877 |
#endif |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
878 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
879 |
TEST(chrono_test, timestamp_ratios) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
880 |
auto t1 = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
881 |
sys_time<std::chrono::milliseconds>(std::chrono::milliseconds(67890)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
882 |
EXPECT_EQ(fmt::format("{:%M:%S}", t1), "01:07.890"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
883 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
884 |
auto t2 = sys_time<std::chrono::minutes>(std::chrono::minutes(7)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
885 |
EXPECT_EQ(fmt::format("{:%M:%S}", t2), "07:00"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
886 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
887 |
auto t3 = sys_time<std::chrono::duration<int, std::ratio<9>>>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
888 |
std::chrono::duration<int, std::ratio<9>>(7)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
889 |
EXPECT_EQ(fmt::format("{:%M:%S}", t3), "01:03"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
890 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
891 |
auto t4 = sys_time<std::chrono::duration<int, std::ratio<63>>>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
892 |
std::chrono::duration<int, std::ratio<63>>(1)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
893 |
EXPECT_EQ(fmt::format("{:%M:%S}", t4), "01:03"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
894 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
895 |
if (sizeof(time_t) > 4) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
896 |
auto tp = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
897 |
sys_time<std::chrono::milliseconds>(std::chrono::seconds(32503680000)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
898 |
EXPECT_EQ(fmt::format("{:%Y-%m-%d}", tp), "3000-01-01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
899 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
900 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
901 |
if (FMT_SAFE_DURATION_CAST) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
902 |
using years = std::chrono::duration<std::int64_t, std::ratio<31556952>>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
903 |
auto tp = sys_time<years>(years(std::numeric_limits<std::int64_t>::max())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
904 |
EXPECT_THROW_MSG((void)fmt::format("{:%Y-%m-%d}", tp), fmt::format_error, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
905 |
"cannot format duration"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
906 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
907 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
908 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
909 |
TEST(chrono_test, timestamp_sub_seconds) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
910 |
auto t1 = sys_time<std::chrono::duration<long long, std::ratio<1, 3>>>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
911 |
std::chrono::duration<long long, std::ratio<1, 3>>(4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
912 |
EXPECT_EQ(fmt::format("{:%S}", t1), "01.333333"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
913 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
914 |
auto t2 = sys_time<std::chrono::duration<double, std::ratio<1, 3>>>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
915 |
std::chrono::duration<double, std::ratio<1, 3>>(4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
916 |
EXPECT_EQ(fmt::format("{:%S}", t2), "01.333333"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
917 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
918 |
auto t3 = sys_time<std::chrono::seconds>(std::chrono::seconds(2)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
919 |
EXPECT_EQ(fmt::format("{:%S}", t3), "02"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
920 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
921 |
auto t4 = sys_time<std::chrono::duration<double>>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
922 |
std::chrono::duration<double, std::ratio<1, 1>>(9.5)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
923 |
EXPECT_EQ(fmt::format("{:%S}", t4), "09.500000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
924 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
925 |
auto t5 = sys_time<std::chrono::duration<double>>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
926 |
std::chrono::duration<double, std::ratio<1, 1>>(9)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
927 |
EXPECT_EQ(fmt::format("{:%S}", t5), "09"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
928 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
929 |
auto t6 = sys_time<std::chrono::milliseconds>(std::chrono::seconds(1) + |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
930 |
std::chrono::milliseconds(120)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
931 |
EXPECT_EQ(fmt::format("{:%S}", t6), "01.120"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
932 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
933 |
auto t7 = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
934 |
sys_time<std::chrono::microseconds>(std::chrono::microseconds(1234567)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
935 |
EXPECT_EQ(fmt::format("{:%S}", t7), "01.234567"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
936 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
937 |
auto t8 = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
938 |
sys_time<std::chrono::nanoseconds>(std::chrono::nanoseconds(123456789)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
939 |
EXPECT_EQ(fmt::format("{:%S}", t8), "00.123456789"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
940 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
941 |
auto t9 = std::chrono::time_point_cast<std::chrono::nanoseconds>( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
942 |
std::chrono::system_clock::now()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
943 |
auto t9_sec = std::chrono::time_point_cast<std::chrono::seconds>(t9); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
944 |
auto t9_sub_sec_part = fmt::format("{0:09}", (t9 - t9_sec).count()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
945 |
EXPECT_EQ(fmt::format("{}.{}", strftime_full_utc(t9_sec), t9_sub_sec_part), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
946 |
fmt::format("{:%Y-%m-%d %H:%M:%S}", t9)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
947 |
EXPECT_EQ(fmt::format("{}.{}", strftime_full_utc(t9_sec), t9_sub_sec_part), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
948 |
fmt::format("{:%Y-%m-%d %T}", t9)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
949 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
950 |
auto t10 = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
951 |
sys_time<std::chrono::milliseconds>(std::chrono::milliseconds(2000)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
952 |
EXPECT_EQ(fmt::format("{:%S}", t10), "02.000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
953 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
954 |
auto epoch = sys_time<std::chrono::milliseconds>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
955 |
auto d = std::chrono::milliseconds(250); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
956 |
EXPECT_EQ(fmt::format("{:%S}", epoch - d), "59.750"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
957 |
EXPECT_EQ(fmt::format("{:%S}", epoch), "00.000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
958 |
EXPECT_EQ(fmt::format("{:%S}", epoch + d), "00.250"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
959 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
960 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
961 |
TEST(chrono_test, glibc_extensions) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
962 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%0}"), std::chrono::seconds()), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
963 |
fmt::format_error, "invalid format"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
964 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%_}"), std::chrono::seconds()), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
965 |
fmt::format_error, "invalid format"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
966 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%-}"), std::chrono::seconds()), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
967 |
fmt::format_error, "invalid format"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
968 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
969 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
970 |
const auto d = std::chrono::hours(1) + std::chrono::minutes(2) + |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
971 |
std::chrono::seconds(3); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
972 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
973 |
EXPECT_EQ(fmt::format("{:%I,%H,%M,%S}", d), "01,01,02,03"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
974 |
EXPECT_EQ(fmt::format("{:%_I,%_H,%_M,%_S}", d), " 1, 1, 2, 3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
975 |
EXPECT_EQ(fmt::format("{:%-I,%-H,%-M,%-S}", d), "1,1,2,3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
976 |
EXPECT_EQ(fmt::format("{:%-I,%H,%M,%S}", d), "1,01,02,03"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
977 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
978 |
EXPECT_EQ(fmt::format("{:%OI,%OH,%OM,%OS}", d), "01,01,02,03"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
979 |
EXPECT_EQ(fmt::format("{:%_OI,%_OH,%_OM,%_OS}", d), " 1, 1, 2, 3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
980 |
EXPECT_EQ(fmt::format("{:%-OI,%-OH,%-OM,%-OS}", d), "1,1,2,3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
981 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
982 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
983 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
984 |
const auto tm = make_tm(1970, 1, 1, 1, 2, 3); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
985 |
EXPECT_EQ(fmt::format("{:%I,%H,%M,%S}", tm), "01,01,02,03"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
986 |
EXPECT_EQ(fmt::format("{:%_I,%_H,%_M,%_S}", tm), " 1, 1, 2, 3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
987 |
EXPECT_EQ(fmt::format("{:%-I,%-H,%-M,%-S}", tm), "1,1,2,3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
988 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
989 |
EXPECT_EQ(fmt::format("{:%OI,%OH,%OM,%OS}", tm), "01,01,02,03"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
990 |
EXPECT_EQ(fmt::format("{:%_OI,%_OH,%_OM,%_OS}", tm), " 1, 1, 2, 3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
991 |
EXPECT_EQ(fmt::format("{:%-OI,%-OH,%-OM,%-OS}", tm), "1,1,2,3"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
992 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
993 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
994 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
995 |
const auto d = std::chrono::seconds(3) + std::chrono::milliseconds(140); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
996 |
EXPECT_EQ(fmt::format("{:%S}", d), "03.140"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
997 |
EXPECT_EQ(fmt::format("{:%_S}", d), " 3.140"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
998 |
EXPECT_EQ(fmt::format("{:%-S}", d), "3.140"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
999 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1000 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1001 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1002 |
auto d = std::chrono::duration<double>(3.14); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1003 |
EXPECT_EQ(fmt::format("{:%S}", d), "03.140000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1004 |
EXPECT_EQ(fmt::format("{:%_S}", d), " 3.140000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1005 |
EXPECT_EQ(fmt::format("{:%-S}", d), "3.140000"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1006 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1007 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1008 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1009 |
auto t = std::tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1010 |
t.tm_yday = 7; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1011 |
EXPECT_EQ(fmt::format("{:%U,%W,%V}", t), "02,01,01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1012 |
EXPECT_EQ(fmt::format("{:%_U,%_W,%_V}", t), " 2, 1, 1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1013 |
EXPECT_EQ(fmt::format("{:%-U,%-W,%-V}", t), "2,1,1"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1014 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1015 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1016 |
{ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1017 |
auto t = std::tm(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1018 |
t.tm_mday = 7; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1019 |
EXPECT_EQ(fmt::format("{:%d}", t), "07"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1020 |
EXPECT_EQ(fmt::format("{:%_d}", t), " 7"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1021 |
EXPECT_EQ(fmt::format("{:%-d}", t), "7"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1022 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1023 |
EXPECT_EQ(fmt::format("{:%e}", t), " 7"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1024 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1025 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1026 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1027 |
TEST(chrono_test, out_of_range) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1028 |
auto d = std::chrono::duration<unsigned long, std::giga>(538976288); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1029 |
EXPECT_THROW((void)fmt::format("{:%j}", d), fmt::format_error); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1030 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1031 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1032 |
TEST(chrono_test, year_month_day) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1033 |
auto loc = get_locale("es_ES.UTF-8"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1034 |
std::locale::global(loc); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1035 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1036 |
auto year = fmt::year(2024); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1037 |
auto month = fmt::month(1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1038 |
auto day = fmt::day(1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1039 |
auto ymd = fmt::year_month_day(year, month, day); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1040 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1041 |
EXPECT_EQ(fmt::format("{}", year), "2024"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1042 |
EXPECT_EQ(fmt::format("{:%Y}", year), "2024"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1043 |
EXPECT_EQ(fmt::format("{:%y}", year), "24"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1044 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1045 |
EXPECT_EQ(fmt::format("{}", month), "Jan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1046 |
EXPECT_EQ(fmt::format("{:%m}", month), "01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1047 |
EXPECT_EQ(fmt::format("{:%b}", month), "Jan"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1048 |
EXPECT_EQ(fmt::format("{:%B}", month), "January"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1049 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1050 |
EXPECT_EQ(fmt::format("{}", day), "01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1051 |
EXPECT_EQ(fmt::format("{:%d}", day), "01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1052 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1053 |
EXPECT_EQ(fmt::format("{}", ymd), "2024-01-01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1054 |
EXPECT_EQ(fmt::format("{:%Y-%m-%d}", ymd), "2024-01-01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1055 |
EXPECT_EQ(fmt::format("{:%Y-%b-%d}", ymd), "2024-Jan-01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1056 |
EXPECT_EQ(fmt::format("{:%Y-%B-%d}", ymd), "2024-January-01"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1057 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1058 |
if (loc != std::locale::classic()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1059 |
auto months = std::vector<std::string>{"ene.", "ene"}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1060 |
EXPECT_THAT(months, Contains(fmt::format(loc, "{:L}", month))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1061 |
EXPECT_THAT(months, Contains(fmt::format(loc, "{:%b}", month))); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1062 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
1063 |
} |
|
|
1970-01-01 00:00 |
1064 |
|