Blender V4.3
BLI_string_ref_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#include "BLI_string_ref.hh"
6#include "BLI_vector.hh"
7
8#include "testing/testing.h"
9
10#include "BLI_strict_flags.h" /* Keep last. */
11
12namespace blender::tests {
13
14TEST(string_ref_null, DefaultConstructor)
15{
16 StringRefNull ref;
17 EXPECT_EQ(ref.size(), 0);
18 EXPECT_EQ(ref[0], '\0');
19}
20
21TEST(string_ref_null, CStringConstructor)
22{
23 const char *str = "Hello";
24 StringRefNull ref(str);
25 EXPECT_EQ(ref.size(), 5);
26 EXPECT_EQ(ref.data(), str);
27}
28
29TEST(string_ref_null, CStringLengthConstructor)
30{
31 const char *str = "Hello";
32 StringRefNull ref(str, 5);
33 EXPECT_EQ(ref.size(), 5);
34 EXPECT_EQ(ref.data(), str);
35}
36
37TEST(string_ref_null, CompareEqual)
38{
39 StringRefNull ref1("test");
40 StringRefNull ref2("test");
41 StringRefNull ref3("other");
42 EXPECT_TRUE(ref1 == ref2);
43 EXPECT_FALSE(ref1 == ref3);
44 EXPECT_TRUE(ref1 != ref3);
45 EXPECT_FALSE(ref1 != ref2);
46}
47
48TEST(string_ref_null, CompareEqualCharPtr1)
49{
50 StringRefNull ref("test");
51 EXPECT_TRUE(ref == "test");
52 EXPECT_FALSE(ref == "other");
53 EXPECT_TRUE(ref != "other");
54 EXPECT_FALSE(ref != "test");
55}
56
57TEST(string_ref_null, CompareEqualCharPtr2)
58{
59 StringRefNull ref("test");
60 EXPECT_TRUE("test" == ref);
61 EXPECT_FALSE("other" == ref);
62 EXPECT_TRUE(ref != "other");
63 EXPECT_FALSE(ref != "test");
64}
65
66TEST(string_ref_null, CompareEqualString1)
67{
68 StringRefNull ref("test");
69 EXPECT_TRUE(ref == std::string("test"));
70 EXPECT_FALSE(ref == std::string("other"));
71 EXPECT_TRUE(ref != std::string("other"));
72 EXPECT_FALSE(ref != std::string("test"));
73}
74
75TEST(string_ref_null, CompareEqualString2)
76{
77 StringRefNull ref("test");
78 EXPECT_TRUE(std::string("test") == ref);
79 EXPECT_FALSE(std::string("other") == ref);
80 EXPECT_TRUE(std::string("other") != ref);
81 EXPECT_FALSE(std::string("test") != ref);
82}
83
84TEST(string_ref_null, CompareEqualStringRef1)
85{
86 StringRefNull ref("test");
87 EXPECT_TRUE(ref == StringRef("test"));
88 EXPECT_FALSE(ref == StringRef("other"));
89 EXPECT_TRUE(ref != StringRef("other"));
90 EXPECT_FALSE(ref != StringRef("test"));
91}
92
93TEST(string_ref_null, CompareEqualStringRef2)
94{
95 StringRefNull ref("test");
96 EXPECT_TRUE(StringRef("test") == ref);
97 EXPECT_FALSE(StringRef("other") == ref);
98 EXPECT_TRUE(StringRef("other") != ref);
99 EXPECT_FALSE(StringRef("test") != ref);
100}
101
102TEST(string_ref, DefaultConstructor)
103{
104 StringRef ref;
105 EXPECT_EQ(ref.size(), 0);
106}
107
108TEST(string_ref, StartEndConstructor)
109{
110 const char *text = "hello world";
111 StringRef ref(text, text + 5);
112 EXPECT_EQ(ref.size(), 5);
113 EXPECT_TRUE(ref == "hello");
114 EXPECT_FALSE(ref == "hello ");
115}
116
117TEST(string_ref, StartEndConstructorNullptr)
118{
119 StringRef ref(nullptr, nullptr);
120 EXPECT_EQ(ref.size(), 0);
121 EXPECT_TRUE(ref == "");
122}
123
124TEST(string_ref, StartEndConstructorSame)
125{
126 const char *text = "hello world";
127 StringRef ref(text, text);
128 EXPECT_EQ(ref.size(), 0);
129 EXPECT_TRUE(ref == "");
130}
131
132TEST(string_ref, CStringConstructor)
133{
134 const char *str = "Test";
135 StringRef ref(str);
136 EXPECT_EQ(ref.size(), 4);
137 EXPECT_EQ(ref.data(), str);
138}
139
140TEST(string_ref, PointerWithLengthConstructor)
141{
142 const char *str = "Test";
143 StringRef ref(str, 2);
144 EXPECT_EQ(ref.size(), 2);
145 EXPECT_EQ(ref.data(), str);
146}
147
148TEST(string_ref, StdStringConstructor)
149{
150 std::string str = "Test";
151 StringRef ref(str);
152 EXPECT_EQ(ref.size(), 4);
153 EXPECT_EQ(ref.data(), str.data());
154}
155
156TEST(string_ref, SubscriptOperator)
157{
158 StringRef ref("hello");
159 EXPECT_EQ(ref.size(), 5);
160 EXPECT_EQ(ref[0], 'h');
161 EXPECT_EQ(ref[1], 'e');
162 EXPECT_EQ(ref[2], 'l');
163 EXPECT_EQ(ref[3], 'l');
164 EXPECT_EQ(ref[4], 'o');
165}
166
167TEST(string_ref, ToStdString)
168{
169 StringRef ref("test");
170 std::string str = ref;
171 EXPECT_EQ(str.size(), 4);
172 EXPECT_EQ(str, "test");
173}
174
175TEST(string_ref, Print)
176{
177 StringRef ref("test");
178 std::stringstream ss;
179 ss << ref;
180 ss << ref;
181 std::string str = ss.str();
182 EXPECT_EQ(str.size(), 8);
183 EXPECT_EQ(str, "testtest");
184}
185
186TEST(string_ref, Add)
187{
188 StringRef a("qwe");
189 StringRef b("asd");
190 std::string result = a + b;
191 EXPECT_EQ(result, "qweasd");
192}
193
194TEST(string_ref, AddCharPtr1)
195{
196 StringRef ref("test");
197 std::string result = ref + "qwe";
198 EXPECT_EQ(result, "testqwe");
199}
200
201TEST(string_ref, AddCharPtr2)
202{
203 StringRef ref("test");
204 std::string result = "qwe" + ref;
205 EXPECT_EQ(result, "qwetest");
206}
207
208TEST(string_ref, AddString1)
209{
210 StringRef ref("test");
211 std::string result = ref + std::string("asd");
212 EXPECT_EQ(result, "testasd");
213}
214
215TEST(string_ref, AddString2)
216{
217 StringRef ref("test");
218 std::string result = std::string("asd") + ref;
219 EXPECT_EQ(result, "asdtest");
220}
221
222TEST(string_ref, CompareEqual)
223{
224 StringRef ref1("test");
225 StringRef ref2("test");
226 StringRef ref3("other");
227 EXPECT_TRUE(ref1 == ref2);
228 EXPECT_FALSE(ref1 == ref3);
229 EXPECT_TRUE(ref1 != ref3);
230 EXPECT_FALSE(ref1 != ref2);
231}
232
233TEST(string_ref, CompareEqualCharPtr1)
234{
235 StringRef ref("test");
236 EXPECT_TRUE(ref == "test");
237 EXPECT_FALSE(ref == "other");
238 EXPECT_TRUE(ref != "other");
239 EXPECT_FALSE(ref != "test");
240}
241
242TEST(string_ref, CompareEqualCharPtr2)
243{
244 StringRef ref("test");
245 EXPECT_TRUE("test" == ref);
246 EXPECT_FALSE("other" == ref);
247 EXPECT_TRUE(ref != "other");
248 EXPECT_FALSE(ref != "test");
249}
250
251TEST(string_ref, CompareEqualString1)
252{
253 StringRef ref("test");
254 EXPECT_TRUE(ref == std::string("test"));
255 EXPECT_FALSE(ref == std::string("other"));
256 EXPECT_TRUE(ref != std::string("other"));
257 EXPECT_FALSE(ref != std::string("test"));
258}
259
260TEST(string_ref, CompareEqualString2)
261{
262 StringRef ref("test");
263 EXPECT_TRUE(std::string("test") == ref);
264 EXPECT_FALSE(std::string("other") == ref);
265 EXPECT_TRUE(std::string("other") != ref);
266 EXPECT_FALSE(std::string("test") != ref);
267}
268
269TEST(string_ref, Iterate)
270{
271 StringRef ref("test");
272 Vector<char> chars;
273 for (char c : ref) {
274 chars.append(c);
275 }
276 EXPECT_EQ(chars.size(), 4);
277 EXPECT_EQ(chars[0], 't');
278 EXPECT_EQ(chars[1], 'e');
279 EXPECT_EQ(chars[2], 's');
280 EXPECT_EQ(chars[3], 't');
281}
282
283TEST(string_ref, StartsWith)
284{
285 StringRef ref("test");
286 EXPECT_TRUE(ref.startswith(""));
287 EXPECT_TRUE(ref.startswith("t"));
288 EXPECT_TRUE(ref.startswith("te"));
289 EXPECT_TRUE(ref.startswith("tes"));
290 EXPECT_TRUE(ref.startswith("test"));
291 EXPECT_FALSE(ref.startswith("test "));
292 EXPECT_FALSE(ref.startswith("a"));
293}
294
295TEST(string_ref, EndsWith)
296{
297 StringRef ref("test");
298 EXPECT_TRUE(ref.endswith(""));
299 EXPECT_TRUE(ref.endswith("t"));
300 EXPECT_TRUE(ref.endswith("st"));
301 EXPECT_TRUE(ref.endswith("est"));
302 EXPECT_TRUE(ref.endswith("test"));
303 EXPECT_FALSE(ref.endswith(" test"));
304 EXPECT_FALSE(ref.endswith("a"));
305}
306
307TEST(string_ref, DropPrefixN)
308{
309 StringRef ref("test");
310 StringRef ref2 = ref.drop_prefix(2);
311 StringRef ref3 = ref2.drop_prefix(2);
312 EXPECT_EQ(ref2.size(), 2);
313 EXPECT_EQ(ref3.size(), 0);
314 EXPECT_EQ(ref2, "st");
315 EXPECT_EQ(ref3, "");
316}
317
318TEST(string_ref, DropPrefixLargeN)
319{
320 StringRef ref("test");
321 StringRef ref2 = ref.drop_prefix(100);
322 EXPECT_EQ(ref2.size(), 0);
323 EXPECT_EQ(ref2, "");
324}
325
326TEST(string_ref, DropKnownPrefix)
327{
328 StringRef ref("test");
329 StringRef ref2 = ref.drop_known_prefix("tes");
330 EXPECT_EQ(ref2.size(), 1);
331 EXPECT_EQ(ref2, "t");
332}
333
334TEST(string_ref, DropSuffix)
335{
336 StringRef ref("test");
337 StringRef ref2 = ref.drop_suffix(1);
338 EXPECT_EQ(ref2.size(), 3);
339 EXPECT_EQ(ref2, "tes");
340}
341
342TEST(string_ref, DropSuffixLargeN)
343{
344 StringRef ref("test");
345 StringRef ref2 = ref.drop_suffix(100);
346 EXPECT_EQ(ref2.size(), 0);
347 EXPECT_EQ(ref2, "");
348}
349
350TEST(string_ref, TrimArbitrary)
351{
352 StringRef ref1("test");
353 StringRef ref2(" test ");
354 StringRef ref3(" \t Urož with spaces ");
355 StringRef ref4("žžžžleepyžžž");
356 EXPECT_EQ(ref1.trim("t"), "es");
357 EXPECT_EQ(ref1.trim("te"), "s");
358 EXPECT_EQ(ref1.trim("test"), "");
359 EXPECT_EQ(ref2.trim("t"), " test ");
360 EXPECT_EQ(ref2.trim(""), " test ");
361 EXPECT_EQ(ref3.trim(" "), "\t Urož with spaces"); /* TAB should be kept. */
362 EXPECT_EQ(ref4.trim("ž"), "leepy");
363}
364
365TEST(string_ref, TrimWhitespace)
366{
367 StringRef ref1("test");
368 StringRef ref2(" test ");
369 StringRef ref3(" \t Urož with spaces ");
370 StringRef ref4(" \t \n\r \t ");
371 EXPECT_EQ(ref1.trim(), "test");
372 EXPECT_EQ(ref2.trim(), "test");
373 EXPECT_EQ(ref3.trim(), "Urož with spaces");
374 EXPECT_EQ(ref4.trim(), "");
375}
376
377TEST(string_ref, TrimCharacter)
378{
379 StringRef ref1("test");
380 StringRef ref2(" test ");
381 StringRef ref3("does this work?");
382 EXPECT_EQ(ref1.trim('t'), "es");
383 EXPECT_EQ(ref1.trim('p'), "test");
384 EXPECT_EQ(ref2.trim(' '), "test");
385 EXPECT_EQ(ref3.trim('\000'), "does this work?");
386}
387
388TEST(string_ref, Substr)
389{
390 StringRef ref("hello world");
391 EXPECT_EQ(ref.substr(0, 5), "hello");
392 EXPECT_EQ(ref.substr(4, 0), "");
393 EXPECT_EQ(ref.substr(3, 4), "lo w");
394 EXPECT_EQ(ref.substr(6, 5), "world");
395 EXPECT_EQ(ref.substr(8), "rld");
396 EXPECT_EQ(ref.substr(8, 100), "rld");
397}
398
399TEST(string_ref, Copy)
400{
401 StringRef ref("hello");
402 char dst[10];
403 memset(dst, 0xFF, 10);
404 ref.copy(dst);
405 EXPECT_EQ(dst[5], '\0');
406 EXPECT_EQ(dst[6], 0xFF);
407 EXPECT_EQ(ref, dst);
408}
409
410TEST(string_ref, FromStringView)
411{
412 std::string_view view = "hello";
413 StringRef ref = view;
414 EXPECT_EQ(ref, "hello");
415}
416
417TEST(string_ref, ToStringView)
418{
419 StringRef ref = "hello";
420 std::string_view view = ref;
421 EXPECT_EQ(view, "hello");
422}
423
424TEST(string_ref, Constexpr)
425{
426 constexpr StringRef sref("World");
427 BLI_STATIC_ASSERT(sref[2] == 'r', "");
428 BLI_STATIC_ASSERT(sref.size() == 5, "");
429 std::array<int, std::size_t(sref.find_first_of('o'))> compiles = {1};
430 EXPECT_EQ(compiles[0], 1);
431}
432} // namespace blender::tests
#define BLI_STATIC_ASSERT(a, msg)
Definition BLI_assert.h:87
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
static AppView * view
void copy(char *dst, int64_t dst_size) const
constexpr StringRef substr(int64_t start, int64_t size) const
constexpr bool startswith(StringRef prefix) const
constexpr bool endswith(StringRef suffix) const
constexpr int64_t find_first_of(StringRef chars, int64_t pos=0) const
constexpr int64_t size() const
constexpr StringRef trim() const
constexpr const char * data() const
constexpr StringRef drop_prefix(int64_t n) const
constexpr StringRef drop_suffix(int64_t n) const
constexpr StringRef drop_known_prefix(StringRef prefix) const
int64_t size() const
void append(const T &value)
local_group_size(16, 16) .push_constant(Type b
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
#define str(s)
TEST(any, DefaultConstructor)