]>
git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/fmt/test/chrono-test.cc
1 // Formatting library for C++ - time formatting tests
3 // Copyright (c) 2012 - present, Victor Zverovich
4 // All rights reserved.
6 // For the license information refer to format.h.
8 #include "fmt/chrono.h"
9 #include "gtest-extra.h"
14 auto time
= std::tm();
19 std::tm
make_hour(int h
) {
20 auto time
= make_tm();
25 std::tm
make_minute(int m
) {
26 auto time
= make_tm();
31 std::tm
make_second(int s
) {
32 auto time
= make_tm();
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
;
42 facet
.put(os
, os
, ' ', &time
, spec
, spec
+ std::strlen(spec
));
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)); \
52 TEST(ChronoTest
, FormatDefault
) {
53 EXPECT_EQ("42s", fmt::format("{}", std::chrono::seconds(42)));
55 fmt::format("{}", std::chrono::duration
<int, std::atto
>(42)));
57 fmt::format("{}", std::chrono::duration
<int, std::femto
>(42)));
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)));
64 fmt::format("{}", std::chrono::duration
<int, std::centi
>(42)));
66 fmt::format("{}", std::chrono::duration
<int, std::deci
>(42)));
67 EXPECT_EQ("42s", fmt::format("{}", std::chrono::seconds(42)));
69 fmt::format("{}", std::chrono::duration
<int, std::deca
>(42)));
71 fmt::format("{}", std::chrono::duration
<int, std::hecto
>(42)));
73 fmt::format("{}", std::chrono::duration
<int, std::kilo
>(42)));
75 fmt::format("{}", std::chrono::duration
<int, std::mega
>(42)));
77 fmt::format("{}", std::chrono::duration
<int, std::giga
>(42)));
79 fmt::format("{}", std::chrono::duration
<int, std::tera
>(42)));
81 fmt::format("{}", std::chrono::duration
<int, std::peta
>(42)));
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)));
88 std::chrono::duration
<int, std::ratio
<15, 1>>(42)));
89 EXPECT_EQ("42[15/4s]",
91 std::chrono::duration
<int, std::ratio
<15, 4>>(42)));
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)));
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
,
141 EXPECT_THROW_MSG(fmt::format("{:%Eq}", sec
), fmt::format_error
,
143 EXPECT_THROW_MSG(fmt::format("{:%Oq}", sec
), fmt::format_error
,
147 TEST(ChronoTest
, Locale
) {
148 const char *loc_name
= "ja_JP.utf8";
149 bool has_locale
= false;
152 loc
= std::locale(loc_name
);
154 } catch (const std::runtime_error
&) {}
156 fmt::print("{} locale is missing.\n", loc_name
);
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();
167 auto sec
= std::chrono::seconds(12345);
168 EXPECT_TIME("%r", time
, sec
);
169 EXPECT_TIME("%p", time
, sec
);