| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
1 |
// Formatting library for C++ - core 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 |
// clang-format off |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
9 |
#include "test-assert.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
10 |
// clang-format on |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
11 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
12 |
#include "fmt/base.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
13 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
14 |
#include <climits> // INT_MAX |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
15 |
#include <cstring> // std::strlen |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
16 |
#include <functional> // std::equal_to |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
17 |
#include <iterator> // std::back_insert_iterator, std::distance |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
18 |
#include <limits> // std::numeric_limits |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
19 |
#include <string> // std::string |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
20 |
#include <type_traits> // std::is_same |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
21 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
22 |
#include "gmock/gmock.h" |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
23 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
24 |
using fmt::string_view; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
25 |
using fmt::detail::buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
26 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
27 |
using testing::_; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
28 |
using testing::Invoke; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
29 |
using testing::Return; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
30 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
31 |
#ifdef FMT_FORMAT_H_ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
32 |
# error core-test includes format.h |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
33 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
34 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
35 |
fmt::appender copy(fmt::string_view s, fmt::appender out) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
36 |
for (char c : s) *out++ = c; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
37 |
return out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
38 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
39 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
40 |
TEST(string_view_test, value_type) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
41 |
static_assert(std::is_same<string_view::value_type, char>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
42 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
43 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
44 |
TEST(string_view_test, ctor) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
45 |
EXPECT_STREQ("abc", fmt::string_view("abc").data()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
46 |
EXPECT_EQ(3u, fmt::string_view("abc").size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
47 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
48 |
EXPECT_STREQ("defg", fmt::string_view(std::string("defg")).data()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
49 |
EXPECT_EQ(4u, fmt::string_view(std::string("defg")).size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
50 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
51 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
52 |
TEST(string_view_test, length) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
53 |
// Test that string_view::size() returns string length, not buffer size. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
54 |
char str[100] = "some string"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
55 |
EXPECT_EQ(std::strlen(str), string_view(str).size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
56 |
EXPECT_LT(std::strlen(str), sizeof(str)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
57 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
58 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
59 |
// Check string_view's comparison operator. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
60 |
template <template <typename> class Op> void check_op() { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
61 |
const char* inputs[] = {"foo", "fop", "fo"}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
62 |
size_t num_inputs = sizeof(inputs) / sizeof(*inputs); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
63 |
for (size_t i = 0; i < num_inputs; ++i) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
64 |
for (size_t j = 0; j < num_inputs; ++j) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
65 |
string_view lhs(inputs[i]), rhs(inputs[j]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
66 |
EXPECT_EQ(Op<int>()(lhs.compare(rhs), 0), Op<string_view>()(lhs, rhs)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
67 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
68 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
69 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
70 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
71 |
TEST(string_view_test, compare) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
72 |
EXPECT_EQ(string_view("foo").compare(string_view("foo")), 0); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
73 |
EXPECT_GT(string_view("fop").compare(string_view("foo")), 0); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
74 |
EXPECT_LT(string_view("foo").compare(string_view("fop")), 0); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
75 |
EXPECT_GT(string_view("foo").compare(string_view("fo")), 0); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
76 |
EXPECT_LT(string_view("fo").compare(string_view("foo")), 0); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
77 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
78 |
EXPECT_TRUE(string_view("foo").starts_with('f')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
79 |
EXPECT_FALSE(string_view("foo").starts_with('o')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
80 |
EXPECT_FALSE(string_view().starts_with('o')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
81 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
82 |
EXPECT_TRUE(string_view("foo").starts_with("fo")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
83 |
EXPECT_TRUE(string_view("foo").starts_with("foo")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
84 |
EXPECT_FALSE(string_view("foo").starts_with("fooo")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
85 |
EXPECT_FALSE(string_view().starts_with("fooo")); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
86 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
87 |
check_op<std::equal_to>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
88 |
check_op<std::not_equal_to>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
89 |
check_op<std::less>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
90 |
check_op<std::less_equal>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
91 |
check_op<std::greater>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
92 |
check_op<std::greater_equal>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
93 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
94 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
95 |
TEST(base_test, is_output_iterator) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
96 |
EXPECT_TRUE((fmt::detail::is_output_iterator<char*, char>::value)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
97 |
EXPECT_FALSE((fmt::detail::is_output_iterator<const char*, char>::value)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
98 |
EXPECT_FALSE((fmt::detail::is_output_iterator<std::string, char>::value)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
99 |
EXPECT_TRUE( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
100 |
(fmt::detail::is_output_iterator<std::back_insert_iterator<std::string>, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
101 |
char>::value)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
102 |
EXPECT_TRUE( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
103 |
(fmt::detail::is_output_iterator<std::string::iterator, char>::value)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
104 |
EXPECT_FALSE((fmt::detail::is_output_iterator<std::string::const_iterator, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
105 |
char>::value)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
106 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
107 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
108 |
TEST(base_test, is_back_insert_iterator) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
109 |
EXPECT_TRUE(fmt::detail::is_back_insert_iterator< |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
110 |
std::back_insert_iterator<std::string>>::value); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
111 |
EXPECT_FALSE(fmt::detail::is_back_insert_iterator< |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
112 |
std::front_insert_iterator<std::string>>::value); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
113 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
114 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
115 |
TEST(base_test, buffer_appender) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
116 |
#ifdef __cpp_lib_ranges |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
117 |
EXPECT_TRUE((std::output_iterator<fmt::appender, char>)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
118 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
119 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
120 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
121 |
#if !FMT_GCC_VERSION || FMT_GCC_VERSION >= 470 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
122 |
TEST(buffer_test, noncopyable) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
123 |
EXPECT_FALSE(std::is_copy_constructible<buffer<char>>::value); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
124 |
# if !FMT_MSC_VERSION |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
125 |
// std::is_copy_assignable is broken in MSVC2013. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
126 |
EXPECT_FALSE(std::is_copy_assignable<buffer<char>>::value); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
127 |
# endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
128 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
129 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
130 |
TEST(buffer_test, nonmoveable) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
131 |
EXPECT_FALSE(std::is_move_constructible<buffer<char>>::value); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
132 |
# if !FMT_MSC_VERSION |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
133 |
// std::is_move_assignable is broken in MSVC2013. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
134 |
EXPECT_FALSE(std::is_move_assignable<buffer<char>>::value); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
135 |
# endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
136 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
137 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
138 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
139 |
TEST(buffer_test, indestructible) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
140 |
static_assert(!std::is_destructible<fmt::detail::buffer<int>>(), |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
141 |
"buffer's destructor is protected"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
142 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
143 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
144 |
template <typename T> struct mock_buffer final : buffer<T> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
145 |
MOCK_METHOD(size_t, do_grow, (size_t)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
146 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
147 |
static void grow(buffer<T>& buf, size_t capacity) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
148 |
auto& self = static_cast<mock_buffer&>(buf); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
149 |
self.set(buf.data(), self.do_grow(capacity)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
150 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
151 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
152 |
mock_buffer(T* data = nullptr, size_t buf_capacity = 0) : buffer<T>(grow) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
153 |
this->set(data, buf_capacity); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
154 |
ON_CALL(*this, do_grow(_)).WillByDefault(Invoke([](size_t capacity) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
155 |
return capacity; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
156 |
})); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
157 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
158 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
159 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
160 |
TEST(buffer_test, ctor) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
161 |
{ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
162 |
mock_buffer<int> buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
163 |
EXPECT_EQ(nullptr, buffer.data()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
164 |
EXPECT_EQ(static_cast<size_t>(0), buffer.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
165 |
EXPECT_EQ(static_cast<size_t>(0), buffer.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
166 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
167 |
{ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
168 |
int dummy; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
169 |
mock_buffer<int> buffer(&dummy); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
170 |
EXPECT_EQ(&dummy, &buffer[0]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
171 |
EXPECT_EQ(static_cast<size_t>(0), buffer.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
172 |
EXPECT_EQ(static_cast<size_t>(0), buffer.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
173 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
174 |
{ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
175 |
int dummy; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
176 |
size_t capacity = std::numeric_limits<size_t>::max(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
177 |
mock_buffer<int> buffer(&dummy, capacity); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
178 |
EXPECT_EQ(&dummy, &buffer[0]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
179 |
EXPECT_EQ(static_cast<size_t>(0), buffer.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
180 |
EXPECT_EQ(capacity, buffer.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
181 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
182 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
183 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
184 |
TEST(buffer_test, access) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
185 |
char data[10]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
186 |
mock_buffer<char> buffer(data, sizeof(data)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
187 |
buffer[0] = 11; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
188 |
EXPECT_EQ(11, buffer[0]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
189 |
buffer[3] = 42; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
190 |
EXPECT_EQ(42, *(&buffer[0] + 3)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
191 |
const fmt::detail::buffer<char>& const_buffer = buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
192 |
EXPECT_EQ(42, const_buffer[3]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
193 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
194 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
195 |
TEST(buffer_test, try_resize) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
196 |
char data[123]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
197 |
mock_buffer<char> buffer(data, sizeof(data)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
198 |
buffer[10] = 42; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
199 |
EXPECT_EQ(42, buffer[10]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
200 |
buffer.try_resize(20); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
201 |
EXPECT_EQ(20u, buffer.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
202 |
EXPECT_EQ(123u, buffer.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
203 |
EXPECT_EQ(42, buffer[10]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
204 |
buffer.try_resize(5); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
205 |
EXPECT_EQ(5u, buffer.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
206 |
EXPECT_EQ(123u, buffer.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
207 |
EXPECT_EQ(42, buffer[10]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
208 |
// Check if try_resize calls grow. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
209 |
EXPECT_CALL(buffer, do_grow(124)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
210 |
buffer.try_resize(124); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
211 |
EXPECT_CALL(buffer, do_grow(200)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
212 |
buffer.try_resize(200); |
| 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(buffer_test, try_resize_partial) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
216 |
char data[10]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
217 |
mock_buffer<char> buffer(data, sizeof(data)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
218 |
EXPECT_CALL(buffer, do_grow(20)).WillOnce(Return(15)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
219 |
buffer.try_resize(20); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
220 |
EXPECT_EQ(buffer.capacity(), 15); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
221 |
EXPECT_EQ(buffer.size(), 15); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
222 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
223 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
224 |
TEST(buffer_test, clear) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
225 |
mock_buffer<char> buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
226 |
EXPECT_CALL(buffer, do_grow(20)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
227 |
buffer.try_resize(20); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
228 |
buffer.try_resize(0); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
229 |
EXPECT_EQ(static_cast<size_t>(0), buffer.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
230 |
EXPECT_EQ(20u, buffer.capacity()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
231 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
232 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
233 |
TEST(buffer_test, append) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
234 |
char data[15]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
235 |
mock_buffer<char> buffer(data, 10); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
236 |
auto test = "test"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
237 |
buffer.append(test, test + 5); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
238 |
EXPECT_STREQ(test, &buffer[0]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
239 |
EXPECT_EQ(5u, buffer.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
240 |
buffer.try_resize(10); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
241 |
EXPECT_CALL(buffer, do_grow(12)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
242 |
buffer.append(test, test + 2); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
243 |
EXPECT_EQ('t', buffer[10]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
244 |
EXPECT_EQ('e', buffer[11]); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
245 |
EXPECT_EQ(12u, buffer.size()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
246 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
247 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
248 |
TEST(buffer_test, append_partial) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
249 |
char data[10]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
250 |
mock_buffer<char> buffer(data, sizeof(data)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
251 |
testing::InSequence seq; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
252 |
EXPECT_CALL(buffer, do_grow(15)).WillOnce(Return(10)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
253 |
EXPECT_CALL(buffer, do_grow(15)).WillOnce(Invoke([&buffer](size_t) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
254 |
EXPECT_EQ(fmt::string_view(buffer.data(), buffer.size()), "0123456789"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
255 |
buffer.clear(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
256 |
return 10; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
257 |
})); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
258 |
auto test = "0123456789abcde"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
259 |
buffer.append(test, test + 15); |
| 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(buffer_test, append_allocates_enough_storage) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
263 |
char data[19]; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
264 |
mock_buffer<char> buffer(data, 10); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
265 |
auto test = "abcdefgh"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
266 |
buffer.try_resize(10); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
267 |
EXPECT_CALL(buffer, do_grow(19)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
268 |
buffer.append(test, test + 9); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
269 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
270 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
271 |
TEST(base_test, get_buffer) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
272 |
mock_buffer<char> buffer; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
273 |
void* buffer_ptr = &buffer; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
274 |
auto&& appender_result = fmt::detail::get_buffer<char>(fmt::appender(buffer)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
275 |
EXPECT_EQ(&appender_result, buffer_ptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
276 |
auto&& back_inserter_result = |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
277 |
fmt::detail::get_buffer<char>(std::back_inserter(buffer)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
278 |
EXPECT_EQ(&back_inserter_result, buffer_ptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
279 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
280 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
281 |
struct custom_context { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
282 |
using char_type = char; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
283 |
using parse_context_type = fmt::format_parse_context; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
284 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
285 |
bool called = false; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
286 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
287 |
template <typename T> struct formatter_type { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
288 |
FMT_CONSTEXPR auto parse(fmt::format_parse_context& ctx) |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
289 |
-> decltype(ctx.begin()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
290 |
return ctx.begin(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
291 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
292 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
293 |
const char* format(const T&, custom_context& ctx) const { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
294 |
ctx.called = true; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
295 |
return nullptr; |
| 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 |
void advance_to(const char*) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
300 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
301 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
302 |
struct test_struct {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
303 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
304 |
FMT_BEGIN_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
305 |
template <typename Char> struct formatter<test_struct, Char> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
306 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
307 |
return ctx.begin(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
308 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
309 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
310 |
auto format(test_struct, format_context& ctx) const -> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
311 |
return copy("test", ctx.out()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
312 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
313 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
314 |
FMT_END_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
315 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
316 |
TEST(arg_test, format_args) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
317 |
auto args = fmt::format_args(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
318 |
EXPECT_FALSE(args.get(1)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
319 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
320 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
321 |
TEST(arg_test, make_value_with_custom_context) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
322 |
auto t = test_struct(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
323 |
auto arg = fmt::detail::value<custom_context>( |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
324 |
fmt::detail::arg_mapper<custom_context>().map(t)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
325 |
auto ctx = custom_context(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
326 |
auto parse_ctx = fmt::format_parse_context(""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
327 |
arg.custom.format(&t, parse_ctx, ctx); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
328 |
EXPECT_TRUE(ctx.called); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
329 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
330 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
331 |
// Use a unique result type to make sure that there are no undesirable |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
332 |
// conversions. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
333 |
struct test_result {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
334 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
335 |
template <typename T> struct mock_visitor { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
336 |
template <typename U> struct result { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
337 |
using type = test_result; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
338 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
339 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
340 |
mock_visitor() { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
341 |
ON_CALL(*this, visit(_)).WillByDefault(Return(test_result())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
342 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
343 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
344 |
MOCK_METHOD(test_result, visit, (T)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
345 |
MOCK_METHOD(void, unexpected, ()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
346 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
347 |
auto operator()(T value) -> test_result { return visit(value); } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
348 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
349 |
template <typename U> auto operator()(U) -> test_result { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
350 |
unexpected(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
351 |
return test_result(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
352 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
353 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
354 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
355 |
template <typename T> struct visit_type { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
356 |
using type = T; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
357 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
358 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
359 |
#define VISIT_TYPE(type_, visit_type_) \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
360 |
template <> struct visit_type<type_> { \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
361 |
using type = visit_type_; \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
362 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
363 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
364 |
VISIT_TYPE(signed char, int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
365 |
VISIT_TYPE(unsigned char, unsigned); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
366 |
VISIT_TYPE(short, int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
367 |
VISIT_TYPE(unsigned short, unsigned); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
368 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
369 |
#if LONG_MAX == INT_MAX |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
370 |
VISIT_TYPE(long, int); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
371 |
VISIT_TYPE(unsigned long, unsigned); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
372 |
#else |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
373 |
VISIT_TYPE(long, long long); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
374 |
VISIT_TYPE(unsigned long, unsigned long long); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
375 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
376 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
377 |
#define CHECK_ARG(Char, expected, value) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
378 |
{ \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
379 |
testing::StrictMock<mock_visitor<decltype(expected)>> visitor; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
380 |
EXPECT_CALL(visitor, visit(expected)); \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
381 |
using iterator = fmt::basic_appender<Char>; \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
382 |
auto var = value; \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
383 |
fmt::detail::make_arg<fmt::basic_format_context<iterator, Char>>(var) \ |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
384 |
.visit(visitor); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
385 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
386 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
387 |
#define CHECK_ARG_SIMPLE(value) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
388 |
{ \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
389 |
using value_type = decltype(value); \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
390 |
typename visit_type<value_type>::type expected = value; \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
391 |
CHECK_ARG(char, expected, value) \ |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
392 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
393 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
394 |
template <typename T> class numeric_arg_test : public testing::Test {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
395 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
396 |
using test_types = |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
397 |
testing::Types<bool, signed char, unsigned char, short, unsigned short, int, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
398 |
unsigned, long, unsigned long, long long, unsigned long long, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
399 |
float, double, long double>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
400 |
TYPED_TEST_SUITE(numeric_arg_test, test_types); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
401 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
402 |
template <typename T, fmt::enable_if_t<std::is_integral<T>::value, int> = 0> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
403 |
auto test_value() -> T { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
404 |
return static_cast<T>(42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
405 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
406 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
407 |
template <typename T, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
408 |
fmt::enable_if_t<std::is_floating_point<T>::value, int> = 0> |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
409 |
auto test_value() -> T { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
410 |
return static_cast<T>(4.2); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
411 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
412 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
413 |
TYPED_TEST(numeric_arg_test, make_and_visit) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
414 |
CHECK_ARG_SIMPLE(test_value<TypeParam>()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
415 |
CHECK_ARG_SIMPLE(std::numeric_limits<TypeParam>::min()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
416 |
CHECK_ARG_SIMPLE(std::numeric_limits<TypeParam>::max()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
417 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
418 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
419 |
TEST(arg_test, char_arg) { CHECK_ARG(char, 'a', 'a'); } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
420 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
421 |
TEST(arg_test, string_arg) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
422 |
char str_data[] = "test"; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
423 |
char* str = str_data; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
424 |
const char* cstr = str; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
425 |
CHECK_ARG(char, cstr, str); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
426 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
427 |
auto sv = fmt::string_view(str); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
428 |
CHECK_ARG(char, sv, std::string(str)); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
429 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
430 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
431 |
TEST(arg_test, pointer_arg) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
432 |
void* p = nullptr; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
433 |
const void* cp = nullptr; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
434 |
CHECK_ARG(char, cp, p); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
435 |
CHECK_ARG_SIMPLE(cp); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
436 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
437 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
438 |
TEST(arg_test, volatile_pointer_arg) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
439 |
const void* p = nullptr; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
440 |
volatile int* vip = nullptr; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
441 |
const volatile int* cvip = nullptr; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
442 |
CHECK_ARG(char, p, static_cast<volatile void*>(vip)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
443 |
CHECK_ARG(char, p, static_cast<const volatile void*>(cvip)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
444 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
445 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
446 |
struct check_custom { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
447 |
auto operator()(fmt::basic_format_arg<fmt::format_context>::handle h) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
448 |
-> test_result { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
449 |
struct test_buffer final : fmt::detail::buffer<char> { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
450 |
char data[10]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
451 |
test_buffer() |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
452 |
: fmt::detail::buffer<char>([](buffer<char>&, size_t) {}, data, 0, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
453 |
10) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
454 |
} buffer; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
455 |
auto parse_ctx = fmt::format_parse_context(""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
456 |
auto ctx = fmt::format_context(fmt::appender(buffer), fmt::format_args()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
457 |
h.format(parse_ctx, ctx); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
458 |
EXPECT_EQ("test", std::string(buffer.data, buffer.size())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
459 |
return test_result(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
460 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
461 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
462 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
463 |
TEST(arg_test, custom_arg) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
464 |
auto test = test_struct(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
465 |
using visitor = |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
466 |
mock_visitor<fmt::basic_format_arg<fmt::format_context>::handle>; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
467 |
auto&& v = testing::StrictMock<visitor>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
468 |
EXPECT_CALL(v, visit(_)).WillOnce(Invoke(check_custom())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
469 |
fmt::detail::make_arg<fmt::format_context>(test).visit(v); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
470 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
471 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
472 |
TEST(arg_test, visit_invalid_arg) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
473 |
auto&& visitor = testing::StrictMock<mock_visitor<fmt::monostate>>(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
474 |
EXPECT_CALL(visitor, visit(_)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
475 |
fmt::basic_format_arg<fmt::format_context>().visit(visitor); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
476 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
477 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
478 |
#if FMT_USE_CONSTEXPR |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
479 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
480 |
enum class arg_id_result { none, empty, index, name }; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
481 |
struct test_arg_id_handler { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
482 |
arg_id_result res = arg_id_result::none; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
483 |
int index = 0; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
484 |
string_view name; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
485 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
486 |
constexpr void on_auto() { res = arg_id_result::empty; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
487 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
488 |
constexpr void on_index(int i) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
489 |
res = arg_id_result::index; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
490 |
index = i; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
491 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
492 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
493 |
constexpr void on_name(string_view n) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
494 |
res = arg_id_result::name; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
495 |
name = n; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
496 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
497 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
498 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
499 |
template <size_t N> |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
500 |
constexpr test_arg_id_handler parse_arg_id(const char (&s)[N]) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
501 |
auto h = test_arg_id_handler(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
502 |
fmt::detail::parse_arg_id(s, s + N, h); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
503 |
return h; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
504 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
505 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
506 |
TEST(base_test, constexpr_parse_arg_id) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
507 |
static_assert(parse_arg_id(":").res == arg_id_result::empty, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
508 |
static_assert(parse_arg_id("}").res == arg_id_result::empty, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
509 |
static_assert(parse_arg_id("42:").res == arg_id_result::index, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
510 |
static_assert(parse_arg_id("42:").index == 42, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
511 |
static_assert(parse_arg_id("foo:").res == arg_id_result::name, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
512 |
static_assert(parse_arg_id("foo:").name.size() == 3, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
513 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
514 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
515 |
template <size_t N> constexpr auto parse_test_specs(const char (&s)[N]) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
516 |
auto ctx = fmt::detail::compile_parse_context<char>(fmt::string_view(s, N), |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
517 |
43, nullptr); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
518 |
auto specs = fmt::detail::dynamic_format_specs<>(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
519 |
fmt::detail::parse_format_specs(s, s + N - 1, specs, ctx, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
520 |
fmt::detail::type::float_type); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
521 |
return specs; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
522 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
523 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
524 |
TEST(base_test, constexpr_parse_format_specs) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
525 |
static_assert(parse_test_specs("<").align == fmt::align::left, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
526 |
static_assert(parse_test_specs("*^").fill.get<char>() == '*', ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
527 |
static_assert(parse_test_specs("+").sign == fmt::sign::plus, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
528 |
static_assert(parse_test_specs("-").sign == fmt::sign::minus, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
529 |
static_assert(parse_test_specs(" ").sign == fmt::sign::space, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
530 |
static_assert(parse_test_specs("#").alt, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
531 |
static_assert(parse_test_specs("0").align == fmt::align::numeric, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
532 |
static_assert(parse_test_specs("L").localized, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
533 |
static_assert(parse_test_specs("42").width == 42, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
534 |
static_assert(parse_test_specs("{42}").width_ref.val.index == 42, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
535 |
static_assert(parse_test_specs(".42").precision == 42, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
536 |
static_assert(parse_test_specs(".{42}").precision_ref.val.index == 42, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
537 |
static_assert(parse_test_specs("f").type == fmt::presentation_type::fixed, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
538 |
""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
539 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
540 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
541 |
struct test_format_string_handler { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
542 |
constexpr void on_text(const char*, const char*) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
543 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
544 |
constexpr auto on_arg_id() -> int { return 0; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
545 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
546 |
template <typename T> constexpr auto on_arg_id(T) -> int { return 0; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
547 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
548 |
constexpr void on_replacement_field(int, const char*) {} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
549 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
550 |
constexpr auto on_format_specs(int, const char* begin, const char*) -> const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
551 |
char* { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
552 |
return begin; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
553 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
554 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
555 |
constexpr void on_error(const char*) { error = true; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
556 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
557 |
bool error = false; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
558 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
559 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
560 |
template <size_t N> constexpr bool parse_string(const char (&s)[N]) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
561 |
auto h = test_format_string_handler(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
562 |
fmt::detail::parse_format_string<true>(fmt::string_view(s, N - 1), h); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
563 |
return !h.error; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
564 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
565 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
566 |
TEST(base_test, constexpr_parse_format_string) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
567 |
static_assert(parse_string("foo"), ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
568 |
static_assert(!parse_string("}"), ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
569 |
static_assert(parse_string("{}"), ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
570 |
static_assert(parse_string("{42}"), ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
571 |
static_assert(parse_string("{foo}"), ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
572 |
static_assert(parse_string("{:}"), ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
573 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
574 |
#endif // FMT_USE_CONSTEXPR |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
575 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
576 |
struct enabled_formatter {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
577 |
struct enabled_ptr_formatter {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
578 |
struct disabled_formatter {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
579 |
struct disabled_formatter_convertible { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
580 |
operator int() const { return 42; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
581 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
582 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
583 |
FMT_BEGIN_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
584 |
template <> struct formatter<enabled_formatter> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
585 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
586 |
return ctx.begin(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
587 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
588 |
auto format(enabled_formatter, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
589 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
590 |
return ctx.out(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
591 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
592 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
593 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
594 |
template <> struct formatter<enabled_ptr_formatter*> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
595 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
596 |
return ctx.begin(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
597 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
598 |
auto format(enabled_ptr_formatter*, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
599 |
-> decltype(ctx.out()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
600 |
return ctx.out(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
601 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
602 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
603 |
FMT_END_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
604 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
605 |
TEST(base_test, has_formatter) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
606 |
using fmt::has_formatter; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
607 |
using context = fmt::format_context; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
608 |
static_assert(has_formatter<enabled_formatter, context>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
609 |
static_assert(!has_formatter<disabled_formatter, context>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
610 |
static_assert(!has_formatter<disabled_formatter_convertible, context>::value, |
| 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 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
614 |
struct const_formattable {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
615 |
struct nonconst_formattable {}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
616 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
617 |
FMT_BEGIN_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
618 |
template <> struct formatter<const_formattable> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
619 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
620 |
return ctx.begin(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
621 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
622 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
623 |
auto format(const const_formattable&, format_context& ctx) const |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
624 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
625 |
return copy("test", ctx.out()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
626 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
627 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
628 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
629 |
template <> struct formatter<nonconst_formattable> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
630 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
631 |
return ctx.begin(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
632 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
633 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
634 |
auto format(nonconst_formattable&, format_context& ctx) const |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
635 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
636 |
return copy("test", ctx.out()); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
637 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
638 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
639 |
FMT_END_NAMESPACE |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
640 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
641 |
struct convertible_to_pointer { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
642 |
operator const int*() const { return nullptr; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
643 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
644 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
645 |
struct convertible_to_pointer_formattable { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
646 |
operator const int*() const { return nullptr; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
647 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
648 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
649 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
650 |
template <> struct formatter<convertible_to_pointer_formattable> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
651 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
652 |
return ctx.begin(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
653 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
654 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
655 |
auto format(convertible_to_pointer_formattable, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
656 |
-> decltype(ctx.out()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
657 |
return copy("test", ctx.out()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
658 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
659 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
660 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
661 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
662 |
enum class unformattable_scoped_enum {}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
663 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
664 |
TEST(base_test, is_formattable) { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
665 |
static_assert(!fmt::is_formattable<wchar_t>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
666 |
#ifdef __cpp_char8_t |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
667 |
static_assert(!fmt::is_formattable<char8_t>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
668 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
669 |
static_assert(!fmt::is_formattable<char16_t>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
670 |
static_assert(!fmt::is_formattable<char32_t>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
671 |
static_assert(!fmt::is_formattable<signed char*>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
672 |
static_assert(!fmt::is_formattable<unsigned char*>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
673 |
static_assert(!fmt::is_formattable<const signed char*>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
674 |
static_assert(!fmt::is_formattable<const unsigned char*>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
675 |
static_assert(!fmt::is_formattable<const wchar_t*>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
676 |
static_assert(!fmt::is_formattable<const wchar_t[3]>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
677 |
static_assert(!fmt::is_formattable<fmt::basic_string_view<wchar_t>>::value, |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
678 |
""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
679 |
static_assert(fmt::is_formattable<enabled_formatter>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
680 |
static_assert(!fmt::is_formattable<enabled_ptr_formatter*>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
681 |
static_assert(!fmt::is_formattable<disabled_formatter>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
682 |
static_assert(!fmt::is_formattable<disabled_formatter_convertible>::value, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
683 |
""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
684 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
685 |
static_assert(fmt::is_formattable<const_formattable&>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
686 |
static_assert(fmt::is_formattable<const const_formattable&>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
687 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
688 |
static_assert(fmt::is_formattable<nonconst_formattable&>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
689 |
#if !FMT_MSC_VERSION || FMT_MSC_VERSION >= 1910 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
690 |
static_assert(!fmt::is_formattable<const nonconst_formattable&>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
691 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
692 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
693 |
static_assert(!fmt::is_formattable<convertible_to_pointer>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
694 |
const auto f = convertible_to_pointer_formattable(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
695 |
auto str = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
696 |
fmt::format_to(std::back_inserter(str), "{}", f); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
697 |
EXPECT_EQ(str, "test"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
698 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
699 |
static_assert(!fmt::is_formattable<void (*)()>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
700 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
701 |
struct s; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
702 |
static_assert(!fmt::is_formattable<int(s::*)>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
703 |
static_assert(!fmt::is_formattable<int (s::*)()>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
704 |
static_assert(!fmt::is_formattable<unformattable_scoped_enum>::value, ""); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
705 |
static_assert(!fmt::is_formattable<unformattable_scoped_enum>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
706 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
707 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
708 |
#if FMT_USE_CONCEPTS |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
709 |
TEST(base_test, formattable) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
710 |
static_assert(fmt::formattable<char>); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
711 |
static_assert(fmt::formattable<char&>); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
712 |
static_assert(fmt::formattable<char&&>); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
713 |
static_assert(fmt::formattable<const char>); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
714 |
static_assert(fmt::formattable<const char&>); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
715 |
static_assert(fmt::formattable<const char&&>); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
716 |
static_assert(fmt::formattable<int>); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
717 |
static_assert(!fmt::formattable<wchar_t>); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
718 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
719 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
720 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
721 |
TEST(base_test, format_to) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
722 |
auto s = std::string(); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
723 |
fmt::format_to(std::back_inserter(s), "{}", 42); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
724 |
EXPECT_EQ(s, "42"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
725 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
726 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
727 |
TEST(base_test, format_to_array) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
728 |
char buffer[4]; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
729 |
auto result = fmt::format_to(buffer, "{}", 12345); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
730 |
EXPECT_EQ(4, std::distance(&buffer[0], result.out)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
731 |
EXPECT_TRUE(result.truncated); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
732 |
EXPECT_EQ(buffer + 4, result.out); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
733 |
EXPECT_EQ("1234", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
734 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
735 |
char* out = nullptr; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
736 |
EXPECT_THROW(out = result, std::runtime_error); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
737 |
(void)out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
738 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
739 |
result = fmt::format_to(buffer, "{:s}", "foobar"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
740 |
EXPECT_EQ(4, std::distance(&buffer[0], result.out)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
741 |
EXPECT_TRUE(result.truncated); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
742 |
EXPECT_EQ(buffer + 4, result.out); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
743 |
EXPECT_EQ("foob", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
744 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
745 |
buffer[0] = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
746 |
buffer[1] = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
747 |
buffer[2] = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
748 |
buffer[3] = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
749 |
result = fmt::format_to(buffer, "{}", 'A'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
750 |
EXPECT_EQ(1, std::distance(&buffer[0], result.out)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
751 |
EXPECT_FALSE(result.truncated); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
752 |
EXPECT_EQ(buffer + 1, result.out); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
753 |
EXPECT_EQ("Axxx", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
754 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
755 |
result = fmt::format_to(buffer, "{}{} ", 'B', 'C'); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
756 |
EXPECT_EQ(3, std::distance(&buffer[0], result.out)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
757 |
EXPECT_FALSE(result.truncated); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
758 |
EXPECT_EQ(buffer + 3, result.out); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
759 |
EXPECT_EQ("BC x", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
760 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
761 |
result = fmt::format_to(buffer, "{}", "ABCDE"); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
762 |
EXPECT_EQ(4, std::distance(&buffer[0], result.out)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
763 |
EXPECT_TRUE(result.truncated); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
764 |
EXPECT_EQ("ABCD", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
765 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
766 |
result = fmt::format_to(buffer, "{}", std::string(1000, '*')); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
767 |
EXPECT_EQ(4, std::distance(&buffer[0], result.out)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
768 |
EXPECT_TRUE(result.truncated); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
769 |
EXPECT_EQ("****", fmt::string_view(buffer, 4)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
770 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
771 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
772 |
#ifdef __cpp_lib_byte |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
773 |
TEST(base_test, format_byte) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
774 |
auto s = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
775 |
fmt::format_to(std::back_inserter(s), "{}", std::byte(42)); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
776 |
EXPECT_EQ(s, "42"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
777 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
778 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
779 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
780 |
// Test that check is not found by ADL. |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
781 |
template <typename T> void check(T); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
782 |
TEST(base_test, adl_check) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
783 |
auto s = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
784 |
fmt::format_to(std::back_inserter(s), "{}", test_struct()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
785 |
EXPECT_EQ(s, "test"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
786 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
787 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
788 |
struct implicitly_convertible_to_string_view { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
789 |
operator fmt::string_view() const { return "foo"; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
790 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
791 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
792 |
TEST(base_test, no_implicit_conversion_to_string_view) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
793 |
EXPECT_FALSE( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
794 |
fmt::is_formattable<implicitly_convertible_to_string_view>::value); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
795 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
796 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
797 |
#ifdef FMT_USE_STRING_VIEW |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
798 |
struct implicitly_convertible_to_std_string_view { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
799 |
operator std::string_view() const { return "foo"; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
800 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
801 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
802 |
TEST(base_test, no_implicit_conversion_to_std_string_view) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
803 |
EXPECT_FALSE( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
804 |
fmt::is_formattable<implicitly_convertible_to_std_string_view>::value); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
805 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
806 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
807 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
808 |
// std::is_constructible is broken in MSVC until version 2015. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
809 |
#if !FMT_MSC_VERSION || FMT_MSC_VERSION >= 1900 |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
810 |
struct explicitly_convertible_to_string_view { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
811 |
explicit operator fmt::string_view() const { return "foo"; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
812 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
813 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
814 |
TEST(base_test, format_explicitly_convertible_to_string_view) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
815 |
// Types explicitly convertible to string_view are not formattable by |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
816 |
// default because it may introduce ODR violations. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
817 |
static_assert( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
818 |
!fmt::is_formattable<explicitly_convertible_to_string_view>::value, ""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
819 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
820 |
|
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
821 |
# ifdef FMT_USE_STRING_VIEW |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
822 |
struct explicitly_convertible_to_std_string_view { |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
823 |
explicit operator std::string_view() const { return "foo"; } |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
824 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
825 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
826 |
TEST(base_test, format_explicitly_convertible_to_std_string_view) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
827 |
// Types explicitly convertible to string_view are not formattable by |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
828 |
// default because it may introduce ODR violations. |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
829 |
static_assert( |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
830 |
!fmt::is_formattable<explicitly_convertible_to_std_string_view>::value, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
831 |
""); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
832 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
833 |
# endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
834 |
#endif |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
835 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
836 |
TEST(base_test, has_const_formatter) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
837 |
EXPECT_TRUE((fmt::detail::has_const_formatter<const_formattable, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
838 |
fmt::format_context>())); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
839 |
EXPECT_FALSE((fmt::detail::has_const_formatter<nonconst_formattable, |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
840 |
fmt::format_context>())); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
841 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
842 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
843 |
TEST(base_test, format_nonconst) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
844 |
auto s = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
845 |
fmt::format_to(std::back_inserter(s), "{}", nonconst_formattable()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
846 |
EXPECT_EQ(s, "test"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
847 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
848 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
849 |
TEST(base_test, throw_in_buffer_dtor) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
850 |
enum { buffer_size = 256 }; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
851 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
852 |
struct throwing_iterator { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
853 |
int& count; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
854 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
855 |
auto operator=(char) -> throwing_iterator& { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
856 |
if (++count > buffer_size) throw std::exception(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
857 |
return *this; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
858 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
859 |
auto operator*() -> throwing_iterator& { return *this; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
860 |
auto operator++() -> throwing_iterator& { return *this; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
861 |
auto operator++(int) -> throwing_iterator { return *this; } |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
862 |
}; |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
863 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
864 |
try { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
865 |
int count = 0; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
866 |
fmt::format_to(throwing_iterator{count}, fmt::runtime("{:{}}{"), "", |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
867 |
buffer_size + 1); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
868 |
} catch (const std::exception&) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
869 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
870 |
} |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
871 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
872 |
struct its_a_trap { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
873 |
template <typename T> operator T() const { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
874 |
auto v = T(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
875 |
v.x = 42; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
876 |
return v; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
877 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
878 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
879 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
880 |
FMT_BEGIN_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
881 |
template <> struct formatter<its_a_trap> { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
882 |
FMT_CONSTEXPR auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
883 |
return ctx.begin(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
884 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
885 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
886 |
auto format(its_a_trap, format_context& ctx) const |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
887 |
-> decltype(ctx.out()) const { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
888 |
auto out = ctx.out(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
889 |
*out++ = 'x'; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
890 |
return out; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
891 |
} |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
892 |
}; |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
893 |
FMT_END_NAMESPACE |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
894 |
|
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
895 |
TEST(base_test, trappy_conversion) { |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
896 |
auto s = std::string(); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
897 |
fmt::format_to(std::back_inserter(s), "{}", its_a_trap()); |
| 47fd5c32 |
Poul Sander |
2024-10-05 08:44 |
898 |
EXPECT_EQ(s, "x"); |
| f8deb5b9 |
Poul Sander |
2022-01-15 13:55 |
899 |
} |
|
|
1970-01-01 00:00 |
900 |
|