| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1 |
// Formatting library for C++ - time formatting tests |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2 |
// |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
3 |
// Copyright (c) 2012 - present, Victor Zverovich |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
4 |
// All rights reserved. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
5 |
// |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
6 |
// For the license information refer to format.h. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
7 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
8 |
#include "fmt/chrono.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
9 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
10 |
#include <ctime> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
11 |
#include <vector> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
12 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
13 |
#include "gtest-extra.h" // EXPECT_THROW_MSG |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
14 |
#include "util.h" // get_locale |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
15 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
16 |
using fmt::runtime; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
17 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
18 |
using testing::Contains; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
19 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
20 |
auto make_tm() -> std::tm { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
21 |
auto time = std::tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
22 |
time.tm_mday = 1; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
23 |
return time; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
24 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
25 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
26 |
auto make_hour(int h) -> std::tm { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
27 |
auto time = make_tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
28 |
time.tm_hour = h; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
29 |
return time; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
30 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
31 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
32 |
auto make_minute(int m) -> std::tm { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
33 |
auto time = make_tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
34 |
time.tm_min = m; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
35 |
return time; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
36 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
37 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
38 |
auto make_second(int s) -> std::tm { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
39 |
auto time = make_tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
40 |
time.tm_sec = s; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
41 |
return time; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
42 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
43 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
44 |
std::string system_strftime(const std::string& format, const std::tm* timeptr, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
45 |
std::locale* locptr = nullptr) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
46 |
auto loc = locptr ? *locptr : std::locale::classic(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
47 |
auto& facet = std::use_facet<std::time_put<char>>(loc); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
48 |
std::ostringstream os; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
49 |
os.imbue(loc); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
50 |
facet.put(os, os, ' ', timeptr, format.c_str(), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
51 |
format.c_str() + format.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
52 |
#ifdef _WIN32 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
53 |
// Workaround a bug in older versions of Universal CRT. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
54 |
auto str = os.str(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
55 |
if (str == "-0000") str = "+0000"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
56 |
return str; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
57 |
#else |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
58 |
return os.str(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
59 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
60 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
61 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
62 |
FMT_CONSTEXPR std::tm make_tm(int year, int mon, int mday, int hour, int min, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
63 |
int sec) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
64 |
auto tm = std::tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
65 |
tm.tm_sec = sec; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
66 |
tm.tm_min = min; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
67 |
tm.tm_hour = hour; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
68 |
tm.tm_mday = mday; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
69 |
tm.tm_mon = mon - 1; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
70 |
tm.tm_year = year - 1900; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
71 |
return tm; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
72 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
73 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
74 |
TEST(chrono_test, format_tm) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
75 |
auto tm = std::tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
76 |
tm.tm_year = 116; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
77 |
tm.tm_mon = 3; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
78 |
tm.tm_mday = 25; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
79 |
tm.tm_hour = 11; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
80 |
tm.tm_min = 22; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
81 |
tm.tm_sec = 33; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
82 |
EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
83 |
"The date is 2016-04-25 11:22:33."); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
84 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "2016"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
85 |
EXPECT_EQ(fmt::format("{:%C}", tm), "20"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
86 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
87 |
EXPECT_EQ(fmt::format("{:%e}", tm), "25"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
88 |
EXPECT_EQ(fmt::format("{:%D}", tm), "04/25/16"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
89 |
EXPECT_EQ(fmt::format("{:%F}", tm), "2016-04-25"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
90 |
EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
91 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
92 |
// Short year |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
93 |
tm.tm_year = 999 - 1900; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
94 |
tm.tm_mon = 0; // for %G |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
95 |
tm.tm_mday = 2; // for %G |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
96 |
tm.tm_wday = 3; // for %G |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
97 |
tm.tm_yday = 1; // for %G |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
98 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "0999"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
99 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), "0999"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
100 |
EXPECT_EQ(fmt::format("{:%G}", tm), "0999"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
101 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
102 |
tm.tm_year = 27 - 1900; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
103 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "0027"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
104 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), "0027"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
105 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
106 |
// Overflow year |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
107 |
tm.tm_year = 2147483647; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
108 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "2147485547"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
109 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
110 |
tm.tm_year = -2147483648; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
111 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "-2147481748"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
112 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
113 |
// for week on the year |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
114 |
// https://www.cl.cam.ac.uk/~mgk25/iso-time.html |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
115 |
std::vector<std::tm> tm_list = { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
116 |
make_tm(1975, 12, 29, 12, 14, 16), // W01 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
117 |
make_tm(1977, 1, 2, 12, 14, 16), // W53 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
118 |
make_tm(1999, 12, 27, 12, 14, 16), // W52 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
119 |
make_tm(1999, 12, 31, 12, 14, 16), // W52 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
120 |
make_tm(2000, 1, 1, 12, 14, 16), // W52 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
121 |
make_tm(2000, 1, 2, 12, 14, 16), // W52 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
122 |
make_tm(2000, 1, 3, 12, 14, 16) // W1 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
123 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
124 |
const std::string iso_week_spec = "%Y-%m-%d: %G %g %V"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
125 |
for (auto ctm : tm_list) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
126 |
// Calculate tm_yday, tm_wday, etc. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
127 |
std::time_t t = std::mktime(&ctm); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
128 |
tm = *std::localtime(&t); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
129 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
130 |
auto fmt_spec = fmt::format("{{:{}}}", iso_week_spec); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
131 |
EXPECT_EQ(system_strftime(iso_week_spec, &tm), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
132 |
fmt::format(fmt::runtime(fmt_spec), tm)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
133 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
134 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
135 |
// Every day from 1970-01-01 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
136 |
std::time_t time_now = std::time(nullptr); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
137 |
for (std::time_t t = 6 * 3600; t < time_now; t += 86400) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
138 |
tm = *std::localtime(&t); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
139 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
140 |
auto fmt_spec = fmt::format("{{:{}}}", iso_week_spec); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
141 |
EXPECT_EQ(system_strftime(iso_week_spec, &tm), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
142 |
fmt::format(fmt::runtime(fmt_spec), tm)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
143 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
144 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
145 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
146 |
// MSVC: |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
147 |
// minkernel\crts\ucrt\src\appcrt\time\wcsftime.cpp(971) : Assertion failed: |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
148 |
// timeptr->tm_year >= -1900 && timeptr->tm_year <= 8099 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
149 |
#ifndef _WIN32 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
150 |
TEST(chrono_test, format_tm_future) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
151 |
auto tm = std::tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
152 |
tm.tm_year = 10445; // 10000+ years |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
153 |
tm.tm_mon = 3; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
154 |
tm.tm_mday = 25; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
155 |
tm.tm_hour = 11; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
156 |
tm.tm_min = 22; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
157 |
tm.tm_sec = 33; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
158 |
EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
159 |
"The date is 12345-04-25 11:22:33."); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
160 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "12345"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
161 |
EXPECT_EQ(fmt::format("{:%C}", tm), "123"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
162 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
163 |
EXPECT_EQ(fmt::format("{:%D}", tm), "04/25/45"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
164 |
EXPECT_EQ(fmt::format("{:%F}", tm), "12345-04-25"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
165 |
EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
166 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
167 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
168 |
TEST(chrono_test, format_tm_past) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
169 |
auto tm = std::tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
170 |
tm.tm_year = -2001; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
171 |
tm.tm_mon = 3; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
172 |
tm.tm_mday = 25; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
173 |
tm.tm_hour = 11; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
174 |
tm.tm_min = 22; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
175 |
tm.tm_sec = 33; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
176 |
EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
177 |
"The date is -101-04-25 11:22:33."); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
178 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "-101"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
179 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
180 |
// macOS %C - "-1" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
181 |
// Linux %C - "-2" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
182 |
// fmt %C - "-1" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
183 |
EXPECT_EQ(fmt::format("{:%C}", tm), "-1"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
184 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
185 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
186 |
// macOS %D - "04/25/01" (%y) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
187 |
// Linux %D - "04/25/99" (%y) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
188 |
// fmt %D - "04/25/01" (%y) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
189 |
EXPECT_EQ(fmt::format("{:%D}", tm), "04/25/01"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
190 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
191 |
EXPECT_EQ(fmt::format("{:%F}", tm), "-101-04-25"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
192 |
EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
193 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
194 |
tm.tm_year = -1901; // -1 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
195 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "-001"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
196 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
197 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
198 |
tm.tm_year = -1911; // -11 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
199 |
EXPECT_EQ(fmt::format("{:%Y}", tm), "-011"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
200 |
EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
201 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
202 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
203 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
204 |
TEST(chrono_test, grow_buffer) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
205 |
auto s = std::string("{:"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
206 |
for (int i = 0; i < 30; ++i) s += "%c"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
207 |
s += "}\n"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
208 |
auto t = std::time(nullptr); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
209 |
(void)fmt::format(fmt::runtime(s), *std::localtime(&t)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
210 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
211 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
212 |
TEST(chrono_test, format_to_empty_container) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
213 |
auto time = std::tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
214 |
time.tm_sec = 42; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
215 |
auto s = std::string(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
216 |
fmt::format_to(std::back_inserter(s), "{:%S}", time); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
217 |
EXPECT_EQ(s, "42"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
218 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
219 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
220 |
TEST(chrono_test, empty_result) { EXPECT_EQ(fmt::format("{}", std::tm()), ""); } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
221 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
222 |
auto equal(const std::tm& lhs, const std::tm& rhs) -> bool { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
223 |
return lhs.tm_sec == rhs.tm_sec && lhs.tm_min == rhs.tm_min && |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
224 |
lhs.tm_hour == rhs.tm_hour && lhs.tm_mday == rhs.tm_mday && |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
225 |
lhs.tm_mon == rhs.tm_mon && lhs.tm_year == rhs.tm_year && |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
226 |
lhs.tm_wday == rhs.tm_wday && lhs.tm_yday == rhs.tm_yday && |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
227 |
lhs.tm_isdst == rhs.tm_isdst; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
228 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
229 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
230 |
TEST(chrono_test, localtime) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
231 |
auto t = std::time(nullptr); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
232 |
auto tm = *std::localtime(&t); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
233 |
EXPECT_TRUE(equal(tm, fmt::localtime(t))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
234 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
235 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
236 |
TEST(chrono_test, gmtime) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
237 |
auto t = std::time(nullptr); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
238 |
auto tm = *std::gmtime(&t); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
239 |
EXPECT_TRUE(equal(tm, fmt::gmtime(t))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
240 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
241 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
242 |
template <typename TimePoint> auto strftime_full(TimePoint tp) -> std::string { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
243 |
auto t = std::chrono::system_clock::to_time_t(tp); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
244 |
auto tm = *std::localtime(&t); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
245 |
return system_strftime("%Y-%m-%d %H:%M:%S", &tm); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
246 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
247 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
248 |
TEST(chrono_test, time_point) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
249 |
auto t1 = std::chrono::system_clock::now(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
250 |
EXPECT_EQ(strftime_full(t1), fmt::format("{:%Y-%m-%d %H:%M:%S}", t1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
251 |
EXPECT_EQ(strftime_full(t1), fmt::format("{}", t1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
252 |
using time_point = |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
253 |
std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
254 |
auto t2 = time_point(std::chrono::seconds(42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
255 |
EXPECT_EQ(strftime_full(t2), fmt::format("{:%Y-%m-%d %H:%M:%S}", t2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
256 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
257 |
std::vector<std::string> spec_list = { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
258 |
"%%", "%n", "%t", "%Y", "%EY", "%y", "%Oy", "%Ey", "%C", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
259 |
"%EC", "%G", "%g", "%b", "%h", "%B", "%m", "%Om", "%U", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
260 |
"%OU", "%W", "%OW", "%V", "%OV", "%j", "%d", "%Od", "%e", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
261 |
"%Oe", "%a", "%A", "%w", "%Ow", "%u", "%Ou", "%H", "%OH", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
262 |
"%I", "%OI", "%M", "%OM", "%S", "%OS", "%x", "%Ex", "%X", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
263 |
"%EX", "%D", "%F", "%R", "%T", "%p", "%z", "%Z"}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
264 |
spec_list.push_back("%Y-%m-%d %H:%M:%S"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
265 |
#ifndef _WIN32 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
266 |
// Disabled on Windows because these formats are not consistent among |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
267 |
// platforms. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
268 |
spec_list.insert(spec_list.end(), {"%c", "%Ec", "%r"}); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
269 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
270 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
271 |
for (const auto& spec : spec_list) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
272 |
auto t = std::chrono::system_clock::to_time_t(t1); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
273 |
auto tm = *std::localtime(&t); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
274 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
275 |
auto sys_output = system_strftime(spec, &tm); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
276 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
277 |
auto fmt_spec = fmt::format("{{:{}}}", spec); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
278 |
EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), t1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
279 |
EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), tm)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
280 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
281 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
282 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
283 |
#ifndef FMT_STATIC_THOUSANDS_SEPARATOR |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
284 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
285 |
TEST(chrono_test, format_default) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
286 |
EXPECT_EQ("42s", fmt::format("{}", std::chrono::seconds(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
287 |
EXPECT_EQ("42as", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
288 |
fmt::format("{}", std::chrono::duration<int, std::atto>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
289 |
EXPECT_EQ("42fs", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
290 |
fmt::format("{}", std::chrono::duration<int, std::femto>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
291 |
EXPECT_EQ("42ps", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
292 |
fmt::format("{}", std::chrono::duration<int, std::pico>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
293 |
EXPECT_EQ("42ns", fmt::format("{}", std::chrono::nanoseconds(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
294 |
EXPECT_EQ("42µs", fmt::format("{}", std::chrono::microseconds(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
295 |
EXPECT_EQ("42ms", fmt::format("{}", std::chrono::milliseconds(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
296 |
EXPECT_EQ("42cs", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
297 |
fmt::format("{}", std::chrono::duration<int, std::centi>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
298 |
EXPECT_EQ("42ds", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
299 |
fmt::format("{}", std::chrono::duration<int, std::deci>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
300 |
EXPECT_EQ("42s", fmt::format("{}", std::chrono::seconds(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
301 |
EXPECT_EQ("42das", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
302 |
fmt::format("{}", std::chrono::duration<int, std::deca>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
303 |
EXPECT_EQ("42hs", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
304 |
fmt::format("{}", std::chrono::duration<int, std::hecto>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
305 |
EXPECT_EQ("42ks", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
306 |
fmt::format("{}", std::chrono::duration<int, std::kilo>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
307 |
EXPECT_EQ("42Ms", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
308 |
fmt::format("{}", std::chrono::duration<int, std::mega>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
309 |
EXPECT_EQ("42Gs", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
310 |
fmt::format("{}", std::chrono::duration<int, std::giga>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
311 |
EXPECT_EQ("42Ts", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
312 |
fmt::format("{}", std::chrono::duration<int, std::tera>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
313 |
EXPECT_EQ("42Ps", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
314 |
fmt::format("{}", std::chrono::duration<int, std::peta>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
315 |
EXPECT_EQ("42Es", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
316 |
fmt::format("{}", std::chrono::duration<int, std::exa>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
317 |
EXPECT_EQ("42m", fmt::format("{}", std::chrono::minutes(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
318 |
EXPECT_EQ("42h", fmt::format("{}", std::chrono::hours(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
319 |
EXPECT_EQ( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
320 |
"42[15]s", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
321 |
fmt::format("{}", std::chrono::duration<int, std::ratio<15, 1>>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
322 |
EXPECT_EQ( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
323 |
"42[15/4]s", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
324 |
fmt::format("{}", std::chrono::duration<int, std::ratio<15, 4>>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
325 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
326 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
327 |
TEST(chrono_test, align) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
328 |
auto s = std::chrono::seconds(42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
329 |
EXPECT_EQ("42s ", fmt::format("{:5}", s)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
330 |
EXPECT_EQ("42s ", fmt::format("{:{}}", s, 5)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
331 |
EXPECT_EQ(" 42s", fmt::format("{:>5}", s)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
332 |
EXPECT_EQ("**42s**", fmt::format("{:*^7}", s)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
333 |
EXPECT_EQ("03:25:45 ", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
334 |
fmt::format("{:12%H:%M:%S}", std::chrono::seconds(12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
335 |
EXPECT_EQ(" 03:25:45", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
336 |
fmt::format("{:>12%H:%M:%S}", std::chrono::seconds(12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
337 |
EXPECT_EQ("~~03:25:45~~", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
338 |
fmt::format("{:~^12%H:%M:%S}", std::chrono::seconds(12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
339 |
EXPECT_EQ("03:25:45 ", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
340 |
fmt::format("{:{}%H:%M:%S}", std::chrono::seconds(12345), 12)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
341 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
342 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
343 |
TEST(chrono_test, format_specs) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
344 |
EXPECT_EQ("%", fmt::format("{:%%}", std::chrono::seconds(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
345 |
EXPECT_EQ("\n", fmt::format("{:%n}", std::chrono::seconds(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
346 |
EXPECT_EQ("\t", fmt::format("{:%t}", std::chrono::seconds(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
347 |
EXPECT_EQ("00", fmt::format("{:%S}", std::chrono::seconds(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
348 |
EXPECT_EQ("00", fmt::format("{:%S}", std::chrono::seconds(60))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
349 |
EXPECT_EQ("42", fmt::format("{:%S}", std::chrono::seconds(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
350 |
EXPECT_EQ("01.234", fmt::format("{:%S}", std::chrono::milliseconds(1234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
351 |
EXPECT_EQ("00", fmt::format("{:%M}", std::chrono::minutes(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
352 |
EXPECT_EQ("00", fmt::format("{:%M}", std::chrono::minutes(60))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
353 |
EXPECT_EQ("42", fmt::format("{:%M}", std::chrono::minutes(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
354 |
EXPECT_EQ("01", fmt::format("{:%M}", std::chrono::seconds(61))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
355 |
EXPECT_EQ("00", fmt::format("{:%H}", std::chrono::hours(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
356 |
EXPECT_EQ("00", fmt::format("{:%H}", std::chrono::hours(24))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
357 |
EXPECT_EQ("14", fmt::format("{:%H}", std::chrono::hours(14))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
358 |
EXPECT_EQ("01", fmt::format("{:%H}", std::chrono::minutes(61))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
359 |
EXPECT_EQ("12", fmt::format("{:%I}", std::chrono::hours(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
360 |
EXPECT_EQ("12", fmt::format("{:%I}", std::chrono::hours(12))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
361 |
EXPECT_EQ("12", fmt::format("{:%I}", std::chrono::hours(24))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
362 |
EXPECT_EQ("04", fmt::format("{:%I}", std::chrono::hours(4))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
363 |
EXPECT_EQ("02", fmt::format("{:%I}", std::chrono::hours(14))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
364 |
EXPECT_EQ("03:25:45", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
365 |
fmt::format("{:%H:%M:%S}", std::chrono::seconds(12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
366 |
EXPECT_EQ("03:25", fmt::format("{:%R}", std::chrono::seconds(12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
367 |
EXPECT_EQ("03:25:45", fmt::format("{:%T}", std::chrono::seconds(12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
368 |
EXPECT_EQ("12345", fmt::format("{:%Q}", std::chrono::seconds(12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
369 |
EXPECT_EQ("s", fmt::format("{:%q}", std::chrono::seconds(12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
370 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
371 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
372 |
TEST(chrono_test, invalid_specs) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
373 |
auto sec = std::chrono::seconds(0); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
374 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%a}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
375 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
376 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%A}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
377 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
378 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%c}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
379 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
380 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%x}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
381 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
382 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Ex}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
383 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
384 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%X}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
385 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
386 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%EX}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
387 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
388 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%D}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
389 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
390 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%F}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
391 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
392 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Ec}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
393 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
394 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%w}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
395 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
396 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%u}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
397 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
398 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%b}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
399 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
400 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%B}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
401 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
402 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%z}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
403 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
404 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Z}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
405 |
"no date"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
406 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Eq}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
407 |
"invalid format"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
408 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Oq}"), sec), fmt::format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
409 |
"invalid format"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
410 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
411 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
412 |
auto format_tm(const std::tm& time, fmt::string_view spec, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
413 |
const std::locale& loc) -> std::string { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
414 |
auto& facet = std::use_facet<std::time_put<char>>(loc); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
415 |
std::ostringstream os; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
416 |
os.imbue(loc); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
417 |
facet.put(os, os, ' ', &time, spec.begin(), spec.end()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
418 |
return os.str(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
419 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
420 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
421 |
TEST(chrono_test, locale) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
422 |
auto loc = get_locale("ja_JP.utf8"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
423 |
if (loc == std::locale::classic()) return; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
424 |
# define EXPECT_TIME(spec, time, duration) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
425 |
{ \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
426 |
auto jp_loc = std::locale("ja_JP.utf8"); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
427 |
EXPECT_EQ(format_tm(time, spec, jp_loc), \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
428 |
fmt::format(jp_loc, "{:L" spec "}", duration)); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
429 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
430 |
EXPECT_TIME("%OH", make_hour(14), std::chrono::hours(14)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
431 |
EXPECT_TIME("%OI", make_hour(14), std::chrono::hours(14)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
432 |
EXPECT_TIME("%OM", make_minute(42), std::chrono::minutes(42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
433 |
EXPECT_TIME("%OS", make_second(42), std::chrono::seconds(42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
434 |
auto time = make_tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
435 |
time.tm_hour = 3; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
436 |
time.tm_min = 25; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
437 |
time.tm_sec = 45; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
438 |
auto sec = std::chrono::seconds(12345); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
439 |
EXPECT_TIME("%r", time, sec); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
440 |
EXPECT_TIME("%p", time, sec); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
441 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
442 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
443 |
using dms = std::chrono::duration<double, std::milli>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
444 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
445 |
TEST(chrono_test, format_default_fp) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
446 |
typedef std::chrono::duration<float> fs; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
447 |
EXPECT_EQ("1.234s", fmt::format("{}", fs(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
448 |
typedef std::chrono::duration<float, std::milli> fms; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
449 |
EXPECT_EQ("1.234ms", fmt::format("{}", fms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
450 |
typedef std::chrono::duration<double> ds; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
451 |
EXPECT_EQ("1.234s", fmt::format("{}", ds(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
452 |
EXPECT_EQ("1.234ms", fmt::format("{}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
453 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
454 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
455 |
TEST(chrono_test, format_precision) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
456 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
457 |
(void)fmt::format(runtime("{:.2}"), std::chrono::seconds(42)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
458 |
fmt::format_error, "precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
459 |
EXPECT_EQ("1ms", fmt::format("{:.0}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
460 |
EXPECT_EQ("1.2ms", fmt::format("{:.1}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
461 |
EXPECT_EQ("1.23ms", fmt::format("{:.{}}", dms(1.234), 2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
462 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
463 |
EXPECT_EQ("13ms", fmt::format("{:.0}", dms(12.56))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
464 |
EXPECT_EQ("12.6ms", fmt::format("{:.1}", dms(12.56))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
465 |
EXPECT_EQ("12.56ms", fmt::format("{:.2}", dms(12.56))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
466 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
467 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
468 |
TEST(chrono_test, format_full_specs) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
469 |
EXPECT_EQ("1ms ", fmt::format("{:6.0}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
470 |
EXPECT_EQ("1.2ms ", fmt::format("{:6.1}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
471 |
EXPECT_EQ(" 1.23ms", fmt::format("{:>8.{}}", dms(1.234), 2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
472 |
EXPECT_EQ(" 1.2ms ", fmt::format("{:^{}.{}}", dms(1.234), 7, 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
473 |
EXPECT_EQ(" 1.23ms ", fmt::format("{0:^{2}.{1}}", dms(1.234), 2, 8)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
474 |
EXPECT_EQ("=1.234ms=", fmt::format("{:=^{}.{}}", dms(1.234), 9, 3)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
475 |
EXPECT_EQ("*1.2340ms*", fmt::format("{:*^10.4}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
476 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
477 |
EXPECT_EQ("13ms ", fmt::format("{:6.0}", dms(12.56))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
478 |
EXPECT_EQ(" 13ms", fmt::format("{:>8.{}}", dms(12.56), 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
479 |
EXPECT_EQ(" 13ms ", fmt::format("{:^{}.{}}", dms(12.56), 6, 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
480 |
EXPECT_EQ(" 13ms ", fmt::format("{0:^{2}.{1}}", dms(12.56), 0, 8)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
481 |
EXPECT_EQ("==13ms===", fmt::format("{:=^{}.{}}", dms(12.56), 9, 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
482 |
EXPECT_EQ("***13ms***", fmt::format("{:*^10.0}", dms(12.56))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
483 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
484 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
485 |
TEST(chrono_test, format_simple_q) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
486 |
typedef std::chrono::duration<float> fs; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
487 |
EXPECT_EQ("1.234 s", fmt::format("{:%Q %q}", fs(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
488 |
typedef std::chrono::duration<float, std::milli> fms; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
489 |
EXPECT_EQ("1.234 ms", fmt::format("{:%Q %q}", fms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
490 |
typedef std::chrono::duration<double> ds; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
491 |
EXPECT_EQ("1.234 s", fmt::format("{:%Q %q}", ds(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
492 |
EXPECT_EQ("1.234 ms", fmt::format("{:%Q %q}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
493 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
494 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
495 |
TEST(chrono_test, format_precision_q) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
496 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
497 |
(void)fmt::format(runtime("{:.2%Q %q}"), std::chrono::seconds(42)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
498 |
fmt::format_error, "precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
499 |
EXPECT_EQ("1.2 ms", fmt::format("{:.1%Q %q}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
500 |
EXPECT_EQ("1.23 ms", fmt::format("{:.{}%Q %q}", dms(1.234), 2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
501 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
502 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
503 |
TEST(chrono_test, format_full_specs_q) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
504 |
EXPECT_EQ("1 ms ", fmt::format("{:7.0%Q %q}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
505 |
EXPECT_EQ("1.2 ms ", fmt::format("{:7.1%Q %q}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
506 |
EXPECT_EQ(" 1.23 ms", fmt::format("{:>8.{}%Q %q}", dms(1.234), 2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
507 |
EXPECT_EQ(" 1.2 ms ", fmt::format("{:^{}.{}%Q %q}", dms(1.234), 8, 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
508 |
EXPECT_EQ(" 1.23 ms ", fmt::format("{0:^{2}.{1}%Q %q}", dms(1.234), 2, 9)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
509 |
EXPECT_EQ("=1.234 ms=", fmt::format("{:=^{}.{}%Q %q}", dms(1.234), 10, 3)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
510 |
EXPECT_EQ("*1.2340 ms*", fmt::format("{:*^11.4%Q %q}", dms(1.234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
511 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
512 |
EXPECT_EQ("13 ms ", fmt::format("{:7.0%Q %q}", dms(12.56))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
513 |
EXPECT_EQ(" 13 ms", fmt::format("{:>8.{}%Q %q}", dms(12.56), 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
514 |
EXPECT_EQ(" 13 ms ", fmt::format("{:^{}.{}%Q %q}", dms(12.56), 8, 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
515 |
EXPECT_EQ(" 13 ms ", fmt::format("{0:^{2}.{1}%Q %q}", dms(12.56), 0, 9)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
516 |
EXPECT_EQ("==13 ms==", fmt::format("{:=^{}.{}%Q %q}", dms(12.56), 9, 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
517 |
EXPECT_EQ("***13 ms***", fmt::format("{:*^11.0%Q %q}", dms(12.56))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
518 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
519 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
520 |
TEST(chrono_test, invalid_width_id) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
521 |
EXPECT_THROW((void)fmt::format(runtime("{:{o}"), std::chrono::seconds(0)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
522 |
fmt::format_error); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
523 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
524 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
525 |
TEST(chrono_test, invalid_colons) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
526 |
EXPECT_THROW((void)fmt::format(runtime("{0}=:{0::"), std::chrono::seconds(0)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
527 |
fmt::format_error); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
528 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
529 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
530 |
TEST(chrono_test, negative_durations) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
531 |
EXPECT_EQ("-12345", fmt::format("{:%Q}", std::chrono::seconds(-12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
532 |
EXPECT_EQ("-03:25:45", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
533 |
fmt::format("{:%H:%M:%S}", std::chrono::seconds(-12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
534 |
EXPECT_EQ("-00:01", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
535 |
fmt::format("{:%M:%S}", std::chrono::duration<double>(-1))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
536 |
EXPECT_EQ("s", fmt::format("{:%q}", std::chrono::seconds(-12345))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
537 |
EXPECT_EQ("-00.127", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
538 |
fmt::format("{:%S}", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
539 |
std::chrono::duration<signed char, std::milli>{-127})); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
540 |
auto min = std::numeric_limits<int>::min(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
541 |
EXPECT_EQ(fmt::format("{}", min), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
542 |
fmt::format("{:%Q}", std::chrono::duration<int>(min))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
543 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
544 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
545 |
TEST(chrono_test, special_durations) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
546 |
auto value = fmt::format("{:%S}", std::chrono::duration<double>(1e20)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
547 |
EXPECT_EQ(value, "40"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
548 |
auto nan = std::numeric_limits<double>::quiet_NaN(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
549 |
EXPECT_EQ( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
550 |
"nan nan nan nan nan:nan nan", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
551 |
fmt::format("{:%I %H %M %S %R %r}", std::chrono::duration<double>(nan))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
552 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<float, std::exa>(1)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
553 |
"1Es"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
554 |
EXPECT_EQ(fmt::format("{}", std::chrono::duration<float, std::atto>(1)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
555 |
"1as"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
556 |
EXPECT_EQ(fmt::format("{:%R}", std::chrono::duration<char, std::mega>{2}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
557 |
"03:33"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
558 |
EXPECT_EQ(fmt::format("{:%T}", std::chrono::duration<char, std::mega>{2}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
559 |
"03:33:20"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
560 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
561 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
562 |
TEST(chrono_test, unsigned_duration) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
563 |
EXPECT_EQ("42s", fmt::format("{}", std::chrono::duration<unsigned>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
564 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
565 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
566 |
TEST(chrono_test, weekday) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
567 |
auto loc = get_locale("ru_RU.UTF-8"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
568 |
std::locale::global(loc); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
569 |
auto mon = fmt::weekday(1); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
570 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
571 |
auto tm = std::tm(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
572 |
tm.tm_wday = static_cast<int>(mon.c_encoding()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
573 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
574 |
EXPECT_EQ(fmt::format("{}", mon), "Mon"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
575 |
EXPECT_EQ(fmt::format("{:%a}", tm), "Mon"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
576 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
577 |
if (loc != std::locale::classic()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
578 |
EXPECT_THAT((std::vector<std::string>{"пн", "Пн", "пнд", "Пнд"}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
579 |
Contains(fmt::format(loc, "{:L}", mon))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
580 |
EXPECT_THAT((std::vector<std::string>{"пн", "Пн", "пнд", "Пнд"}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
581 |
Contains(fmt::format(loc, "{:%a}", tm))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
582 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
583 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
584 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
585 |
TEST(chrono_test, cpp20_duration_subsecond_support) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
586 |
using attoseconds = std::chrono::duration<long long, std::atto>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
587 |
// Check that 18 digits of subsecond precision are supported. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
588 |
EXPECT_EQ(fmt::format("{:%S}", attoseconds{999999999999999999}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
589 |
"00.999999999999999999"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
590 |
EXPECT_EQ(fmt::format("{:%S}", attoseconds{673231113420148734}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
591 |
"00.673231113420148734"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
592 |
EXPECT_EQ(fmt::format("{:%S}", attoseconds{-673231113420148734}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
593 |
"-00.673231113420148734"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
594 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::nanoseconds{13420148734}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
595 |
"13.420148734"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
596 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::nanoseconds{-13420148734}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
597 |
"-13.420148734"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
598 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::milliseconds{1234}), "01.234"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
599 |
{ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
600 |
// Check that {:%H:%M:%S} is equivalent to {:%T}. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
601 |
auto dur = std::chrono::milliseconds{3601234}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
602 |
auto formatted_dur = fmt::format("{:%T}", dur); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
603 |
EXPECT_EQ(formatted_dur, "01:00:01.234"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
604 |
EXPECT_EQ(fmt::format("{:%H:%M:%S}", dur), formatted_dur); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
605 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
606 |
using nanoseconds_dbl = std::chrono::duration<double, std::nano>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
607 |
EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{-123456789}), "-00.123456789"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
608 |
EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{9123456789}), "09.123456789"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
609 |
// Verify that only the seconds part is extracted and printed. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
610 |
EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{99123456789}), "39.123456789"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
611 |
EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{99123000000}), "39.123000000"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
612 |
{ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
613 |
// Now the hour is printed, and we also test if negative doubles work. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
614 |
auto dur = nanoseconds_dbl{-99123456789}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
615 |
auto formatted_dur = fmt::format("{:%T}", dur); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
616 |
EXPECT_EQ(formatted_dur, "-00:01:39.123456789"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
617 |
EXPECT_EQ(fmt::format("{:%H:%M:%S}", dur), formatted_dur); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
618 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
619 |
// Check that durations with precision greater than std::chrono::seconds have |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
620 |
// fixed precision, and print zeros even if there is no fractional part. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
621 |
EXPECT_EQ(fmt::format("{:%S}", std::chrono::microseconds{7000000}), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
622 |
"07.000000"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
623 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
624 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
625 |
#endif // FMT_STATIC_THOUSANDS_SEPARATOR |
|
|
1970-01-01 00:00 |
626 |
|