]> git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/fmt/test/chrono-test.cc
import ceph 14.2.5
[ceph.git] / ceph / src / seastar / fmt / test / chrono-test.cc
1 // Formatting library for C++ - time formatting tests
2 //
3 // Copyright (c) 2012 - present, Victor Zverovich
4 // All rights reserved.
5 //
6 // For the license information refer to format.h.
7
8 #include "fmt/chrono.h"
9 #include "gtest-extra.h"
10
11 #include <iomanip>
12
13 std::tm make_tm() {
14 auto time = std::tm();
15 time.tm_mday = 1;
16 return time;
17 }
18
19 std::tm make_hour(int h) {
20 auto time = make_tm();
21 time.tm_hour = h;
22 return time;
23 }
24
25 std::tm make_minute(int m) {
26 auto time = make_tm();
27 time.tm_min = m;
28 return time;
29 }
30
31 std::tm make_second(int s) {
32 auto time = make_tm();
33 time.tm_sec = s;
34 return time;
35 }
36
37 std::string format_tm(const std::tm &time, const char *spec,
38 const std::locale &loc) {
39 auto &facet = std::use_facet<std::time_put<char>>(loc);
40 std::ostringstream os;
41 os.imbue(loc);
42 facet.put(os, os, ' ', &time, spec, spec + std::strlen(spec));
43 return os.str();
44 }
45
46 #define EXPECT_TIME(spec, time, duration) { \
47 std::locale loc("ja_JP.utf8"); \
48 EXPECT_EQ(format_tm(time, spec, loc), \
49 fmt::format(loc, "{:" spec "}", duration)); \
50 }
51
52 TEST(ChronoTest, FormatDefault) {
53 EXPECT_EQ("42s", fmt::format("{}", std::chrono::seconds(42)));
54 EXPECT_EQ("42as",
55 fmt::format("{}", std::chrono::duration<int, std::atto>(42)));
56 EXPECT_EQ("42fs",
57 fmt::format("{}", std::chrono::duration<int, std::femto>(42)));
58 EXPECT_EQ("42ps",
59 fmt::format("{}", std::chrono::duration<int, std::pico>(42)));
60 EXPECT_EQ("42ns", fmt::format("{}", std::chrono::nanoseconds(42)));
61 EXPECT_EQ("42µs", fmt::format("{}", std::chrono::microseconds(42)));
62 EXPECT_EQ("42ms", fmt::format("{}", std::chrono::milliseconds(42)));
63 EXPECT_EQ("42cs",
64 fmt::format("{}", std::chrono::duration<int, std::centi>(42)));
65 EXPECT_EQ("42ds",
66 fmt::format("{}", std::chrono::duration<int, std::deci>(42)));
67 EXPECT_EQ("42s", fmt::format("{}", std::chrono::seconds(42)));
68 EXPECT_EQ("42das",
69 fmt::format("{}", std::chrono::duration<int, std::deca>(42)));
70 EXPECT_EQ("42hs",
71 fmt::format("{}", std::chrono::duration<int, std::hecto>(42)));
72 EXPECT_EQ("42ks",
73 fmt::format("{}", std::chrono::duration<int, std::kilo>(42)));
74 EXPECT_EQ("42Ms",
75 fmt::format("{}", std::chrono::duration<int, std::mega>(42)));
76 EXPECT_EQ("42Gs",
77 fmt::format("{}", std::chrono::duration<int, std::giga>(42)));
78 EXPECT_EQ("42Ts",
79 fmt::format("{}", std::chrono::duration<int, std::tera>(42)));
80 EXPECT_EQ("42Ps",
81 fmt::format("{}", std::chrono::duration<int, std::peta>(42)));
82 EXPECT_EQ("42Es",
83 fmt::format("{}", std::chrono::duration<int, std::exa>(42)));
84 EXPECT_EQ("42m", fmt::format("{}", std::chrono::minutes(42)));
85 EXPECT_EQ("42h", fmt::format("{}", std::chrono::hours(42)));
86 EXPECT_EQ("42[15s]",
87 fmt::format("{}",
88 std::chrono::duration<int, std::ratio<15, 1>>(42)));
89 EXPECT_EQ("42[15/4s]",
90 fmt::format("{}",
91 std::chrono::duration<int, std::ratio<15, 4>>(42)));
92 }
93
94 TEST(ChronoTest, FormatSpecs) {
95 EXPECT_EQ("%", fmt::format("{:%%}", std::chrono::seconds(0)));
96 EXPECT_EQ("\n", fmt::format("{:%n}", std::chrono::seconds(0)));
97 EXPECT_EQ("\t", fmt::format("{:%t}", std::chrono::seconds(0)));
98 EXPECT_EQ("00", fmt::format("{:%S}", std::chrono::seconds(0)));
99 EXPECT_EQ("00", fmt::format("{:%S}", std::chrono::seconds(60)));
100 EXPECT_EQ("42", fmt::format("{:%S}", std::chrono::seconds(42)));
101 EXPECT_EQ("01.234", fmt::format("{:%S}", std::chrono::milliseconds(1234)));
102 EXPECT_EQ("00", fmt::format("{:%M}", std::chrono::minutes(0)));
103 EXPECT_EQ("00", fmt::format("{:%M}", std::chrono::minutes(60)));
104 EXPECT_EQ("42", fmt::format("{:%M}", std::chrono::minutes(42)));
105 EXPECT_EQ("01", fmt::format("{:%M}", std::chrono::seconds(61)));
106 EXPECT_EQ("00", fmt::format("{:%H}", std::chrono::hours(0)));
107 EXPECT_EQ("00", fmt::format("{:%H}", std::chrono::hours(24)));
108 EXPECT_EQ("14", fmt::format("{:%H}", std::chrono::hours(14)));
109 EXPECT_EQ("01", fmt::format("{:%H}", std::chrono::minutes(61)));
110 EXPECT_EQ("12", fmt::format("{:%I}", std::chrono::hours(0)));
111 EXPECT_EQ("12", fmt::format("{:%I}", std::chrono::hours(12)));
112 EXPECT_EQ("12", fmt::format("{:%I}", std::chrono::hours(24)));
113 EXPECT_EQ("04", fmt::format("{:%I}", std::chrono::hours(4)));
114 EXPECT_EQ("02", fmt::format("{:%I}", std::chrono::hours(14)));
115 EXPECT_EQ("03:25:45",
116 fmt::format("{:%H:%M:%S}", std::chrono::seconds(12345)));
117 EXPECT_EQ("03:25", fmt::format("{:%R}", std::chrono::seconds(12345)));
118 EXPECT_EQ("03:25:45", fmt::format("{:%T}", std::chrono::seconds(12345)));
119 }
120
121 TEST(ChronoTest, InvalidSpecs) {
122 auto sec = std::chrono::seconds(0);
123 EXPECT_THROW_MSG(fmt::format("{:%a}", sec), fmt::format_error, "no date");
124 EXPECT_THROW_MSG(fmt::format("{:%A}", sec), fmt::format_error, "no date");
125 EXPECT_THROW_MSG(fmt::format("{:%c}", sec), fmt::format_error, "no date");
126 EXPECT_THROW_MSG(fmt::format("{:%x}", sec), fmt::format_error, "no date");
127 EXPECT_THROW_MSG(fmt::format("{:%Ex}", sec), fmt::format_error, "no date");
128 EXPECT_THROW_MSG(fmt::format("{:%X}", sec), fmt::format_error, "no date");
129 EXPECT_THROW_MSG(fmt::format("{:%EX}", sec), fmt::format_error, "no date");
130 EXPECT_THROW_MSG(fmt::format("{:%D}", sec), fmt::format_error, "no date");
131 EXPECT_THROW_MSG(fmt::format("{:%F}", sec), fmt::format_error, "no date");
132 EXPECT_THROW_MSG(fmt::format("{:%Ec}", sec), fmt::format_error, "no date");
133 EXPECT_THROW_MSG(fmt::format("{:%w}", sec), fmt::format_error, "no date");
134 EXPECT_THROW_MSG(fmt::format("{:%u}", sec), fmt::format_error, "no date");
135 EXPECT_THROW_MSG(fmt::format("{:%b}", sec), fmt::format_error, "no date");
136 EXPECT_THROW_MSG(fmt::format("{:%B}", sec), fmt::format_error, "no date");
137 EXPECT_THROW_MSG(fmt::format("{:%z}", sec), fmt::format_error, "no date");
138 EXPECT_THROW_MSG(fmt::format("{:%Z}", sec), fmt::format_error, "no date");
139 EXPECT_THROW_MSG(fmt::format("{:%q}", sec), fmt::format_error,
140 "invalid format");
141 EXPECT_THROW_MSG(fmt::format("{:%Eq}", sec), fmt::format_error,
142 "invalid format");
143 EXPECT_THROW_MSG(fmt::format("{:%Oq}", sec), fmt::format_error,
144 "invalid format");
145 }
146
147 TEST(ChronoTest, Locale) {
148 const char *loc_name = "ja_JP.utf8";
149 bool has_locale = false;
150 std::locale loc;
151 try {
152 loc = std::locale(loc_name);
153 has_locale = true;
154 } catch (const std::runtime_error &) {}
155 if (!has_locale) {
156 fmt::print("{} locale is missing.\n", loc_name);
157 return;
158 }
159 EXPECT_TIME("%OH", make_hour(14), std::chrono::hours(14));
160 EXPECT_TIME("%OI", make_hour(14), std::chrono::hours(14));
161 EXPECT_TIME("%OM", make_minute(42), std::chrono::minutes(42));
162 EXPECT_TIME("%OS", make_second(42), std::chrono::seconds(42));
163 auto time = make_tm();
164 time.tm_hour = 3;
165 time.tm_min = 25;
166 time.tm_sec = 45;
167 auto sec = std::chrono::seconds(12345);
168 EXPECT_TIME("%r", time, sec);
169 EXPECT_TIME("%p", time, sec);
170 }