| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1 |
// Formatting library for C++ - formatting library 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 |
// Check if fmt/format.h compiles with windows.h included before it. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
9 |
#ifdef _WIN32 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
10 |
# include <windows.h> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
11 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
12 |
// clang-format off |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
13 |
#include "fmt/format.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
14 |
// clang-format on |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
15 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
16 |
#include <stdint.h> // uint32_t |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
17 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
18 |
#include <climits> // INT_MAX |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
19 |
#include <cmath> // std::signbit |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
20 |
#include <cstring> // std::strlen |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
21 |
#include <iterator> // std::back_inserter |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
22 |
#include <list> // std::list |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
23 |
#include <memory> // std::unique_ptr |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
24 |
#include <type_traits> // std::is_default_constructible |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
25 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
26 |
#include "gtest-extra.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
27 |
#include "mock-allocator.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
28 |
#include "util.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
29 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
30 |
using fmt::basic_memory_buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
31 |
using fmt::format_error; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
32 |
using fmt::memory_buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
33 |
using fmt::runtime; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
34 |
using fmt::string_view; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
35 |
using fmt::detail::max_value; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
36 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
37 |
using testing::Return; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
38 |
using testing::StrictMock; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
39 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
40 |
enum { buffer_size = 256 }; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
41 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
42 |
struct uint32_pair { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
43 |
uint32_t u[2]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
44 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
45 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
46 |
TEST(util_test, bit_cast) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
47 |
auto s = fmt::detail::bit_cast<uint32_pair>(uint64_t{42}); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
48 |
EXPECT_EQ(fmt::detail::bit_cast<uint64_t>(s), 42ull); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
49 |
s = fmt::detail::bit_cast<uint32_pair>(~uint64_t{0}); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
50 |
EXPECT_EQ(fmt::detail::bit_cast<uint64_t>(s), ~0ull); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
51 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
52 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
53 |
// Increment a number in a string. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
54 |
void increment(char* s) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
55 |
for (int i = static_cast<int>(std::strlen(s)) - 1; i >= 0; --i) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
56 |
if (s[i] != '9') { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
57 |
++s[i]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
58 |
break; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
59 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
60 |
s[i] = '0'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
61 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
62 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
63 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
64 |
TEST(util_test, increment) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
65 |
char s[10] = "123"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
66 |
increment(s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
67 |
EXPECT_STREQ("124", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
68 |
s[2] = '8'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
69 |
increment(s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
70 |
EXPECT_STREQ("129", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
71 |
increment(s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
72 |
EXPECT_STREQ("130", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
73 |
s[1] = s[2] = '9'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
74 |
increment(s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
75 |
EXPECT_STREQ("200", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
76 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
77 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
78 |
TEST(util_test, parse_nonnegative_int) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
79 |
auto s = fmt::string_view("10000000000"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
80 |
auto begin = s.begin(), end = s.end(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
81 |
EXPECT_EQ(fmt::detail::parse_nonnegative_int(begin, end, -1), -1); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
82 |
s = "2147483649"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
83 |
begin = s.begin(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
84 |
end = s.end(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
85 |
EXPECT_EQ(fmt::detail::parse_nonnegative_int(begin, end, -1), -1); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
86 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
87 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
88 |
TEST(util_test, utf8_to_utf16) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
89 |
auto u = fmt::detail::utf8_to_utf16("лошадка"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
90 |
EXPECT_EQ(L"\x043B\x043E\x0448\x0430\x0434\x043A\x0430", u.str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
91 |
EXPECT_EQ(7, u.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
92 |
// U+10437 { DESERET SMALL LETTER YEE } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
93 |
EXPECT_EQ(L"\xD801\xDC37", fmt::detail::utf8_to_utf16("𐐷").str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
94 |
EXPECT_THROW_MSG(fmt::detail::utf8_to_utf16("\xc3\x28"), std::runtime_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
95 |
"invalid utf8"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
96 |
EXPECT_THROW_MSG(fmt::detail::utf8_to_utf16(fmt::string_view("л", 1)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
97 |
std::runtime_error, "invalid utf8"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
98 |
EXPECT_EQ(L"123456", fmt::detail::utf8_to_utf16("123456").str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
99 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
100 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
101 |
TEST(util_test, utf8_to_utf16_empty_string) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
102 |
auto s = std::string(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
103 |
auto u = fmt::detail::utf8_to_utf16(s.c_str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
104 |
EXPECT_EQ(L"", u.str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
105 |
EXPECT_EQ(s.size(), u.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
106 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
107 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
108 |
TEST(util_test, allocator_ref) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
109 |
using test_allocator_ref = allocator_ref<mock_allocator<int>>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
110 |
auto check_forwarding = [](mock_allocator<int>& alloc, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
111 |
test_allocator_ref& ref) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
112 |
int mem; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
113 |
// Check if value_type is properly defined. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
114 |
allocator_ref<mock_allocator<int>>::value_type* ptr = &mem; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
115 |
// Check forwarding. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
116 |
EXPECT_CALL(alloc, allocate(42)).WillOnce(Return(ptr)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
117 |
ref.allocate(42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
118 |
EXPECT_CALL(alloc, deallocate(ptr, 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
119 |
ref.deallocate(ptr, 42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
120 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
121 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
122 |
StrictMock<mock_allocator<int>> alloc; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
123 |
auto ref = test_allocator_ref(&alloc); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
124 |
// Check if allocator_ref forwards to the underlying allocator. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
125 |
check_forwarding(alloc, ref); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
126 |
test_allocator_ref ref2(ref); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
127 |
check_forwarding(alloc, ref2); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
128 |
test_allocator_ref ref3; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
129 |
EXPECT_EQ(nullptr, ref3.get()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
130 |
ref3 = ref; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
131 |
check_forwarding(alloc, ref3); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
132 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
133 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
134 |
TEST(util_test, format_system_error) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
135 |
fmt::memory_buffer message; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
136 |
fmt::format_system_error(message, EDOM, "test"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
137 |
auto ec = std::error_code(EDOM, std::generic_category()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
138 |
EXPECT_EQ(to_string(message), std::system_error(ec, "test").what()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
139 |
message = fmt::memory_buffer(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
140 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
141 |
// Check if std::allocator throws on allocating max size_t / 2 chars. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
142 |
size_t max_size = max_value<size_t>() / 2; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
143 |
bool throws_on_alloc = false; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
144 |
try { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
145 |
auto alloc = std::allocator<char>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
146 |
alloc.deallocate(alloc.allocate(max_size), max_size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
147 |
} catch (const std::bad_alloc&) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
148 |
throws_on_alloc = true; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
149 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
150 |
if (!throws_on_alloc) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
151 |
fmt::print("warning: std::allocator allocates {} chars", max_size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
152 |
return; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
153 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
154 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
155 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
156 |
TEST(util_test, system_error) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
157 |
auto test_error = fmt::system_error(EDOM, "test"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
158 |
auto ec = std::error_code(EDOM, std::generic_category()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
159 |
EXPECT_STREQ(test_error.what(), std::system_error(ec, "test").what()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
160 |
EXPECT_EQ(test_error.code(), ec); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
161 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
162 |
auto error = std::system_error(std::error_code()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
163 |
try { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
164 |
throw fmt::system_error(EDOM, "test {}", "error"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
165 |
} catch (const std::system_error& e) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
166 |
error = e; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
167 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
168 |
fmt::memory_buffer message; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
169 |
fmt::format_system_error(message, EDOM, "test error"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
170 |
EXPECT_EQ(error.what(), to_string(message)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
171 |
EXPECT_EQ(error.code(), std::error_code(EDOM, std::generic_category())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
172 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
173 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
174 |
TEST(util_test, report_system_error) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
175 |
fmt::memory_buffer out; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
176 |
fmt::format_system_error(out, EDOM, "test error"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
177 |
out.push_back('\n'); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
178 |
EXPECT_WRITE(stderr, fmt::report_system_error(EDOM, "test error"), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
179 |
to_string(out)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
180 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
181 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
182 |
TEST(memory_buffer_test, ctor) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
183 |
basic_memory_buffer<char, 123> buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
184 |
EXPECT_EQ(static_cast<size_t>(0), buffer.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
185 |
EXPECT_EQ(123u, buffer.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
186 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
187 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
188 |
using std_allocator = allocator_ref<std::allocator<char>>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
189 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
190 |
TEST(memory_buffer_test, move_ctor_inline_buffer) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
191 |
auto check_move_buffer = |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
192 |
[](const char* str, basic_memory_buffer<char, 5, std_allocator>& buffer) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
193 |
std::allocator<char>* alloc = buffer.get_allocator().get(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
194 |
basic_memory_buffer<char, 5, std_allocator> buffer2(std::move(buffer)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
195 |
// Move shouldn't destroy the inline content of the first buffer. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
196 |
EXPECT_EQ(str, std::string(&buffer[0], buffer.size())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
197 |
EXPECT_EQ(str, std::string(&buffer2[0], buffer2.size())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
198 |
EXPECT_EQ(5u, buffer2.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
199 |
// Move should transfer allocator. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
200 |
EXPECT_EQ(nullptr, buffer.get_allocator().get()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
201 |
EXPECT_EQ(alloc, buffer2.get_allocator().get()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
202 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
203 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
204 |
auto alloc = std::allocator<char>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
205 |
basic_memory_buffer<char, 5, std_allocator> buffer((std_allocator(&alloc))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
206 |
const char test[] = "test"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
207 |
buffer.append(string_view(test, 4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
208 |
check_move_buffer("test", buffer); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
209 |
// Adding one more character fills the inline buffer, but doesn't cause |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
210 |
// dynamic allocation. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
211 |
buffer.push_back('a'); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
212 |
check_move_buffer("testa", buffer); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
213 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
214 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
215 |
TEST(memory_buffer_test, move_ctor_dynamic_buffer) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
216 |
auto alloc = std::allocator<char>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
217 |
basic_memory_buffer<char, 4, std_allocator> buffer((std_allocator(&alloc))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
218 |
const char test[] = "test"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
219 |
buffer.append(test, test + 4); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
220 |
const char* inline_buffer_ptr = &buffer[0]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
221 |
// Adding one more character causes the content to move from the inline to |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
222 |
// a dynamically allocated buffer. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
223 |
buffer.push_back('a'); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
224 |
basic_memory_buffer<char, 4, std_allocator> buffer2(std::move(buffer)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
225 |
// Move should rip the guts of the first buffer. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
226 |
EXPECT_EQ(inline_buffer_ptr, &buffer[0]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
227 |
EXPECT_EQ("testa", std::string(&buffer2[0], buffer2.size())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
228 |
EXPECT_GT(buffer2.capacity(), 4u); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
229 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
230 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
231 |
void check_move_assign_buffer(const char* str, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
232 |
basic_memory_buffer<char, 5>& buffer) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
233 |
basic_memory_buffer<char, 5> buffer2; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
234 |
buffer2 = std::move(buffer); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
235 |
// Move shouldn't destroy the inline content of the first buffer. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
236 |
EXPECT_EQ(str, std::string(&buffer[0], buffer.size())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
237 |
EXPECT_EQ(str, std::string(&buffer2[0], buffer2.size())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
238 |
EXPECT_EQ(5u, buffer2.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
239 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
240 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
241 |
TEST(memory_buffer_test, move_assignment) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
242 |
basic_memory_buffer<char, 5> buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
243 |
const char test[] = "test"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
244 |
buffer.append(test, test + 4); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
245 |
check_move_assign_buffer("test", buffer); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
246 |
// Adding one more character fills the inline buffer, but doesn't cause |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
247 |
// dynamic allocation. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
248 |
buffer.push_back('a'); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
249 |
check_move_assign_buffer("testa", buffer); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
250 |
const char* inline_buffer_ptr = &buffer[0]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
251 |
// Adding one more character causes the content to move from the inline to |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
252 |
// a dynamically allocated buffer. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
253 |
buffer.push_back('b'); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
254 |
basic_memory_buffer<char, 5> buffer2; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
255 |
buffer2 = std::move(buffer); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
256 |
// Move should rip the guts of the first buffer. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
257 |
EXPECT_EQ(inline_buffer_ptr, &buffer[0]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
258 |
EXPECT_EQ("testab", std::string(&buffer2[0], buffer2.size())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
259 |
EXPECT_GT(buffer2.capacity(), 5u); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
260 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
261 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
262 |
TEST(memory_buffer_test, grow) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
263 |
typedef allocator_ref<mock_allocator<int>> Allocator; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
264 |
mock_allocator<int> alloc; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
265 |
basic_memory_buffer<int, 10, Allocator> buffer((Allocator(&alloc))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
266 |
buffer.resize(7); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
267 |
using fmt::detail::to_unsigned; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
268 |
for (int i = 0; i < 7; ++i) buffer[to_unsigned(i)] = i * i; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
269 |
EXPECT_EQ(10u, buffer.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
270 |
int mem[20]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
271 |
mem[7] = 0xdead; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
272 |
EXPECT_CALL(alloc, allocate(20)).WillOnce(Return(mem)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
273 |
buffer.try_reserve(20); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
274 |
EXPECT_EQ(20u, buffer.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
275 |
// Check if size elements have been copied |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
276 |
for (int i = 0; i < 7; ++i) EXPECT_EQ(i * i, buffer[to_unsigned(i)]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
277 |
// and no more than that. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
278 |
EXPECT_EQ(0xdead, buffer[7]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
279 |
EXPECT_CALL(alloc, deallocate(mem, 20)); |
| 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 |
TEST(memory_buffer_test, allocator) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
283 |
using test_allocator = allocator_ref<mock_allocator<char>>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
284 |
basic_memory_buffer<char, 10, test_allocator> buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
285 |
EXPECT_EQ(nullptr, buffer.get_allocator().get()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
286 |
StrictMock<mock_allocator<char>> alloc; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
287 |
char mem; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
288 |
{ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
289 |
basic_memory_buffer<char, 10, test_allocator> buffer2( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
290 |
(test_allocator(&alloc))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
291 |
EXPECT_EQ(&alloc, buffer2.get_allocator().get()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
292 |
size_t size = 2 * fmt::inline_buffer_size; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
293 |
EXPECT_CALL(alloc, allocate(size)).WillOnce(Return(&mem)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
294 |
buffer2.reserve(size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
295 |
EXPECT_CALL(alloc, deallocate(&mem, size)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
296 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
297 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
298 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
299 |
TEST(memory_buffer_test, exception_in_deallocate) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
300 |
using test_allocator = allocator_ref<mock_allocator<char>>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
301 |
StrictMock<mock_allocator<char>> alloc; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
302 |
basic_memory_buffer<char, 10, test_allocator> buffer( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
303 |
(test_allocator(&alloc))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
304 |
size_t size = 2 * fmt::inline_buffer_size; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
305 |
auto mem = std::vector<char>(size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
306 |
{ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
307 |
EXPECT_CALL(alloc, allocate(size)).WillOnce(Return(&mem[0])); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
308 |
buffer.resize(size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
309 |
std::fill(&buffer[0], &buffer[0] + size, 'x'); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
310 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
311 |
auto mem2 = std::vector<char>(2 * size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
312 |
{ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
313 |
EXPECT_CALL(alloc, allocate(2 * size)).WillOnce(Return(&mem2[0])); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
314 |
auto e = std::exception(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
315 |
EXPECT_CALL(alloc, deallocate(&mem[0], size)).WillOnce(testing::Throw(e)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
316 |
EXPECT_THROW(buffer.reserve(2 * size), std::exception); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
317 |
EXPECT_EQ(&mem2[0], &buffer[0]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
318 |
// Check that the data has been copied. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
319 |
for (size_t i = 0; i < size; ++i) EXPECT_EQ('x', buffer[i]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
320 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
321 |
EXPECT_CALL(alloc, deallocate(&mem2[0], 2 * size)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
322 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
323 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
324 |
template <typename Allocator, size_t MaxSize> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
325 |
class max_size_allocator : public Allocator { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
326 |
public: |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
327 |
using typename Allocator::value_type; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
328 |
size_t max_size() const FMT_NOEXCEPT { return MaxSize; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
329 |
value_type* allocate(size_t n) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
330 |
if (n > max_size()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
331 |
throw std::length_error("size > max_size"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
332 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
333 |
return std::allocator_traits<Allocator>::allocate( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
334 |
*static_cast<Allocator*>(this), n); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
335 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
336 |
void deallocate(value_type* p, size_t n) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
337 |
std::allocator_traits<Allocator>::deallocate(*static_cast<Allocator*>(this), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
338 |
p, n); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
339 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
340 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
341 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
342 |
TEST(memory_buffer_test, max_size_allocator) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
343 |
// 160 = 128 + 32 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
344 |
using test_allocator = max_size_allocator<std::allocator<char>, 160>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
345 |
basic_memory_buffer<char, 10, test_allocator> buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
346 |
buffer.resize(128); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
347 |
// new_capacity = 128 + 128/2 = 192 > 160 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
348 |
buffer.resize(160); // Shouldn't throw. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
349 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
350 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
351 |
TEST(memory_buffer_test, max_size_allocator_overflow) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
352 |
using test_allocator = max_size_allocator<std::allocator<char>, 160>; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
353 |
basic_memory_buffer<char, 10, test_allocator> buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
354 |
EXPECT_THROW(buffer.resize(161), std::exception); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
355 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
356 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
357 |
TEST(format_test, escape) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
358 |
EXPECT_EQ("{", fmt::format("{{")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
359 |
EXPECT_EQ("before {", fmt::format("before {{")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
360 |
EXPECT_EQ("{ after", fmt::format("{{ after")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
361 |
EXPECT_EQ("before { after", fmt::format("before {{ after")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
362 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
363 |
EXPECT_EQ("}", fmt::format("}}")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
364 |
EXPECT_EQ("before }", fmt::format("before }}")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
365 |
EXPECT_EQ("} after", fmt::format("}} after")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
366 |
EXPECT_EQ("before } after", fmt::format("before }} after")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
367 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
368 |
EXPECT_EQ("{}", fmt::format("{{}}")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
369 |
EXPECT_EQ("{42}", fmt::format("{{{0}}}", 42)); |
| 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(format_test, unmatched_braces) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
373 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{")), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
374 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
375 |
EXPECT_THROW_MSG((void)fmt::format(runtime("}")), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
376 |
"unmatched '}' in format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
377 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0{}")), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
378 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
379 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
380 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
381 |
TEST(format_test, no_args) { EXPECT_EQ("test", fmt::format("test")); } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
382 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
383 |
TEST(format_test, args_in_different_positions) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
384 |
EXPECT_EQ("42", fmt::format("{0}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
385 |
EXPECT_EQ("before 42", fmt::format("before {0}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
386 |
EXPECT_EQ("42 after", fmt::format("{0} after", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
387 |
EXPECT_EQ("before 42 after", fmt::format("before {0} after", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
388 |
EXPECT_EQ("answer = 42", fmt::format("{0} = {1}", "answer", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
389 |
EXPECT_EQ("42 is the answer", fmt::format("{1} is the {0}", "answer", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
390 |
EXPECT_EQ("abracadabra", fmt::format("{0}{1}{0}", "abra", "cad")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
391 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
392 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
393 |
TEST(format_test, arg_errors) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
394 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{")), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
395 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
396 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{?}")), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
397 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
398 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0")), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
399 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
400 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0}")), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
401 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
402 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{00}"), 42), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
403 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
404 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
405 |
char format_str[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
406 |
safe_sprintf(format_str, "{%u", INT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
407 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str)), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
408 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
409 |
safe_sprintf(format_str, "{%u}", INT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
410 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str)), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
411 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
412 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
413 |
safe_sprintf(format_str, "{%u", INT_MAX + 1u); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
414 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str)), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
415 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
416 |
safe_sprintf(format_str, "{%u}", INT_MAX + 1u); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
417 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str)), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
418 |
"argument not found"); |
| 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 |
template <int N> struct test_format { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
422 |
template <typename... T> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
423 |
static std::string format(fmt::string_view fmt, const T&... args) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
424 |
return test_format<N - 1>::format(fmt, N - 1, args...); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
425 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
426 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
427 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
428 |
template <> struct test_format<0> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
429 |
template <typename... T> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
430 |
static std::string format(fmt::string_view fmt, const T&... args) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
431 |
return fmt::format(runtime(fmt), args...); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
432 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
433 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
434 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
435 |
TEST(format_test, many_args) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
436 |
EXPECT_EQ("19", test_format<20>::format("{19}")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
437 |
EXPECT_THROW_MSG(test_format<20>::format("{20}"), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
438 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
439 |
EXPECT_THROW_MSG(test_format<21>::format("{21}"), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
440 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
441 |
using fmt::detail::max_packed_args; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
442 |
std::string format_str = fmt::format("{{{}}}", max_packed_args + 1); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
443 |
EXPECT_THROW_MSG(test_format<max_packed_args>::format(format_str), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
444 |
format_error, "argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
445 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
446 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
447 |
TEST(format_test, named_arg) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
448 |
EXPECT_EQ("1/a/A", fmt::format("{_1}/{a_}/{A_}", fmt::arg("a_", 'a'), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
449 |
fmt::arg("A_", "A"), fmt::arg("_1", 1))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
450 |
EXPECT_EQ(" -42", fmt::format("{0:{width}}", -42, fmt::arg("width", 4))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
451 |
EXPECT_EQ("st", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
452 |
fmt::format("{0:.{precision}}", "str", fmt::arg("precision", 2))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
453 |
EXPECT_EQ("1 2", fmt::format("{} {two}", 1, fmt::arg("two", 2))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
454 |
EXPECT_EQ("42", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
455 |
fmt::format("{c}", fmt::arg("a", 0), fmt::arg("b", 0), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
456 |
fmt::arg("c", 42), fmt::arg("d", 0), fmt::arg("e", 0), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
457 |
fmt::arg("f", 0), fmt::arg("g", 0), fmt::arg("h", 0), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
458 |
fmt::arg("i", 0), fmt::arg("j", 0), fmt::arg("k", 0), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
459 |
fmt::arg("l", 0), fmt::arg("m", 0), fmt::arg("n", 0), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
460 |
fmt::arg("o", 0), fmt::arg("p", 0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
461 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{a}")), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
462 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
463 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{a}"), 42), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
464 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
465 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
466 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
467 |
TEST(format_test, auto_arg_index) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
468 |
EXPECT_EQ("abc", fmt::format("{}{}{}", 'a', 'b', 'c')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
469 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0}{}"), 'a', 'b'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
470 |
"cannot switch from manual to automatic argument indexing"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
471 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{}{0}"), 'a', 'b'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
472 |
"cannot switch from automatic to manual argument indexing"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
473 |
EXPECT_EQ("1.2", fmt::format("{:.{}}", 1.2345, 2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
474 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0}:.{}"), 1.2345, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
475 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
476 |
"cannot switch from manual to automatic argument indexing"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
477 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:.{0}}"), 1.2345, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
478 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
479 |
"cannot switch from automatic to manual argument indexing"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
480 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{}")), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
481 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
482 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
483 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
484 |
TEST(format_test, empty_specs) { EXPECT_EQ("42", fmt::format("{0:}", 42)); } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
485 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
486 |
TEST(format_test, left_align) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
487 |
EXPECT_EQ("42 ", fmt::format("{0:<4}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
488 |
EXPECT_EQ("42 ", fmt::format("{0:<4o}", 042)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
489 |
EXPECT_EQ("42 ", fmt::format("{0:<4x}", 0x42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
490 |
EXPECT_EQ("-42 ", fmt::format("{0:<5}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
491 |
EXPECT_EQ("42 ", fmt::format("{0:<5}", 42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
492 |
EXPECT_EQ("-42 ", fmt::format("{0:<5}", -42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
493 |
EXPECT_EQ("42 ", fmt::format("{0:<5}", 42ul)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
494 |
EXPECT_EQ("-42 ", fmt::format("{0:<5}", -42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
495 |
EXPECT_EQ("42 ", fmt::format("{0:<5}", 42ull)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
496 |
EXPECT_EQ("-42 ", fmt::format("{0:<5}", -42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
497 |
EXPECT_EQ("-42 ", fmt::format("{0:<5}", -42.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
498 |
EXPECT_EQ("c ", fmt::format("{0:<5}", 'c')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
499 |
EXPECT_EQ("abc ", fmt::format("{0:<5}", "abc")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
500 |
EXPECT_EQ("0xface ", fmt::format("{0:<8}", reinterpret_cast<void*>(0xface))); |
| 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(format_test, right_align) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
504 |
EXPECT_EQ(" 42", fmt::format("{0:>4}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
505 |
EXPECT_EQ(" 42", fmt::format("{0:>4o}", 042)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
506 |
EXPECT_EQ(" 42", fmt::format("{0:>4x}", 0x42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
507 |
EXPECT_EQ(" -42", fmt::format("{0:>5}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
508 |
EXPECT_EQ(" 42", fmt::format("{0:>5}", 42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
509 |
EXPECT_EQ(" -42", fmt::format("{0:>5}", -42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
510 |
EXPECT_EQ(" 42", fmt::format("{0:>5}", 42ul)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
511 |
EXPECT_EQ(" -42", fmt::format("{0:>5}", -42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
512 |
EXPECT_EQ(" 42", fmt::format("{0:>5}", 42ull)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
513 |
EXPECT_EQ(" -42", fmt::format("{0:>5}", -42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
514 |
EXPECT_EQ(" -42", fmt::format("{0:>5}", -42.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
515 |
EXPECT_EQ(" c", fmt::format("{0:>5}", 'c')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
516 |
EXPECT_EQ(" abc", fmt::format("{0:>5}", "abc")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
517 |
EXPECT_EQ(" 0xface", fmt::format("{0:>8}", reinterpret_cast<void*>(0xface))); |
| 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(format_test, center_align) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
521 |
EXPECT_EQ(" 42 ", fmt::format("{0:^5}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
522 |
EXPECT_EQ(" 42 ", fmt::format("{0:^5o}", 042)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
523 |
EXPECT_EQ(" 42 ", fmt::format("{0:^5x}", 0x42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
524 |
EXPECT_EQ(" -42 ", fmt::format("{0:^5}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
525 |
EXPECT_EQ(" 42 ", fmt::format("{0:^5}", 42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
526 |
EXPECT_EQ(" -42 ", fmt::format("{0:^5}", -42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
527 |
EXPECT_EQ(" 42 ", fmt::format("{0:^5}", 42ul)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
528 |
EXPECT_EQ(" -42 ", fmt::format("{0:^5}", -42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
529 |
EXPECT_EQ(" 42 ", fmt::format("{0:^5}", 42ull)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
530 |
EXPECT_EQ(" -42 ", fmt::format("{0:^5}", -42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
531 |
EXPECT_EQ(" -42 ", fmt::format("{0:^5}", -42.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
532 |
EXPECT_EQ(" c ", fmt::format("{0:^5}", 'c')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
533 |
EXPECT_EQ(" abc ", fmt::format("{0:^6}", "abc")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
534 |
EXPECT_EQ(" 0xface ", fmt::format("{0:^8}", reinterpret_cast<void*>(0xface))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
535 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
536 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
537 |
TEST(format_test, fill) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
538 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{<5}"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
539 |
"invalid fill character '{'"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
540 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{<5}}"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
541 |
"invalid fill character '{'"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
542 |
EXPECT_EQ("**42", fmt::format("{0:*>4}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
543 |
EXPECT_EQ("**-42", fmt::format("{0:*>5}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
544 |
EXPECT_EQ("***42", fmt::format("{0:*>5}", 42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
545 |
EXPECT_EQ("**-42", fmt::format("{0:*>5}", -42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
546 |
EXPECT_EQ("***42", fmt::format("{0:*>5}", 42ul)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
547 |
EXPECT_EQ("**-42", fmt::format("{0:*>5}", -42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
548 |
EXPECT_EQ("***42", fmt::format("{0:*>5}", 42ull)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
549 |
EXPECT_EQ("**-42", fmt::format("{0:*>5}", -42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
550 |
EXPECT_EQ("**-42", fmt::format("{0:*>5}", -42.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
551 |
EXPECT_EQ("c****", fmt::format("{0:*<5}", 'c')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
552 |
EXPECT_EQ("abc**", fmt::format("{0:*<5}", "abc")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
553 |
EXPECT_EQ("**0xface", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
554 |
fmt::format("{0:*>8}", reinterpret_cast<void*>(0xface))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
555 |
EXPECT_EQ("foo=", fmt::format("{:}=", "foo")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
556 |
EXPECT_EQ(std::string("\0\0\0*", 4), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
557 |
fmt::format(string_view("{:\0>4}", 6), '*')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
558 |
EXPECT_EQ("жж42", fmt::format("{0:ж>4}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
559 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:\x80\x80\x80\x80\x80>}"), 0), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
560 |
format_error, "invalid type specifier"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
561 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
562 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
563 |
TEST(format_test, plus_sign) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
564 |
EXPECT_EQ("+42", fmt::format("{0:+}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
565 |
EXPECT_EQ("-42", fmt::format("{0:+}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
566 |
EXPECT_EQ("+42", fmt::format("{0:+}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
567 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), 42u), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
568 |
"format specifier requires signed argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
569 |
EXPECT_EQ("+42", fmt::format("{0:+}", 42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
570 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), 42ul), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
571 |
"format specifier requires signed argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
572 |
EXPECT_EQ("+42", fmt::format("{0:+}", 42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
573 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), 42ull), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
574 |
"format specifier requires signed argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
575 |
EXPECT_EQ("+42", fmt::format("{0:+}", 42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
576 |
EXPECT_EQ("+42", fmt::format("{0:+}", 42.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
577 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
578 |
"missing '}' in format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
579 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
580 |
"invalid format specifier for char"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
581 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:+}"), "abc"), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
582 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
583 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
584 |
(void)fmt::format(runtime("{0:+}"), reinterpret_cast<void*>(0x42)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
585 |
format_error, "format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
586 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
587 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
588 |
TEST(format_test, minus_sign) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
589 |
EXPECT_EQ("42", fmt::format("{0:-}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
590 |
EXPECT_EQ("-42", fmt::format("{0:-}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
591 |
EXPECT_EQ("42", fmt::format("{0:-}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
592 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), 42u), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
593 |
"format specifier requires signed argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
594 |
EXPECT_EQ("42", fmt::format("{0:-}", 42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
595 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), 42ul), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
596 |
"format specifier requires signed argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
597 |
EXPECT_EQ("42", fmt::format("{0:-}", 42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
598 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), 42ull), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
599 |
"format specifier requires signed argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
600 |
EXPECT_EQ("42", fmt::format("{0:-}", 42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
601 |
EXPECT_EQ("42", fmt::format("{0:-}", 42.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
602 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
603 |
"missing '}' in format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
604 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
605 |
"invalid format specifier for char"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
606 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:-}"), "abc"), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
607 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
608 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
609 |
(void)fmt::format(runtime("{0:-}"), reinterpret_cast<void*>(0x42)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
610 |
format_error, "format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
611 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
612 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
613 |
TEST(format_test, space_sign) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
614 |
EXPECT_EQ(" 42", fmt::format("{0: }", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
615 |
EXPECT_EQ("-42", fmt::format("{0: }", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
616 |
EXPECT_EQ(" 42", fmt::format("{0: }", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
617 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), 42u), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
618 |
"format specifier requires signed argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
619 |
EXPECT_EQ(" 42", fmt::format("{0: }", 42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
620 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), 42ul), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
621 |
"format specifier requires signed argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
622 |
EXPECT_EQ(" 42", fmt::format("{0: }", 42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
623 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), 42ull), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
624 |
"format specifier requires signed argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
625 |
EXPECT_EQ(" 42", fmt::format("{0: }", 42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
626 |
EXPECT_EQ(" 42", fmt::format("{0: }", 42.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
627 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: "), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
628 |
"missing '}' in format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
629 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
630 |
"invalid format specifier for char"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
631 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0: }"), "abc"), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
632 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
633 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
634 |
(void)fmt::format(runtime("{0: }"), reinterpret_cast<void*>(0x42)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
635 |
format_error, "format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
636 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
637 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
638 |
TEST(format_test, hash_flag) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
639 |
EXPECT_EQ("42", fmt::format("{0:#}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
640 |
EXPECT_EQ("-42", fmt::format("{0:#}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
641 |
EXPECT_EQ("0b101010", fmt::format("{0:#b}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
642 |
EXPECT_EQ("0B101010", fmt::format("{0:#B}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
643 |
EXPECT_EQ("-0b101010", fmt::format("{0:#b}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
644 |
EXPECT_EQ("0x42", fmt::format("{0:#x}", 0x42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
645 |
EXPECT_EQ("0X42", fmt::format("{0:#X}", 0x42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
646 |
EXPECT_EQ("-0x42", fmt::format("{0:#x}", -0x42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
647 |
EXPECT_EQ("0", fmt::format("{0:#o}", 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
648 |
EXPECT_EQ("042", fmt::format("{0:#o}", 042)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
649 |
EXPECT_EQ("-042", fmt::format("{0:#o}", -042)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
650 |
EXPECT_EQ("42", fmt::format("{0:#}", 42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
651 |
EXPECT_EQ("0x42", fmt::format("{0:#x}", 0x42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
652 |
EXPECT_EQ("042", fmt::format("{0:#o}", 042u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
653 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
654 |
EXPECT_EQ("-42", fmt::format("{0:#}", -42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
655 |
EXPECT_EQ("0x42", fmt::format("{0:#x}", 0x42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
656 |
EXPECT_EQ("-0x42", fmt::format("{0:#x}", -0x42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
657 |
EXPECT_EQ("042", fmt::format("{0:#o}", 042l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
658 |
EXPECT_EQ("-042", fmt::format("{0:#o}", -042l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
659 |
EXPECT_EQ("42", fmt::format("{0:#}", 42ul)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
660 |
EXPECT_EQ("0x42", fmt::format("{0:#x}", 0x42ul)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
661 |
EXPECT_EQ("042", fmt::format("{0:#o}", 042ul)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
662 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
663 |
EXPECT_EQ("-42", fmt::format("{0:#}", -42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
664 |
EXPECT_EQ("0x42", fmt::format("{0:#x}", 0x42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
665 |
EXPECT_EQ("-0x42", fmt::format("{0:#x}", -0x42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
666 |
EXPECT_EQ("042", fmt::format("{0:#o}", 042ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
667 |
EXPECT_EQ("-042", fmt::format("{0:#o}", -042ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
668 |
EXPECT_EQ("42", fmt::format("{0:#}", 42ull)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
669 |
EXPECT_EQ("0x42", fmt::format("{0:#x}", 0x42ull)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
670 |
EXPECT_EQ("042", fmt::format("{0:#o}", 042ull)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
671 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
672 |
EXPECT_EQ("-42.0", fmt::format("{0:#}", -42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
673 |
EXPECT_EQ("-42.0", fmt::format("{0:#}", -42.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
674 |
EXPECT_EQ("4.e+01", fmt::format("{:#.0e}", 42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
675 |
EXPECT_EQ("0.", fmt::format("{:#.0f}", 0.01)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
676 |
EXPECT_EQ("0.50", fmt::format("{:#.2g}", 0.5)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
677 |
EXPECT_EQ("0.", fmt::format("{:#.0f}", 0.5)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
678 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:#"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
679 |
"missing '}' in format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
680 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:#}"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
681 |
"invalid format specifier for char"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
682 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:#}"), "abc"), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
683 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
684 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
685 |
(void)fmt::format(runtime("{0:#}"), reinterpret_cast<void*>(0x42)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
686 |
format_error, "format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
687 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
688 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
689 |
TEST(format_test, zero_flag) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
690 |
EXPECT_EQ("42", fmt::format("{0:0}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
691 |
EXPECT_EQ("-0042", fmt::format("{0:05}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
692 |
EXPECT_EQ("00042", fmt::format("{0:05}", 42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
693 |
EXPECT_EQ("-0042", fmt::format("{0:05}", -42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
694 |
EXPECT_EQ("00042", fmt::format("{0:05}", 42ul)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
695 |
EXPECT_EQ("-0042", fmt::format("{0:05}", -42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
696 |
EXPECT_EQ("00042", fmt::format("{0:05}", 42ull)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
697 |
EXPECT_EQ("-000042", fmt::format("{0:07}", -42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
698 |
EXPECT_EQ("-000042", fmt::format("{0:07}", -42.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
699 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:0"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
700 |
"missing '}' in format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
701 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:05}"), 'c'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
702 |
"invalid format specifier for char"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
703 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:05}"), "abc"), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
704 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
705 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
706 |
(void)fmt::format(runtime("{0:05}"), reinterpret_cast<void*>(0x42)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
707 |
format_error, "format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
708 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
709 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
710 |
TEST(format_test, width) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
711 |
char format_str[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
712 |
safe_sprintf(format_str, "{0:%u", UINT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
713 |
increment(format_str + 3); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
714 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
715 |
"number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
716 |
size_t size = std::strlen(format_str); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
717 |
format_str[size] = '}'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
718 |
format_str[size + 1] = 0; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
719 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
720 |
"number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
721 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
722 |
safe_sprintf(format_str, "{0:%u", INT_MAX + 1u); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
723 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
724 |
"number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
725 |
safe_sprintf(format_str, "{0:%u}", INT_MAX + 1u); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
726 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
727 |
"number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
728 |
EXPECT_EQ(" -42", fmt::format("{0:4}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
729 |
EXPECT_EQ(" 42", fmt::format("{0:5}", 42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
730 |
EXPECT_EQ(" -42", fmt::format("{0:6}", -42l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
731 |
EXPECT_EQ(" 42", fmt::format("{0:7}", 42ul)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
732 |
EXPECT_EQ(" -42", fmt::format("{0:6}", -42ll)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
733 |
EXPECT_EQ(" 42", fmt::format("{0:7}", 42ull)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
734 |
EXPECT_EQ(" -1.23", fmt::format("{0:8}", -1.23)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
735 |
EXPECT_EQ(" -1.23", fmt::format("{0:9}", -1.23l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
736 |
EXPECT_EQ(" 0xcafe", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
737 |
fmt::format("{0:10}", reinterpret_cast<void*>(0xcafe))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
738 |
EXPECT_EQ("x ", fmt::format("{0:11}", 'x')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
739 |
EXPECT_EQ("str ", fmt::format("{0:12}", "str")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
740 |
EXPECT_EQ(fmt::format("{:*^6}", "🤡"), "**🤡**"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
741 |
EXPECT_EQ(fmt::format("{:*^8}", "你好"), "**你好**"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
742 |
EXPECT_EQ(fmt::format("{:#6}", 42.0), " 42.0"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
743 |
EXPECT_EQ(fmt::format("{:6c}", static_cast<int>('x')), "x "); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
744 |
EXPECT_EQ(fmt::format("{:>06.0f}", 0.00884311), "000000"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
745 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
746 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
747 |
TEST(format_test, runtime_width) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
748 |
char format_str[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
749 |
safe_sprintf(format_str, "{0:{%u", UINT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
750 |
increment(format_str + 4); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
751 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
752 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
753 |
size_t size = std::strlen(format_str); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
754 |
format_str[size] = '}'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
755 |
format_str[size + 1] = 0; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
756 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
757 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
758 |
format_str[size + 1] = '}'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
759 |
format_str[size + 2] = 0; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
760 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
761 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
762 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
763 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
764 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
765 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{}"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
766 |
"cannot switch from manual to automatic argument indexing"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
767 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{?}}"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
768 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
769 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
770 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
771 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
772 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{0:}}"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
773 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
774 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
775 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, -1), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
776 |
"negative width"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
777 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, (INT_MAX + 1u)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
778 |
format_error, "number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
779 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, -1l), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
780 |
"negative width"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
781 |
if (fmt::detail::const_check(sizeof(long) > sizeof(int))) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
782 |
long value = INT_MAX; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
783 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, (value + 1)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
784 |
format_error, "number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
785 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
786 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, (INT_MAX + 1ul)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
787 |
format_error, "number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
788 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
789 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, '0'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
790 |
"width is not integer"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
791 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{1}}"), 0, 0.0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
792 |
"width is not integer"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
793 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
794 |
EXPECT_EQ(" -42", fmt::format("{0:{1}}", -42, 4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
795 |
EXPECT_EQ(" 42", fmt::format("{0:{1}}", 42u, 5)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
796 |
EXPECT_EQ(" -42", fmt::format("{0:{1}}", -42l, 6)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
797 |
EXPECT_EQ(" 42", fmt::format("{0:{1}}", 42ul, 7)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
798 |
EXPECT_EQ(" -42", fmt::format("{0:{1}}", -42ll, 6)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
799 |
EXPECT_EQ(" 42", fmt::format("{0:{1}}", 42ull, 7)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
800 |
EXPECT_EQ(" -1.23", fmt::format("{0:{1}}", -1.23, 8)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
801 |
EXPECT_EQ(" -1.23", fmt::format("{0:{1}}", -1.23l, 9)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
802 |
EXPECT_EQ(" 0xcafe", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
803 |
fmt::format("{0:{1}}", reinterpret_cast<void*>(0xcafe), 10)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
804 |
EXPECT_EQ("x ", fmt::format("{0:{1}}", 'x', 11)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
805 |
EXPECT_EQ("str ", fmt::format("{0:{1}}", "str", 12)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
806 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
807 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
808 |
TEST(format_test, precision) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
809 |
char format_str[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
810 |
safe_sprintf(format_str, "{0:.%u", UINT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
811 |
increment(format_str + 4); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
812 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
813 |
"number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
814 |
size_t size = std::strlen(format_str); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
815 |
format_str[size] = '}'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
816 |
format_str[size + 1] = 0; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
817 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
818 |
"number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
819 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
820 |
safe_sprintf(format_str, "{0:.%u", INT_MAX + 1u); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
821 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
822 |
"number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
823 |
safe_sprintf(format_str, "{0:.%u}", INT_MAX + 1u); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
824 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
825 |
"number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
826 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
827 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:."), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
828 |
"missing precision specifier"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
829 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.}"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
830 |
"missing precision specifier"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
831 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
832 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
833 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
834 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
835 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
836 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
837 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
838 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42u), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
839 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
840 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42u), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
841 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
842 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42l), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
843 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
844 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42l), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
845 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
846 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42ul), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
847 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
848 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42ul), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
849 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
850 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42ll), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
851 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
852 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42ll), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
853 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
854 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2}"), 42ull), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
855 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
856 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.2f}"), 42ull), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
857 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
858 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:3.0}"), 'x'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
859 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
860 |
EXPECT_EQ("1.2", fmt::format("{0:.2}", 1.2345)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
861 |
EXPECT_EQ("1.2", fmt::format("{0:.2}", 1.2345l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
862 |
EXPECT_EQ("1.2e+56", fmt::format("{:.2}", 1.234e56)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
863 |
EXPECT_EQ("1.1", fmt::format("{0:.3}", 1.1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
864 |
EXPECT_EQ("1e+00", fmt::format("{:.0e}", 1.0L)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
865 |
EXPECT_EQ(" 0.0e+00", fmt::format("{:9.1e}", 0.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
866 |
EXPECT_EQ( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
867 |
fmt::format("{:.494}", 4.9406564584124654E-324), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
868 |
"4.9406564584124654417656879286822137236505980261432476442558568250067550" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
869 |
"727020875186529983636163599237979656469544571773092665671035593979639877" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
870 |
"479601078187812630071319031140452784581716784898210368871863605699873072" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
871 |
"305000638740915356498438731247339727316961514003171538539807412623856559" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
872 |
"117102665855668676818703956031062493194527159149245532930545654440112748" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
873 |
"012970999954193198940908041656332452475714786901472678015935523861155013" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
874 |
"480352649347201937902681071074917033322268447533357208324319361e-324"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
875 |
EXPECT_EQ( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
876 |
fmt::format("{:.1074f}", 1.1125369292536e-308), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
877 |
"0.0000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
878 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
879 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
880 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
881 |
"000000000000000000000111253692925360019747947051741965785554081512200979" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
882 |
"355021686109411883779182127659725163430929750364498219730822952552570601" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
883 |
"152163505899912777129583674906301179059298598412303893909188340988729019" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
884 |
"014361467448914817838555156840459458527907308695109202499990850735085304" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
885 |
"478476991912072201449236975063640913461919914396877093174125167509869762" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
886 |
"482369631100360266123742648159508919592746619553246586039571522788247697" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
887 |
"156360766271842991667238355464496455107749716934387136380536472531224398" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
888 |
"559833794807213172371254492216255558078524900147957309382830827524104234" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
889 |
"530961756787819847850302379672357738807808384667004752163416921762619527" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
890 |
"462847642037420991432005657440259928195996762610375541867198059294212446" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
891 |
"81962777939941034720757232455434770912461317493580281734466552734375"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
892 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
893 |
std::string outputs[] = { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
894 |
"-0X1.41FE3FFE71C9E000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
895 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
896 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
897 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
898 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
899 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
900 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
901 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
902 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
903 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
904 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
905 |
"000000000000000000000000000000000000000000000000000P+127", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
906 |
"-0XA.0FF1FFF38E4F0000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
907 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
908 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
909 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
910 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
911 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
912 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
913 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
914 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
915 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
916 |
"000000000000000000000000000000000000000000000000000000000000000000000000" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
917 |
"000000000000000000000000000000000000000000000000000P+124"}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
918 |
EXPECT_THAT(outputs, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
919 |
testing::Contains(fmt::format("{:.838A}", -2.14001164E+38))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
920 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
921 |
EXPECT_EQ("123.", fmt::format("{:#.0f}", 123.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
922 |
EXPECT_EQ("1.23", fmt::format("{:.02f}", 1.234)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
923 |
EXPECT_EQ("0.001", fmt::format("{:.1g}", 0.001)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
924 |
EXPECT_EQ("1019666400", fmt::format("{}", 1019666432.0f)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
925 |
EXPECT_EQ("1e+01", fmt::format("{:.0e}", 9.5)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
926 |
EXPECT_EQ("1.0e-34", fmt::format("{:.1e}", 1e-34)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
927 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
928 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
929 |
(void)fmt::format(runtime("{0:.2}"), reinterpret_cast<void*>(0xcafe)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
930 |
format_error, "precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
931 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
932 |
(void)fmt::format(runtime("{0:.2f}"), reinterpret_cast<void*>(0xcafe)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
933 |
format_error, "precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
934 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:.{}e}"), 42.0, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
935 |
fmt::detail::max_value<int>()), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
936 |
format_error, "number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
937 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
938 |
(void)fmt::format("{:.2147483646f}", -2.2121295195081227E+304), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
939 |
format_error, "number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
940 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
941 |
EXPECT_EQ("st", fmt::format("{0:.2}", "str")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
942 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
943 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
944 |
TEST(format_test, runtime_precision) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
945 |
char format_str[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
946 |
safe_sprintf(format_str, "{0:.{%u", UINT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
947 |
increment(format_str + 5); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
948 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
949 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
950 |
size_t size = std::strlen(format_str); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
951 |
format_str[size] = '}'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
952 |
format_str[size + 1] = 0; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
953 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
954 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
955 |
format_str[size + 1] = '}'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
956 |
format_str[size + 2] = 0; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
957 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
958 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
959 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
960 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
961 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
962 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{}"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
963 |
"cannot switch from manual to automatic argument indexing"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
964 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{?}}"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
965 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
966 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}"), 0, 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
967 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
968 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
969 |
"argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
970 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
971 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{0:}}"), 0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
972 |
"invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
973 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
974 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0, -1), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
975 |
"negative precision"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
976 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0, (INT_MAX + 1u)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
977 |
format_error, "number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
978 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0, -1l), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
979 |
"negative precision"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
980 |
if (fmt::detail::const_check(sizeof(long) > sizeof(int))) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
981 |
long value = INT_MAX; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
982 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0, (value + 1)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
983 |
format_error, "number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
984 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
985 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0, (INT_MAX + 1ul)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
986 |
format_error, "number is too big"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
987 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
988 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0, '0'), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
989 |
"precision is not integer"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
990 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 0, 0.0), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
991 |
"precision is not integer"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
992 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
993 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42, 2), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
994 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
995 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42, 2), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
996 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
997 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42u, 2), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
998 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
999 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42u, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1000 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1001 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1002 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42l, 2), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1003 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1004 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42l, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1005 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1006 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1007 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42ul, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1008 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1009 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1010 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42ul, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1011 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1012 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1013 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42ll, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1014 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1015 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1016 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42ll, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1017 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1018 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1019 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), 42ull, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1020 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1021 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1022 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), 42ull, 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1023 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1024 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1025 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:3.{1}}"), 'x', 0), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1026 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1027 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1028 |
EXPECT_EQ("1.2", fmt::format("{0:.{1}}", 1.2345, 2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1029 |
EXPECT_EQ("1.2", fmt::format("{1:.{0}}", 2, 1.2345l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1030 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1031 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}}"), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1032 |
reinterpret_cast<void*>(0xcafe), 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1033 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1034 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1035 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:.{1}f}"), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1036 |
reinterpret_cast<void*>(0xcafe), 2), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1037 |
format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1038 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1039 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1040 |
EXPECT_EQ("st", fmt::format("{0:.{1}}", "str", 2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1041 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1042 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1043 |
TEST(format_test, format_bool) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1044 |
EXPECT_EQ("true", fmt::format("{}", true)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1045 |
EXPECT_EQ("false", fmt::format("{}", false)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1046 |
EXPECT_EQ("1", fmt::format("{:d}", true)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1047 |
EXPECT_EQ("true ", fmt::format("{:5}", true)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1048 |
EXPECT_EQ("true", fmt::format("{:s}", true)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1049 |
EXPECT_EQ("false", fmt::format("{:s}", false)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1050 |
EXPECT_EQ("false ", fmt::format("{:6s}", false)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1051 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1052 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1053 |
TEST(format_test, format_short) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1054 |
short s = 42; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1055 |
EXPECT_EQ("42", fmt::format("{0:d}", s)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1056 |
unsigned short us = 42; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1057 |
EXPECT_EQ("42", fmt::format("{0:d}", us)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1058 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1059 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1060 |
template <typename T> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1061 |
void check_unknown_types(const T& value, const char* types, const char*) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1062 |
char format_str[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1063 |
const char* special = ".0123456789L}"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1064 |
for (int i = CHAR_MIN; i <= CHAR_MAX; ++i) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1065 |
char c = static_cast<char>(i); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1066 |
if (std::strchr(types, c) || std::strchr(special, c) || !c) continue; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1067 |
safe_sprintf(format_str, "{0:10%c}", c); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1068 |
const char* message = "invalid type specifier"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1069 |
EXPECT_THROW_MSG((void)fmt::format(runtime(format_str), value), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1070 |
format_error, message) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1071 |
<< format_str << " " << message; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1072 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1073 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1074 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1075 |
TEST(format_test, format_int) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1076 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:v"), 42), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1077 |
"invalid type specifier"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1078 |
check_unknown_types(42, "bBdoxXnLc", "integer"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1079 |
EXPECT_EQ("x", fmt::format("{:c}", static_cast<int>('x'))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1080 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1081 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1082 |
TEST(format_test, format_bin) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1083 |
EXPECT_EQ("0", fmt::format("{0:b}", 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1084 |
EXPECT_EQ("101010", fmt::format("{0:b}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1085 |
EXPECT_EQ("101010", fmt::format("{0:b}", 42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1086 |
EXPECT_EQ("-101010", fmt::format("{0:b}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1087 |
EXPECT_EQ("11000000111001", fmt::format("{0:b}", 12345)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1088 |
EXPECT_EQ("10010001101000101011001111000", fmt::format("{0:b}", 0x12345678)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1089 |
EXPECT_EQ("10010000101010111100110111101111", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1090 |
fmt::format("{0:b}", 0x90ABCDEF)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1091 |
EXPECT_EQ("11111111111111111111111111111111", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1092 |
fmt::format("{0:b}", max_value<uint32_t>())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1093 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1094 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1095 |
#if FMT_USE_INT128 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1096 |
constexpr auto int128_max = static_cast<__int128_t>( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1097 |
(static_cast<__uint128_t>(1) << ((__SIZEOF_INT128__ * CHAR_BIT) - 1)) - 1); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1098 |
constexpr auto int128_min = -int128_max - 1; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1099 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1100 |
constexpr auto uint128_max = ~static_cast<__uint128_t>(0); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1101 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1102 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1103 |
TEST(format_test, format_dec) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1104 |
EXPECT_EQ("0", fmt::format("{0}", 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1105 |
EXPECT_EQ("42", fmt::format("{0}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1106 |
EXPECT_EQ("42", fmt::format("{0:d}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1107 |
EXPECT_EQ("42", fmt::format("{0}", 42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1108 |
EXPECT_EQ("-42", fmt::format("{0}", -42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1109 |
EXPECT_EQ("12345", fmt::format("{0}", 12345)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1110 |
EXPECT_EQ("67890", fmt::format("{0}", 67890)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1111 |
#if FMT_USE_INT128 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1112 |
EXPECT_EQ("0", fmt::format("{0}", static_cast<__int128_t>(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1113 |
EXPECT_EQ("0", fmt::format("{0}", static_cast<__uint128_t>(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1114 |
EXPECT_EQ("9223372036854775808", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1115 |
fmt::format("{0}", static_cast<__int128_t>(INT64_MAX) + 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1116 |
EXPECT_EQ("-9223372036854775809", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1117 |
fmt::format("{0}", static_cast<__int128_t>(INT64_MIN) - 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1118 |
EXPECT_EQ("18446744073709551616", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1119 |
fmt::format("{0}", static_cast<__int128_t>(UINT64_MAX) + 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1120 |
EXPECT_EQ("170141183460469231731687303715884105727", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1121 |
fmt::format("{0}", int128_max)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1122 |
EXPECT_EQ("-170141183460469231731687303715884105728", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1123 |
fmt::format("{0}", int128_min)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1124 |
EXPECT_EQ("340282366920938463463374607431768211455", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1125 |
fmt::format("{0}", uint128_max)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1126 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1127 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1128 |
char buffer[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1129 |
safe_sprintf(buffer, "%d", INT_MIN); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1130 |
EXPECT_EQ(buffer, fmt::format("{0}", INT_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1131 |
safe_sprintf(buffer, "%d", INT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1132 |
EXPECT_EQ(buffer, fmt::format("{0}", INT_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1133 |
safe_sprintf(buffer, "%u", UINT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1134 |
EXPECT_EQ(buffer, fmt::format("{0}", UINT_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1135 |
safe_sprintf(buffer, "%ld", 0 - static_cast<unsigned long>(LONG_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1136 |
EXPECT_EQ(buffer, fmt::format("{0}", LONG_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1137 |
safe_sprintf(buffer, "%ld", LONG_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1138 |
EXPECT_EQ(buffer, fmt::format("{0}", LONG_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1139 |
safe_sprintf(buffer, "%lu", ULONG_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1140 |
EXPECT_EQ(buffer, fmt::format("{0}", ULONG_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1141 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1142 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1143 |
TEST(format_test, format_hex) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1144 |
EXPECT_EQ("0", fmt::format("{0:x}", 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1145 |
EXPECT_EQ("42", fmt::format("{0:x}", 0x42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1146 |
EXPECT_EQ("42", fmt::format("{0:x}", 0x42u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1147 |
EXPECT_EQ("-42", fmt::format("{0:x}", -0x42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1148 |
EXPECT_EQ("12345678", fmt::format("{0:x}", 0x12345678)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1149 |
EXPECT_EQ("90abcdef", fmt::format("{0:x}", 0x90abcdef)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1150 |
EXPECT_EQ("12345678", fmt::format("{0:X}", 0x12345678)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1151 |
EXPECT_EQ("90ABCDEF", fmt::format("{0:X}", 0x90ABCDEF)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1152 |
#if FMT_USE_INT128 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1153 |
EXPECT_EQ("0", fmt::format("{0:x}", static_cast<__int128_t>(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1154 |
EXPECT_EQ("0", fmt::format("{0:x}", static_cast<__uint128_t>(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1155 |
EXPECT_EQ("8000000000000000", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1156 |
fmt::format("{0:x}", static_cast<__int128_t>(INT64_MAX) + 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1157 |
EXPECT_EQ("-8000000000000001", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1158 |
fmt::format("{0:x}", static_cast<__int128_t>(INT64_MIN) - 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1159 |
EXPECT_EQ("10000000000000000", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1160 |
fmt::format("{0:x}", static_cast<__int128_t>(UINT64_MAX) + 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1161 |
EXPECT_EQ("7fffffffffffffffffffffffffffffff", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1162 |
fmt::format("{0:x}", int128_max)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1163 |
EXPECT_EQ("-80000000000000000000000000000000", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1164 |
fmt::format("{0:x}", int128_min)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1165 |
EXPECT_EQ("ffffffffffffffffffffffffffffffff", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1166 |
fmt::format("{0:x}", uint128_max)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1167 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1168 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1169 |
char buffer[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1170 |
safe_sprintf(buffer, "-%x", 0 - static_cast<unsigned>(INT_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1171 |
EXPECT_EQ(buffer, fmt::format("{0:x}", INT_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1172 |
safe_sprintf(buffer, "%x", INT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1173 |
EXPECT_EQ(buffer, fmt::format("{0:x}", INT_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1174 |
safe_sprintf(buffer, "%x", UINT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1175 |
EXPECT_EQ(buffer, fmt::format("{0:x}", UINT_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1176 |
safe_sprintf(buffer, "-%lx", 0 - static_cast<unsigned long>(LONG_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1177 |
EXPECT_EQ(buffer, fmt::format("{0:x}", LONG_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1178 |
safe_sprintf(buffer, "%lx", LONG_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1179 |
EXPECT_EQ(buffer, fmt::format("{0:x}", LONG_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1180 |
safe_sprintf(buffer, "%lx", ULONG_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1181 |
EXPECT_EQ(buffer, fmt::format("{0:x}", ULONG_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1182 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1183 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1184 |
TEST(format_test, format_oct) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1185 |
EXPECT_EQ("0", fmt::format("{0:o}", 0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1186 |
EXPECT_EQ("42", fmt::format("{0:o}", 042)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1187 |
EXPECT_EQ("42", fmt::format("{0:o}", 042u)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1188 |
EXPECT_EQ("-42", fmt::format("{0:o}", -042)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1189 |
EXPECT_EQ("12345670", fmt::format("{0:o}", 012345670)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1190 |
#if FMT_USE_INT128 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1191 |
EXPECT_EQ("0", fmt::format("{0:o}", static_cast<__int128_t>(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1192 |
EXPECT_EQ("0", fmt::format("{0:o}", static_cast<__uint128_t>(0))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1193 |
EXPECT_EQ("1000000000000000000000", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1194 |
fmt::format("{0:o}", static_cast<__int128_t>(INT64_MAX) + 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1195 |
EXPECT_EQ("-1000000000000000000001", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1196 |
fmt::format("{0:o}", static_cast<__int128_t>(INT64_MIN) - 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1197 |
EXPECT_EQ("2000000000000000000000", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1198 |
fmt::format("{0:o}", static_cast<__int128_t>(UINT64_MAX) + 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1199 |
EXPECT_EQ("1777777777777777777777777777777777777777777", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1200 |
fmt::format("{0:o}", int128_max)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1201 |
EXPECT_EQ("-2000000000000000000000000000000000000000000", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1202 |
fmt::format("{0:o}", int128_min)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1203 |
EXPECT_EQ("3777777777777777777777777777777777777777777", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1204 |
fmt::format("{0:o}", uint128_max)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1205 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1206 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1207 |
char buffer[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1208 |
safe_sprintf(buffer, "-%o", 0 - static_cast<unsigned>(INT_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1209 |
EXPECT_EQ(buffer, fmt::format("{0:o}", INT_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1210 |
safe_sprintf(buffer, "%o", INT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1211 |
EXPECT_EQ(buffer, fmt::format("{0:o}", INT_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1212 |
safe_sprintf(buffer, "%o", UINT_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1213 |
EXPECT_EQ(buffer, fmt::format("{0:o}", UINT_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1214 |
safe_sprintf(buffer, "-%lo", 0 - static_cast<unsigned long>(LONG_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1215 |
EXPECT_EQ(buffer, fmt::format("{0:o}", LONG_MIN)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1216 |
safe_sprintf(buffer, "%lo", LONG_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1217 |
EXPECT_EQ(buffer, fmt::format("{0:o}", LONG_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1218 |
safe_sprintf(buffer, "%lo", ULONG_MAX); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1219 |
EXPECT_EQ(buffer, fmt::format("{0:o}", ULONG_MAX)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1220 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1221 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1222 |
TEST(format_test, format_int_locale) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1223 |
EXPECT_EQ("1234", fmt::format("{:L}", 1234)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1224 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1225 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1226 |
TEST(format_test, format_float) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1227 |
EXPECT_EQ("0", fmt::format("{}", 0.0f)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1228 |
EXPECT_EQ("392.500000", fmt::format("{0:f}", 392.5f)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1229 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1230 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1231 |
TEST(format_test, format_double) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1232 |
EXPECT_EQ("0", fmt::format("{}", 0.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1233 |
check_unknown_types(1.2, "eEfFgGaAnL%", "double"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1234 |
EXPECT_EQ("0", fmt::format("{:}", 0.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1235 |
EXPECT_EQ("0.000000", fmt::format("{:f}", 0.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1236 |
EXPECT_EQ("0", fmt::format("{:g}", 0.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1237 |
EXPECT_EQ("392.65", fmt::format("{:}", 392.65)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1238 |
EXPECT_EQ("392.65", fmt::format("{:g}", 392.65)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1239 |
EXPECT_EQ("392.65", fmt::format("{:G}", 392.65)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1240 |
EXPECT_EQ("4.9014e+06", fmt::format("{:g}", 4.9014e6)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1241 |
EXPECT_EQ("392.650000", fmt::format("{:f}", 392.65)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1242 |
EXPECT_EQ("392.650000", fmt::format("{:F}", 392.65)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1243 |
EXPECT_EQ("42", fmt::format("{:L}", 42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1244 |
EXPECT_EQ(" 0x1.0cccccccccccdp+2", fmt::format("{:24a}", 4.2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1245 |
EXPECT_EQ("0x1.0cccccccccccdp+2 ", fmt::format("{:<24a}", 4.2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1246 |
char buffer[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1247 |
safe_sprintf(buffer, "%e", 392.65); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1248 |
EXPECT_EQ(buffer, fmt::format("{0:e}", 392.65)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1249 |
safe_sprintf(buffer, "%E", 392.65); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1250 |
EXPECT_EQ(buffer, fmt::format("{0:E}", 392.65)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1251 |
EXPECT_EQ("+0000392.6", fmt::format("{0:+010.4g}", 392.65)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1252 |
safe_sprintf(buffer, "%a", -42.0); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1253 |
EXPECT_EQ(buffer, fmt::format("{:a}", -42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1254 |
safe_sprintf(buffer, "%A", -42.0); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1255 |
EXPECT_EQ(buffer, fmt::format("{:A}", -42.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1256 |
EXPECT_EQ("9223372036854775808.000000", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1257 |
fmt::format("{:f}", 9223372036854775807.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1258 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1259 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1260 |
TEST(format_test, precision_rounding) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1261 |
EXPECT_EQ("0", fmt::format("{:.0f}", 0.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1262 |
EXPECT_EQ("0", fmt::format("{:.0f}", 0.01)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1263 |
EXPECT_EQ("0", fmt::format("{:.0f}", 0.1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1264 |
EXPECT_EQ("0.000", fmt::format("{:.3f}", 0.00049)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1265 |
EXPECT_EQ("0.001", fmt::format("{:.3f}", 0.0005)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1266 |
EXPECT_EQ("0.001", fmt::format("{:.3f}", 0.00149)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1267 |
EXPECT_EQ("0.002", fmt::format("{:.3f}", 0.0015)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1268 |
EXPECT_EQ("1.000", fmt::format("{:.3f}", 0.9999)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1269 |
EXPECT_EQ("0.00123", fmt::format("{:.3}", 0.00123)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1270 |
EXPECT_EQ("0.1", fmt::format("{:.16g}", 0.1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1271 |
EXPECT_EQ("1", fmt::format("{:.0}", 1.0)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1272 |
EXPECT_EQ("225.51575035152063720", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1273 |
fmt::format("{:.17f}", 225.51575035152064)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1274 |
EXPECT_EQ("-761519619559038.2", fmt::format("{:.1f}", -761519619559038.2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1275 |
EXPECT_EQ("1.9156918820264798e-56", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1276 |
fmt::format("{}", 1.9156918820264798e-56)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1277 |
EXPECT_EQ("0.0000", fmt::format("{:.4f}", 7.2809479766055470e-15)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1278 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1279 |
// Trigger a rounding error in Grisu by a specially chosen number. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1280 |
EXPECT_EQ("3788512123356.985352", fmt::format("{:f}", 3788512123356.985352)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1281 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1282 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1283 |
TEST(format_test, prettify_float) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1284 |
EXPECT_EQ("0.0001", fmt::format("{}", 1e-4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1285 |
EXPECT_EQ("1e-05", fmt::format("{}", 1e-5)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1286 |
EXPECT_EQ("1000000000000000", fmt::format("{}", 1e15)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1287 |
EXPECT_EQ("1e+16", fmt::format("{}", 1e16)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1288 |
EXPECT_EQ("9.999e-05", fmt::format("{}", 9.999e-5)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1289 |
EXPECT_EQ("10000000000", fmt::format("{}", 1e10)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1290 |
EXPECT_EQ("100000000000", fmt::format("{}", 1e11)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1291 |
EXPECT_EQ("12340000000", fmt::format("{}", 1234e7)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1292 |
EXPECT_EQ("12.34", fmt::format("{}", 1234e-2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1293 |
EXPECT_EQ("0.001234", fmt::format("{}", 1234e-6)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1294 |
EXPECT_EQ("0.1", fmt::format("{}", 0.1f)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1295 |
EXPECT_EQ("0.10000000149011612", fmt::format("{}", double(0.1f))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1296 |
EXPECT_EQ("1.3563156e-19", fmt::format("{}", 1.35631564e-19f)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1297 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1298 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1299 |
TEST(format_test, format_nan) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1300 |
double nan = std::numeric_limits<double>::quiet_NaN(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1301 |
EXPECT_EQ("nan", fmt::format("{}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1302 |
EXPECT_EQ("+nan", fmt::format("{:+}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1303 |
EXPECT_EQ(" +nan", fmt::format("{:+06}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1304 |
EXPECT_EQ("+nan ", fmt::format("{:<+06}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1305 |
EXPECT_EQ(" +nan ", fmt::format("{:^+06}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1306 |
EXPECT_EQ(" +nan", fmt::format("{:>+06}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1307 |
if (std::signbit(-nan)) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1308 |
EXPECT_EQ("-nan", fmt::format("{}", -nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1309 |
EXPECT_EQ(" -nan", fmt::format("{:+06}", -nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1310 |
} else { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1311 |
fmt::print("Warning: compiler doesn't handle negative NaN correctly"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1312 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1313 |
EXPECT_EQ(" nan", fmt::format("{: }", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1314 |
EXPECT_EQ("NAN", fmt::format("{:F}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1315 |
EXPECT_EQ("nan ", fmt::format("{:<7}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1316 |
EXPECT_EQ(" nan ", fmt::format("{:^7}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1317 |
EXPECT_EQ(" nan", fmt::format("{:>7}", nan)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1318 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1319 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1320 |
TEST(format_test, format_infinity) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1321 |
double inf = std::numeric_limits<double>::infinity(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1322 |
EXPECT_EQ("inf", fmt::format("{}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1323 |
EXPECT_EQ("+inf", fmt::format("{:+}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1324 |
EXPECT_EQ("-inf", fmt::format("{}", -inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1325 |
EXPECT_EQ(" +inf", fmt::format("{:+06}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1326 |
EXPECT_EQ(" -inf", fmt::format("{:+06}", -inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1327 |
EXPECT_EQ("+inf ", fmt::format("{:<+06}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1328 |
EXPECT_EQ(" +inf ", fmt::format("{:^+06}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1329 |
EXPECT_EQ(" +inf", fmt::format("{:>+06}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1330 |
EXPECT_EQ(" inf", fmt::format("{: }", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1331 |
EXPECT_EQ("INF", fmt::format("{:F}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1332 |
EXPECT_EQ("inf ", fmt::format("{:<7}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1333 |
EXPECT_EQ(" inf ", fmt::format("{:^7}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1334 |
EXPECT_EQ(" inf", fmt::format("{:>7}", inf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1335 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1336 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1337 |
TEST(format_test, format_long_double) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1338 |
EXPECT_EQ("0", fmt::format("{0:}", 0.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1339 |
EXPECT_EQ("0.000000", fmt::format("{0:f}", 0.0l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1340 |
EXPECT_EQ("392.65", fmt::format("{0:}", 392.65l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1341 |
EXPECT_EQ("392.65", fmt::format("{0:g}", 392.65l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1342 |
EXPECT_EQ("392.65", fmt::format("{0:G}", 392.65l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1343 |
EXPECT_EQ("392.650000", fmt::format("{0:f}", 392.65l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1344 |
EXPECT_EQ("392.650000", fmt::format("{0:F}", 392.65l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1345 |
char buffer[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1346 |
safe_sprintf(buffer, "%Le", 392.65l); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1347 |
EXPECT_EQ(buffer, fmt::format("{0:e}", 392.65l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1348 |
EXPECT_EQ("+0000392.6", fmt::format("{0:+010.4g}", 392.64l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1349 |
safe_sprintf(buffer, "%La", 3.31l); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1350 |
EXPECT_EQ(buffer, fmt::format("{:a}", 3.31l)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1351 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1352 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1353 |
TEST(format_test, format_char) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1354 |
const char types[] = "cbBdoxX"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1355 |
check_unknown_types('a', types, "char"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1356 |
EXPECT_EQ("a", fmt::format("{0}", 'a')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1357 |
EXPECT_EQ("z", fmt::format("{0:c}", 'z')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1358 |
int n = 'x'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1359 |
for (const char* type = types + 1; *type; ++type) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1360 |
std::string format_str = fmt::format("{{:{}}}", *type); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1361 |
EXPECT_EQ(fmt::format(runtime(format_str), n), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1362 |
fmt::format(runtime(format_str), 'x')) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1363 |
<< format_str; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1364 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1365 |
EXPECT_EQ(fmt::format("{:02X}", n), fmt::format("{:02X}", 'x')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1366 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1367 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1368 |
TEST(format_test, format_volatile_char) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1369 |
volatile char c = 'x'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1370 |
EXPECT_EQ("x", fmt::format("{}", c)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1371 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1372 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1373 |
TEST(format_test, format_unsigned_char) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1374 |
EXPECT_EQ("42", fmt::format("{}", static_cast<unsigned char>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1375 |
EXPECT_EQ("42", fmt::format("{}", static_cast<uint8_t>(42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1376 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1377 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1378 |
TEST(format_test, format_cstring) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1379 |
check_unknown_types("test", "sp", "string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1380 |
EXPECT_EQ("test", fmt::format("{0}", "test")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1381 |
EXPECT_EQ("test", fmt::format("{0:s}", "test")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1382 |
char nonconst[] = "nonconst"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1383 |
EXPECT_EQ("nonconst", fmt::format("{0}", nonconst)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1384 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1385 |
(void)fmt::format(runtime("{0}"), static_cast<const char*>(nullptr)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1386 |
format_error, "string pointer is null"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1387 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1388 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1389 |
void function_pointer_test(int, double, std::string) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1390 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1391 |
TEST(format_test, format_pointer) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1392 |
check_unknown_types(reinterpret_cast<void*>(0x1234), "p", "pointer"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1393 |
EXPECT_EQ("0x0", fmt::format("{0}", static_cast<void*>(nullptr))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1394 |
EXPECT_EQ("0x1234", fmt::format("{0}", reinterpret_cast<void*>(0x1234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1395 |
EXPECT_EQ("0x1234", fmt::format("{0:p}", reinterpret_cast<void*>(0x1234))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1396 |
EXPECT_EQ("0x" + std::string(sizeof(void*) * CHAR_BIT / 4, 'f'), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1397 |
fmt::format("{0}", reinterpret_cast<void*>(~uintptr_t()))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1398 |
EXPECT_EQ("0x1234", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1399 |
fmt::format("{}", fmt::ptr(reinterpret_cast<int*>(0x1234)))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1400 |
std::unique_ptr<int> up(new int(1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1401 |
EXPECT_EQ(fmt::format("{}", fmt::ptr(up.get())), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1402 |
fmt::format("{}", fmt::ptr(up))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1403 |
std::shared_ptr<int> sp(new int(1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1404 |
EXPECT_EQ(fmt::format("{}", fmt::ptr(sp.get())), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1405 |
fmt::format("{}", fmt::ptr(sp))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1406 |
EXPECT_EQ(fmt::format("{}", fmt::detail::bit_cast<const void*>( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1407 |
&function_pointer_test)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1408 |
fmt::format("{}", fmt::ptr(function_pointer_test))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1409 |
EXPECT_EQ("0x0", fmt::format("{}", nullptr)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1410 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1411 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1412 |
TEST(format_test, format_string) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1413 |
EXPECT_EQ("test", fmt::format("{0}", std::string("test"))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1414 |
EXPECT_THROW((void)fmt::format(fmt::runtime("{:x}"), std::string("test")), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1415 |
fmt::format_error); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1416 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1417 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1418 |
TEST(format_test, format_string_view) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1419 |
EXPECT_EQ("test", fmt::format("{}", string_view("test"))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1420 |
EXPECT_EQ("", fmt::format("{}", string_view())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1421 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1422 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1423 |
#ifdef FMT_USE_STRING_VIEW |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1424 |
struct string_viewable {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1425 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1426 |
FMT_BEGIN_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1427 |
template <> struct formatter<string_viewable> : formatter<std::string_view> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1428 |
auto format(string_viewable, format_context& ctx) -> decltype(ctx.out()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1429 |
return formatter<std::string_view>::format("foo", ctx); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1430 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1431 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1432 |
FMT_END_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1433 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1434 |
TEST(format_test, format_std_string_view) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1435 |
EXPECT_EQ("test", fmt::format("{}", std::string_view("test"))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1436 |
EXPECT_EQ("foo", fmt::format("{}", string_viewable())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1437 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1438 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1439 |
struct explicitly_convertible_to_std_string_view { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1440 |
explicit operator std::string_view() const { return "foo"; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1441 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1442 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1443 |
template <> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1444 |
struct fmt::formatter<explicitly_convertible_to_std_string_view> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1445 |
: formatter<std::string_view> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1446 |
auto format(explicitly_convertible_to_std_string_view v, format_context& ctx) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1447 |
-> decltype(ctx.out()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1448 |
return format_to(ctx.out(), "'{}'", std::string_view(v)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1449 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1450 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1451 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1452 |
TEST(format_test, format_explicitly_convertible_to_std_string_view) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1453 |
EXPECT_EQ("'foo'", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1454 |
fmt::format("{}", explicitly_convertible_to_std_string_view())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1455 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1456 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1457 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1458 |
struct converible_to_anything { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1459 |
template <typename T> operator T() const { return T(); } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1460 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1461 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1462 |
FMT_BEGIN_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1463 |
template <> struct formatter<converible_to_anything> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1464 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1465 |
return ctx.begin(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1466 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1467 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1468 |
auto format(converible_to_anything, format_context& ctx) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1469 |
-> decltype(ctx.out()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1470 |
return format_to(ctx.out(), "foo"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1471 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1472 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1473 |
FMT_END_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1474 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1475 |
TEST(format_test, format_convertible_to_anything) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1476 |
EXPECT_EQ("foo", fmt::format("{}", converible_to_anything())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1477 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1478 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1479 |
class Answer {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1480 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1481 |
FMT_BEGIN_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1482 |
template <> struct formatter<date> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1483 |
template <typename ParseContext> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1484 |
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1485 |
auto it = ctx.begin(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1486 |
if (it != ctx.end() && *it == 'd') ++it; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1487 |
return it; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1488 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1489 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1490 |
auto format(const date& d, format_context& ctx) -> decltype(ctx.out()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1491 |
format_to(ctx.out(), "{}-{}-{}", d.year(), d.month(), d.day()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1492 |
return ctx.out(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1493 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1494 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1495 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1496 |
template <> struct formatter<Answer> : formatter<int> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1497 |
template <typename FormatContext> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1498 |
auto format(Answer, FormatContext& ctx) -> decltype(ctx.out()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1499 |
return formatter<int>::format(42, ctx); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1500 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1501 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1502 |
FMT_END_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1503 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1504 |
TEST(format_test, format_custom) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1505 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:s}"), date(2012, 12, 9)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1506 |
format_error, "unknown format specifier"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1507 |
EXPECT_EQ("42", fmt::format("{0}", Answer())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1508 |
EXPECT_EQ("0042", fmt::format("{:04}", Answer())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1509 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1510 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1511 |
TEST(format_test, format_to_custom) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1512 |
char buf[10] = {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1513 |
auto end = |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1514 |
&*fmt::format_to(fmt::detail::make_checked(buf, 10), "{}", Answer()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1515 |
EXPECT_EQ(end, buf + 2); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1516 |
EXPECT_STREQ(buf, "42"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1517 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1518 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1519 |
TEST(format_test, format_string_from_speed_test) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1520 |
EXPECT_EQ("1.2340000000:0042:+3.13:str:0x3e8:X:%", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1521 |
fmt::format("{0:0.10f}:{1:04}:{2:+g}:{3}:{4}:{5}:%", 1.234, 42, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1522 |
3.13, "str", reinterpret_cast<void*>(1000), 'X')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1523 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1524 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1525 |
TEST(format_test, format_examples) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1526 |
std::string message = fmt::format("The answer is {}", 42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1527 |
EXPECT_EQ("The answer is 42", message); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1528 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1529 |
EXPECT_EQ("42", fmt::format("{}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1530 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1531 |
memory_buffer out; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1532 |
format_to(std::back_inserter(out), "The answer is {}.", 42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1533 |
EXPECT_EQ("The answer is 42.", to_string(out)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1534 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1535 |
const char* filename = "nonexistent"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1536 |
FILE* ftest = safe_fopen(filename, "r"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1537 |
if (ftest) fclose(ftest); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1538 |
int error_code = errno; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1539 |
EXPECT_TRUE(ftest == nullptr); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1540 |
EXPECT_SYSTEM_ERROR( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1541 |
{ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1542 |
FILE* f = safe_fopen(filename, "r"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1543 |
if (!f) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1544 |
throw fmt::system_error(errno, "Cannot open file '{}'", filename); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1545 |
fclose(f); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1546 |
}, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1547 |
error_code, "Cannot open file 'nonexistent'"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1548 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1549 |
EXPECT_EQ("First, thou shalt count to three", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1550 |
fmt::format("First, thou shalt count to {0}", "three")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1551 |
EXPECT_EQ("Bring me a shrubbery", fmt::format("Bring me a {}", "shrubbery")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1552 |
EXPECT_EQ("From 1 to 3", fmt::format("From {} to {}", 1, 3)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1553 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1554 |
char buffer[buffer_size]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1555 |
safe_sprintf(buffer, "%03.2f", -1.2); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1556 |
EXPECT_EQ(buffer, fmt::format("{:03.2f}", -1.2)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1557 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1558 |
EXPECT_EQ("a, b, c", fmt::format("{0}, {1}, {2}", 'a', 'b', 'c')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1559 |
EXPECT_EQ("a, b, c", fmt::format("{}, {}, {}", 'a', 'b', 'c')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1560 |
EXPECT_EQ("c, b, a", fmt::format("{2}, {1}, {0}", 'a', 'b', 'c')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1561 |
EXPECT_EQ("abracadabra", fmt::format("{0}{1}{0}", "abra", "cad")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1562 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1563 |
EXPECT_EQ("left aligned ", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1564 |
fmt::format("{:<30}", "left aligned")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1565 |
EXPECT_EQ(" right aligned", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1566 |
fmt::format("{:>30}", "right aligned")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1567 |
EXPECT_EQ(" centered ", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1568 |
fmt::format("{:^30}", "centered")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1569 |
EXPECT_EQ("***********centered***********", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1570 |
fmt::format("{:*^30}", "centered")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1571 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1572 |
EXPECT_EQ("+3.140000; -3.140000", fmt::format("{:+f}; {:+f}", 3.14, -3.14)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1573 |
EXPECT_EQ(" 3.140000; -3.140000", fmt::format("{: f}; {: f}", 3.14, -3.14)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1574 |
EXPECT_EQ("3.140000; -3.140000", fmt::format("{:-f}; {:-f}", 3.14, -3.14)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1575 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1576 |
EXPECT_EQ("int: 42; hex: 2a; oct: 52", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1577 |
fmt::format("int: {0:d}; hex: {0:x}; oct: {0:o}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1578 |
EXPECT_EQ("int: 42; hex: 0x2a; oct: 052", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1579 |
fmt::format("int: {0:d}; hex: {0:#x}; oct: {0:#o}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1580 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1581 |
EXPECT_EQ("The answer is 42", fmt::format("The answer is {}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1582 |
EXPECT_THROW_MSG( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1583 |
(void)fmt::format(runtime("The answer is {:d}"), "forty-two"), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1584 |
format_error, "invalid type specifier"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1585 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1586 |
EXPECT_WRITE( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1587 |
stdout, fmt::print("{}", std::numeric_limits<double>::infinity()), "inf"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1588 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1589 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1590 |
TEST(format_test, print) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1591 |
EXPECT_WRITE(stdout, fmt::print("Don't {}!", "panic"), "Don't panic!"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1592 |
EXPECT_WRITE(stderr, fmt::print(stderr, "Don't {}!", "panic"), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1593 |
"Don't panic!"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1594 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1595 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1596 |
TEST(format_test, variadic) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1597 |
EXPECT_EQ("abc1", fmt::format("{}c{}", "ab", 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1598 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1599 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1600 |
TEST(format_test, dynamic) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1601 |
using ctx = fmt::format_context; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1602 |
auto args = std::vector<fmt::basic_format_arg<ctx>>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1603 |
args.emplace_back(fmt::detail::make_arg<ctx>(42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1604 |
args.emplace_back(fmt::detail::make_arg<ctx>("abc1")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1605 |
args.emplace_back(fmt::detail::make_arg<ctx>(1.5f)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1606 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1607 |
std::string result = fmt::vformat( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1608 |
"{} and {} and {}", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1609 |
fmt::format_args(args.data(), static_cast<int>(args.size()))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1610 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1611 |
EXPECT_EQ("42 and abc1 and 1.5", result); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1612 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1613 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1614 |
TEST(format_test, bytes) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1615 |
auto s = fmt::format("{:10}", fmt::bytes("ёжик")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1616 |
EXPECT_EQ("ёжик ", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1617 |
EXPECT_EQ(10, s.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1618 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1619 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1620 |
TEST(format_test, group_digits_view) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1621 |
EXPECT_EQ(fmt::format("{}", fmt::group_digits(10000000)), "10,000,000"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1622 |
EXPECT_EQ(fmt::format("{:8}", fmt::group_digits(1000)), " 1,000"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1623 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1624 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1625 |
enum test_enum { foo, bar }; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1626 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1627 |
TEST(format_test, join) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1628 |
using fmt::join; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1629 |
int v1[3] = {1, 2, 3}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1630 |
auto v2 = std::vector<float>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1631 |
v2.push_back(1.2f); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1632 |
v2.push_back(3.4f); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1633 |
void* v3[2] = {&v1[0], &v1[1]}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1634 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1635 |
EXPECT_EQ("(1, 2, 3)", fmt::format("({})", join(v1, v1 + 3, ", "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1636 |
EXPECT_EQ("(1)", fmt::format("({})", join(v1, v1 + 1, ", "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1637 |
EXPECT_EQ("()", fmt::format("({})", join(v1, v1, ", "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1638 |
EXPECT_EQ("(001, 002, 003)", fmt::format("({:03})", join(v1, v1 + 3, ", "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1639 |
EXPECT_EQ("(+01.20, +03.40)", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1640 |
fmt::format("({:+06.2f})", join(v2.begin(), v2.end(), ", "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1641 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1642 |
EXPECT_EQ("1, 2, 3", fmt::format("{0:{1}}", join(v1, v1 + 3, ", "), 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1643 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1644 |
EXPECT_EQ(fmt::format("{}, {}", v3[0], v3[1]), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1645 |
fmt::format("{}", join(v3, v3 + 2, ", "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1646 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1647 |
EXPECT_EQ("(1, 2, 3)", fmt::format("({})", join(v1, ", "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1648 |
EXPECT_EQ("(+01.20, +03.40)", fmt::format("({:+06.2f})", join(v2, ", "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1649 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1650 |
auto v4 = std::vector<test_enum>{foo, bar, foo}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1651 |
EXPECT_EQ("0 1 0", fmt::format("{}", join(v4, " "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1652 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1653 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1654 |
#ifdef __cpp_lib_byte |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1655 |
TEST(format_test, join_bytes) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1656 |
auto v = std::vector<std::byte>{std::byte(1), std::byte(2), std::byte(3)}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1657 |
EXPECT_EQ("1, 2, 3", fmt::format("{}", fmt::join(v, ", "))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1658 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1659 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1660 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1661 |
std::string vformat_message(int id, const char* format, fmt::format_args args) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1662 |
auto buffer = fmt::memory_buffer(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1663 |
format_to(fmt::appender(buffer), "[{}] ", id); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1664 |
vformat_to(fmt::appender(buffer), format, args); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1665 |
return to_string(buffer); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1666 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1667 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1668 |
template <typename... Args> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1669 |
std::string format_message(int id, const char* format, const Args&... args) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1670 |
auto va = fmt::make_format_args(args...); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1671 |
return vformat_message(id, format, va); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1672 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1673 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1674 |
TEST(format_test, format_message_example) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1675 |
EXPECT_EQ("[42] something happened", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1676 |
format_message(42, "{} happened", "something")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1677 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1678 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1679 |
template <typename... Args> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1680 |
void print_error(const char* file, int line, const char* format, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1681 |
const Args&... args) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1682 |
fmt::print("{}: {}: ", file, line); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1683 |
fmt::print(format, args...); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1684 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1685 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1686 |
TEST(format_test, unpacked_args) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1687 |
EXPECT_EQ("0123456789abcdefg", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1688 |
fmt::format("{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}", 0, 1, 2, 3, 4, 5, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1689 |
6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f', 'g')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1690 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1691 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1692 |
struct string_like {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1693 |
fmt::string_view to_string_view(string_like) { return "foo"; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1694 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1695 |
constexpr char with_null[3] = {'{', '}', '\0'}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1696 |
constexpr char no_null[2] = {'{', '}'}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1697 |
static FMT_CONSTEXPR_DECL const char static_with_null[3] = {'{', '}', '\0'}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1698 |
static FMT_CONSTEXPR_DECL const char static_no_null[2] = {'{', '}'}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1699 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1700 |
TEST(format_test, compile_time_string) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1701 |
EXPECT_EQ("foo", fmt::format(FMT_STRING("foo"))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1702 |
EXPECT_EQ("42", fmt::format(FMT_STRING("{}"), 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1703 |
EXPECT_EQ("foo", fmt::format(FMT_STRING("{}"), string_like())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1704 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1705 |
#if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1706 |
using namespace fmt::literals; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1707 |
EXPECT_EQ("foobar", fmt::format(FMT_STRING("{foo}{bar}"), "bar"_a = "bar", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1708 |
"foo"_a = "foo")); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1709 |
EXPECT_EQ("", fmt::format(FMT_STRING(""))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1710 |
EXPECT_EQ("", fmt::format(FMT_STRING(""), "arg"_a = 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1711 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1712 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1713 |
(void)static_with_null; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1714 |
(void)static_no_null; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1715 |
#ifndef _MSC_VER |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1716 |
EXPECT_EQ("42", fmt::format(FMT_STRING(static_with_null), 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1717 |
EXPECT_EQ("42", fmt::format(FMT_STRING(static_no_null), 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1718 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1719 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1720 |
(void)with_null; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1721 |
(void)no_null; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1722 |
#if __cplusplus >= 201703L |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1723 |
EXPECT_EQ("42", fmt::format(FMT_STRING(with_null), 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1724 |
EXPECT_EQ("42", fmt::format(FMT_STRING(no_null), 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1725 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1726 |
#if defined(FMT_USE_STRING_VIEW) && __cplusplus >= 201703L |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1727 |
EXPECT_EQ("42", fmt::format(FMT_STRING(std::string_view("{}")), 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1728 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1729 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1730 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1731 |
TEST(format_test, custom_format_compile_time_string) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1732 |
EXPECT_EQ("42", fmt::format(FMT_STRING("{}"), Answer())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1733 |
auto answer = Answer(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1734 |
EXPECT_EQ("42", fmt::format(FMT_STRING("{}"), answer)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1735 |
char buf[10] = {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1736 |
fmt::format_to(buf, FMT_STRING("{}"), answer); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1737 |
const Answer const_answer = Answer(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1738 |
EXPECT_EQ("42", fmt::format(FMT_STRING("{}"), const_answer)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1739 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1740 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1741 |
#if FMT_USE_USER_DEFINED_LITERALS |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1742 |
// Passing user-defined literals directly to EXPECT_EQ causes problems |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1743 |
// with macro argument stringification (#) on some versions of GCC. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1744 |
// Workaround: Assing the UDL result to a variable before the macro. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1745 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1746 |
using namespace fmt::literals; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1747 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1748 |
# if FMT_GCC_VERSION |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1749 |
# define FMT_CHECK_DEPRECATED_UDL_FORMAT 1 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1750 |
# elif FMT_CLANG_VERSION && defined(__has_warning) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1751 |
# if __has_warning("-Wdeprecated-declarations") |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1752 |
# define FMT_CHECK_DEPRECATED_UDL_FORMAT 1 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1753 |
# endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1754 |
# endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1755 |
# ifndef FMT_CHECK_DEPRECATED_UDL_FORMAT |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1756 |
# define FMT_CHECK_DEPRECATED_UDL_FORMAT 0 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1757 |
# endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1758 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1759 |
# if FMT_CHECK_DEPRECATED_UDL_FORMAT |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1760 |
# pragma GCC diagnostic push |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1761 |
# pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1762 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1763 |
TEST(format_test, format_udl) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1764 |
EXPECT_EQ("{}c{}"_format("ab", 1), fmt::format("{}c{}", "ab", 1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1765 |
EXPECT_EQ("foo"_format(), "foo"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1766 |
EXPECT_EQ("{0:10}"_format(42), " 42"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1767 |
EXPECT_EQ("{}"_format(date(2015, 10, 21)), "2015-10-21"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1768 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1769 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1770 |
# pragma GCC diagnostic pop |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1771 |
# endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1772 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1773 |
TEST(format_test, named_arg_udl) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1774 |
auto udl_a = fmt::format("{first}{second}{first}{third}", "first"_a = "abra", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1775 |
"second"_a = "cad", "third"_a = 99); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1776 |
EXPECT_EQ( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1777 |
fmt::format("{first}{second}{first}{third}", fmt::arg("first", "abra"), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1778 |
fmt::arg("second", "cad"), fmt::arg("third", 99)), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1779 |
udl_a); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1780 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1781 |
#endif // FMT_USE_USER_DEFINED_LITERALS |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1782 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1783 |
TEST(format_test, enum) { EXPECT_EQ("0", fmt::format("{}", foo)); } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1784 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1785 |
TEST(format_test, formatter_not_specialized) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1786 |
static_assert(!fmt::has_formatter<fmt::formatter<test_enum>, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1787 |
fmt::format_context>::value, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1788 |
""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1789 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1790 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1791 |
#if FMT_HAS_FEATURE(cxx_strong_enums) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1792 |
enum big_enum : unsigned long long { big_enum_value = 5000000000ULL }; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1793 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1794 |
TEST(format_test, strong_enum) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1795 |
EXPECT_EQ("5000000000", fmt::format("{}", big_enum_value)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1796 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1797 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1798 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1799 |
TEST(format_test, non_null_terminated_format_string) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1800 |
EXPECT_EQ("42", fmt::format(string_view("{}foo", 2), 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1801 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1802 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1803 |
struct variant { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1804 |
enum { int_type, string_type } type; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1805 |
explicit variant(int) : type(int_type) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1806 |
explicit variant(const char*) : type(string_type) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1807 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1808 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1809 |
FMT_BEGIN_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1810 |
template <> struct formatter<variant> : dynamic_formatter<> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1811 |
auto format(variant value, format_context& ctx) -> decltype(ctx.out()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1812 |
if (value.type == variant::int_type) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1813 |
return dynamic_formatter<>::format(42, ctx); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1814 |
return dynamic_formatter<>::format("foo", ctx); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1815 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1816 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1817 |
FMT_END_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1818 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1819 |
TEST(format_test, dynamic_formatter) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1820 |
auto num = variant(42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1821 |
auto str = variant("foo"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1822 |
EXPECT_EQ("42", fmt::format("{:d}", num)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1823 |
EXPECT_EQ("foo", fmt::format("{:s}", str)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1824 |
EXPECT_EQ(" 42 foo ", fmt::format("{:{}} {:{}}", num, 3, str, 4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1825 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{0:{}}"), num), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1826 |
"cannot switch from manual to automatic argument indexing"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1827 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:{0}}"), num), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1828 |
"cannot switch from automatic to manual argument indexing"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1829 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:+}"), str), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1830 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1831 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:-}"), str), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1832 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1833 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{: }"), str), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1834 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1835 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:#}"), str), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1836 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1837 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:0}"), str), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1838 |
"format specifier requires numeric argument"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1839 |
EXPECT_THROW_MSG((void)fmt::format(runtime("{:.2}"), num), format_error, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1840 |
"precision not allowed for this argument type"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1841 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1842 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1843 |
namespace adl_test { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1844 |
namespace fmt { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1845 |
namespace detail { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1846 |
struct foo {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1847 |
template <typename, typename OutputIt> void write(OutputIt, foo) = delete; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1848 |
} // namespace detail |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1849 |
} // namespace fmt |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1850 |
} // namespace adl_test |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1851 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1852 |
FMT_BEGIN_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1853 |
template <> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1854 |
struct formatter<adl_test::fmt::detail::foo> : formatter<std::string> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1855 |
template <typename FormatContext> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1856 |
auto format(adl_test::fmt::detail::foo, FormatContext& ctx) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1857 |
-> decltype(ctx.out()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1858 |
return formatter<std::string>::format("foo", ctx); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1859 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1860 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1861 |
FMT_END_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1862 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1863 |
struct convertible_to_int { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1864 |
operator int() const { return value; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1865 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1866 |
int value = 42; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1867 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1868 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1869 |
TEST(format_test, to_string) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1870 |
EXPECT_EQ(fmt::to_string(42), "42"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1871 |
EXPECT_EQ(fmt::to_string(reinterpret_cast<void*>(0x1234)), "0x1234"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1872 |
EXPECT_EQ(fmt::to_string(adl_test::fmt::detail::foo()), "foo"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1873 |
EXPECT_EQ(fmt::to_string(convertible_to_int()), "42"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1874 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1875 |
enum foo : unsigned char { zero }; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1876 |
EXPECT_EQ(fmt::to_string(zero), "0"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1877 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1878 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1879 |
TEST(format_test, output_iterators) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1880 |
std::list<char> out; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1881 |
fmt::format_to(std::back_inserter(out), "{}", 42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1882 |
EXPECT_EQ("42", std::string(out.begin(), out.end())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1883 |
std::stringstream s; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1884 |
fmt::format_to(std::ostream_iterator<char>(s), "{}", 42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1885 |
EXPECT_EQ("42", s.str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1886 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1887 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1888 |
TEST(format_test, formatted_size) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1889 |
EXPECT_EQ(2u, fmt::formatted_size("{}", 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1890 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1891 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1892 |
TEST(format_test, format_to_no_args) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1893 |
std::string s; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1894 |
fmt::format_to(std::back_inserter(s), "test"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1895 |
EXPECT_EQ("test", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1896 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1897 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1898 |
TEST(format_test, format_to) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1899 |
std::string s; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1900 |
fmt::format_to(std::back_inserter(s), "part{0}", 1); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1901 |
EXPECT_EQ("part1", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1902 |
fmt::format_to(std::back_inserter(s), "part{0}", 2); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1903 |
EXPECT_EQ("part1part2", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1904 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1905 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1906 |
TEST(format_test, format_to_memory_buffer) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1907 |
auto buf = fmt::basic_memory_buffer<char, 100>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1908 |
fmt::format_to(fmt::appender(buf), "{}", "foo"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1909 |
EXPECT_EQ("foo", to_string(buf)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1910 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1911 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1912 |
TEST(format_test, format_to_vector) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1913 |
std::vector<char> v; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1914 |
fmt::format_to(std::back_inserter(v), "{}", "foo"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1915 |
EXPECT_EQ(string_view(v.data(), v.size()), "foo"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1916 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1917 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1918 |
struct nongrowing_container { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1919 |
using value_type = char; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1920 |
void push_back(char) { throw std::runtime_error("can't take it any more"); } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1921 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1922 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1923 |
TEST(format_test, format_to_propagates_exceptions) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1924 |
auto c = nongrowing_container(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1925 |
EXPECT_THROW(fmt::format_to(std::back_inserter(c), "{}", 42), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1926 |
std::runtime_error); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1927 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1928 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1929 |
TEST(format_test, format_to_n) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1930 |
char buffer[4]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1931 |
buffer[3] = 'x'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1932 |
auto result = fmt::format_to_n(buffer, 3, "{}", 12345); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1933 |
EXPECT_EQ(5u, result.size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1934 |
EXPECT_EQ(buffer + 3, result.out); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1935 |
EXPECT_EQ("123x", fmt::string_view(buffer, 4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1936 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1937 |
result = fmt::format_to_n(buffer, 3, "{:s}", "foobar"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1938 |
EXPECT_EQ(6u, result.size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1939 |
EXPECT_EQ(buffer + 3, result.out); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1940 |
EXPECT_EQ("foox", fmt::string_view(buffer, 4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1941 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1942 |
buffer[0] = 'x'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1943 |
buffer[1] = 'x'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1944 |
buffer[2] = 'x'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1945 |
result = fmt::format_to_n(buffer, 3, "{}", 'A'); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1946 |
EXPECT_EQ(1u, result.size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1947 |
EXPECT_EQ(buffer + 1, result.out); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1948 |
EXPECT_EQ("Axxx", fmt::string_view(buffer, 4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1949 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1950 |
result = fmt::format_to_n(buffer, 3, "{}{} ", 'B', 'C'); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1951 |
EXPECT_EQ(3u, result.size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1952 |
EXPECT_EQ(buffer + 3, result.out); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1953 |
EXPECT_EQ("BC x", fmt::string_view(buffer, 4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1954 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1955 |
result = fmt::format_to_n(buffer, 4, "{}", "ABCDE"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1956 |
EXPECT_EQ(5u, result.size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1957 |
EXPECT_EQ("ABCD", fmt::string_view(buffer, 4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1958 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1959 |
buffer[3] = 'x'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1960 |
result = fmt::format_to_n(buffer, 3, "{}", std::string(1000, '*')); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1961 |
EXPECT_EQ(1000u, result.size); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1962 |
EXPECT_EQ("***x", fmt::string_view(buffer, 4)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1963 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1964 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1965 |
struct test_output_iterator { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1966 |
char* data; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1967 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1968 |
using iterator_category = std::output_iterator_tag; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1969 |
using value_type = void; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1970 |
using difference_type = void; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1971 |
using pointer = void; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1972 |
using reference = void; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1973 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1974 |
test_output_iterator& operator++() { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1975 |
++data; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1976 |
return *this; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1977 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1978 |
test_output_iterator operator++(int) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1979 |
auto tmp = *this; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1980 |
++data; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1981 |
return tmp; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1982 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1983 |
char& operator*() { return *data; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1984 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1985 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1986 |
TEST(format_test, format_to_n_output_iterator) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1987 |
char buf[10] = {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1988 |
fmt::format_to_n(test_output_iterator{buf}, 10, "{}", 42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1989 |
EXPECT_STREQ(buf, "42"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1990 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1991 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1992 |
#if FMT_USE_CONSTEXPR |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1993 |
struct test_error_handler { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1994 |
const char*& error; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1995 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1996 |
FMT_CONSTEXPR test_error_handler(const char*& err) : error(err) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1997 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1998 |
FMT_CONSTEXPR test_error_handler(const test_error_handler& other) |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1999 |
: error(other.error) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2000 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2001 |
FMT_CONSTEXPR void on_error(const char* message) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2002 |
if (!error) error = message; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2003 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2004 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2005 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2006 |
FMT_CONSTEXPR size_t len(const char* s) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2007 |
size_t len = 0; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2008 |
while (*s++) ++len; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2009 |
return len; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2010 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2011 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2012 |
FMT_CONSTEXPR bool equal(const char* s1, const char* s2) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2013 |
if (!s1 || !s2) return s1 == s2; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2014 |
while (*s1 && *s1 == *s2) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2015 |
++s1; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2016 |
++s2; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2017 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2018 |
return *s1 == *s2; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2019 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2020 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2021 |
template <typename... Args> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2022 |
FMT_CONSTEXPR bool test_error(const char* fmt, const char* expected_error) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2023 |
const char* actual_error = nullptr; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2024 |
auto s = string_view(fmt, len(fmt)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2025 |
auto checker = |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2026 |
fmt::detail::format_string_checker<char, test_error_handler, Args...>( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2027 |
s, test_error_handler(actual_error)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2028 |
fmt::detail::parse_format_string<true>(s, checker); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2029 |
return equal(actual_error, expected_error); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2030 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2031 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2032 |
# define EXPECT_ERROR_NOARGS(fmt, error) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2033 |
static_assert(test_error(fmt, error), "") |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2034 |
# define EXPECT_ERROR(fmt, error, ...) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2035 |
static_assert(test_error<__VA_ARGS__>(fmt, error), "") |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2036 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2037 |
TEST(format_test, format_string_errors) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2038 |
EXPECT_ERROR_NOARGS("foo", nullptr); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2039 |
EXPECT_ERROR_NOARGS("}", "unmatched '}' in format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2040 |
EXPECT_ERROR("{0:s", "unknown format specifier", date); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2041 |
# if !FMT_MSC_VER || FMT_MSC_VER >= 1916 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2042 |
// This causes an detail compiler error in MSVC2017. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2043 |
EXPECT_ERROR("{:{<}", "invalid fill character '{'", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2044 |
EXPECT_ERROR("{:10000000000}", "number is too big", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2045 |
EXPECT_ERROR("{:.10000000000}", "number is too big", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2046 |
EXPECT_ERROR_NOARGS("{:x}", "argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2047 |
EXPECT_ERROR("{:+}", "format specifier requires numeric argument", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2048 |
const char*); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2049 |
EXPECT_ERROR("{:-}", "format specifier requires numeric argument", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2050 |
const char*); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2051 |
EXPECT_ERROR("{:#}", "format specifier requires numeric argument", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2052 |
const char*); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2053 |
EXPECT_ERROR("{: }", "format specifier requires numeric argument", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2054 |
const char*); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2055 |
EXPECT_ERROR("{:0}", "format specifier requires numeric argument", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2056 |
const char*); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2057 |
EXPECT_ERROR("{:+}", "format specifier requires signed argument", unsigned); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2058 |
EXPECT_ERROR("{:-}", "format specifier requires signed argument", unsigned); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2059 |
EXPECT_ERROR("{: }", "format specifier requires signed argument", unsigned); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2060 |
EXPECT_ERROR("{:{}}", "argument not found", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2061 |
EXPECT_ERROR("{:.{}}", "argument not found", double); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2062 |
EXPECT_ERROR("{:.2}", "precision not allowed for this argument type", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2063 |
EXPECT_ERROR("{:s}", "invalid type specifier", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2064 |
EXPECT_ERROR("{:s}", "invalid type specifier", char); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2065 |
EXPECT_ERROR("{:+}", "invalid format specifier for char", char); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2066 |
EXPECT_ERROR("{:s}", "invalid type specifier", double); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2067 |
EXPECT_ERROR("{:d}", "invalid type specifier", const char*); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2068 |
EXPECT_ERROR("{:d}", "invalid type specifier", std::string); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2069 |
EXPECT_ERROR("{:s}", "invalid type specifier", void*); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2070 |
# else |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2071 |
fmt::print("warning: constexpr is broken in this version of MSVC\n"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2072 |
# endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2073 |
# if FMT_USE_NONTYPE_TEMPLATE_PARAMETERS |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2074 |
EXPECT_ERROR("{foo}", "named argument is not found", decltype("bar"_a = 42)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2075 |
EXPECT_ERROR("{foo}", "named argument is not found", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2076 |
decltype(fmt::arg("foo", 42))); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2077 |
# else |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2078 |
EXPECT_ERROR("{foo}", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2079 |
"compile-time checks for named arguments require C++20 support", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2080 |
int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2081 |
# endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2082 |
EXPECT_ERROR_NOARGS("{10000000000}", "argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2083 |
EXPECT_ERROR_NOARGS("{0x}", "invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2084 |
EXPECT_ERROR_NOARGS("{-}", "invalid format string"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2085 |
EXPECT_ERROR("{:{0x}}", "invalid format string", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2086 |
EXPECT_ERROR("{:{-}}", "invalid format string", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2087 |
EXPECT_ERROR("{:.{0x}}", "invalid format string", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2088 |
EXPECT_ERROR("{:.{-}}", "invalid format string", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2089 |
EXPECT_ERROR("{:.x}", "missing precision specifier", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2090 |
EXPECT_ERROR_NOARGS("{}", "argument not found"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2091 |
EXPECT_ERROR("{1}", "argument not found", int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2092 |
EXPECT_ERROR("{1}{}", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2093 |
"cannot switch from manual to automatic argument indexing", int, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2094 |
int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2095 |
EXPECT_ERROR("{}{1}", |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2096 |
"cannot switch from automatic to manual argument indexing", int, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2097 |
int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2098 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2099 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2100 |
TEST(format_test, vformat_to) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2101 |
using context = fmt::format_context; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2102 |
fmt::basic_format_arg<context> arg = fmt::detail::make_arg<context>(42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2103 |
auto args = fmt::basic_format_args<context>(&arg, 1); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2104 |
auto s = std::string(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2105 |
fmt::vformat_to(std::back_inserter(s), "{}", args); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2106 |
EXPECT_EQ("42", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2107 |
s.clear(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2108 |
fmt::vformat_to(std::back_inserter(s), FMT_STRING("{}"), args); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2109 |
EXPECT_EQ("42", s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2110 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2111 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2112 |
#endif // FMT_USE_CONSTEXPR |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2113 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2114 |
TEST(format_test, char_traits_is_not_ambiguous) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2115 |
// Test that we don't inject detail names into the std namespace. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2116 |
using namespace std; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2117 |
auto c = char_traits<char>::char_type(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2118 |
(void)c; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2119 |
#if __cplusplus >= 201103L |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2120 |
auto s = std::string(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2121 |
auto lval = begin(s); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2122 |
(void)lval; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2123 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2124 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2125 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2126 |
struct check_back_appender {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2127 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2128 |
FMT_BEGIN_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2129 |
template <> struct formatter<check_back_appender> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2130 |
auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2131 |
return ctx.begin(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2132 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2133 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2134 |
template <typename Context> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2135 |
auto format(check_back_appender, Context& ctx) -> decltype(ctx.out()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2136 |
auto out = ctx.out(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2137 |
static_assert(std::is_same<decltype(++out), decltype(out)&>::value, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2138 |
"needs to satisfy weakly_incrementable"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2139 |
*out = 'y'; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2140 |
return ++out; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2141 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2142 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2143 |
FMT_END_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2144 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2145 |
TEST(format_test, back_insert_slicing) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2146 |
EXPECT_EQ(fmt::format("{}", check_back_appender{}), "y"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2147 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2148 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2149 |
template <typename Char, typename T> bool check_enabled_formatter() { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2150 |
static_assert(std::is_default_constructible<fmt::formatter<T, Char>>::value, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2151 |
""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2152 |
return true; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2153 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2154 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2155 |
template <typename Char, typename... T> void check_enabled_formatters() { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2156 |
auto dummy = {check_enabled_formatter<Char, T>()...}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2157 |
(void)dummy; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2158 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2159 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2160 |
TEST(format_test, test_formatters_enabled) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2161 |
check_enabled_formatters<char, bool, char, signed char, unsigned char, short, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2162 |
unsigned short, int, unsigned, long, unsigned long, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2163 |
long long, unsigned long long, float, double, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2164 |
long double, void*, const void*, char*, const char*, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2165 |
std::string, std::nullptr_t>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2166 |
check_enabled_formatters<wchar_t, bool, wchar_t, signed char, unsigned char, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2167 |
short, unsigned short, int, unsigned, long, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2168 |
unsigned long, long long, unsigned long long, float, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2169 |
double, long double, void*, const void*, wchar_t*, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2170 |
const wchar_t*, std::wstring, std::nullptr_t>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2171 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2172 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2173 |
TEST(format_int_test, data) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2174 |
fmt::format_int format_int(42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2175 |
EXPECT_EQ("42", std::string(format_int.data(), format_int.size())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2176 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2177 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2178 |
TEST(format_int_test, format_int) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2179 |
EXPECT_EQ("42", fmt::format_int(42).str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2180 |
EXPECT_EQ(2u, fmt::format_int(42).size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2181 |
EXPECT_EQ("-42", fmt::format_int(-42).str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2182 |
EXPECT_EQ(3u, fmt::format_int(-42).size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2183 |
EXPECT_EQ("42", fmt::format_int(42ul).str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2184 |
EXPECT_EQ("-42", fmt::format_int(-42l).str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2185 |
EXPECT_EQ("42", fmt::format_int(42ull).str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2186 |
EXPECT_EQ("-42", fmt::format_int(-42ll).str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2187 |
std::ostringstream os; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2188 |
os << max_value<int64_t>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2189 |
EXPECT_EQ(os.str(), fmt::format_int(max_value<int64_t>()).str()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
2190 |
} |
|
|
1970-01-01 00:00 |
2191 |
|