5#include "core/fxcrt/widestring.h"
13#include "build/build_config.h"
14#include "core/fxcrt/compiler_specific.h"
15#include "core/fxcrt/containers/contains.h"
16#include "core/fxcrt/fx_string.h"
17#include "core/fxcrt/span.h"
18#include "core/fxcrt/utf16.h"
19#include "testing/gtest/include/gtest/gtest.h"
25 pdfium::span<
const wchar_t> empty_span = empty.span();
26 pdfium::span<
const wchar_t> empty_span_with_terminator =
27 empty.span_with_terminator();
28 EXPECT_EQ(0u, empty_span.size());
29 ASSERT_EQ(1u, empty_span_with_terminator.size());
30 EXPECT_EQ(L'\0', empty_span_with_terminator[0]);
33 EXPECT_EQ(L'a', abc[0]);
34 EXPECT_EQ(L'b', abc[1]);
35 EXPECT_EQ(L'c', abc[2]);
37 EXPECT_DEATH({ abc[4]; },
"");
40 pdfium::span<
const wchar_t> abc_span = abc.span();
41 EXPECT_EQ(3u, abc_span.size());
42 EXPECT_EQ(0, wmemcmp(abc_span.data(), L"abc", 3));
44 pdfium::span<
const wchar_t> abc_span_with_terminator =
45 abc.span_with_terminator();
46 EXPECT_EQ(4u, abc_span_with_terminator.size());
47 EXPECT_EQ(0, wmemcmp(abc_span_with_terminator.data(), L"abc", 4));
50 EXPECT_EQ(abc.c_str(), mutable_abc.c_str());
51 EXPECT_EQ(L'a', mutable_abc[0]);
52 EXPECT_EQ(L'b', mutable_abc[1]);
53 EXPECT_EQ(L'c', mutable_abc[2]);
54 EXPECT_EQ(abc.c_str(), mutable_abc.c_str());
55 EXPECT_EQ(L"abc", abc);
57 const wchar_t* c_str = abc.c_str();
58 mutable_abc.SetAt(0, L'd');
59 EXPECT_EQ(c_str, abc.c_str());
60 EXPECT_NE(c_str, mutable_abc.c_str());
61 EXPECT_EQ(L"abc", abc);
62 EXPECT_EQ(L"dbc", mutable_abc);
64 mutable_abc.SetAt(1, L'e');
65 EXPECT_EQ(L"abc", abc);
66 EXPECT_EQ(L"dec", mutable_abc);
68 mutable_abc.SetAt(2, L'f');
69 EXPECT_EQ(L"abc", abc);
70 EXPECT_EQ(L"def", mutable_abc);
72 EXPECT_DEATH({ mutable_abc.SetAt(3, L'g'); },
"");
73 EXPECT_EQ(L"abc", abc);
82 EXPECT_EQ(L"abc", string1);
83 EXPECT_EQ(L"abc", string2);
91 EXPECT_TRUE(string1.IsEmpty());
92 EXPECT_EQ(L"abc", string2);
121 string1 =
std::move(string2);
122 EXPECT_EQ(L"abc", string1);
123 EXPECT_TRUE(string2.IsEmpty());
132 EXPECT_EQ(L"abc", string1);
134 EXPECT_TRUE(string1.IsEmpty());
136 EXPECT_EQ(L"def", string1);
138 EXPECT_TRUE(string1.IsEmpty());
143 EXPECT_EQ(L"abc", string1);
144 string1 = WideStringView(L"");
145 EXPECT_TRUE(string1.IsEmpty());
146 string1 = WideStringView(L"def");
147 EXPECT_EQ(L"def", string1);
162 const wchar_t*
const c_null =
nullptr;
163 const wchar_t*
const c_empty = L"";
164 const wchar_t*
const c_a = L"a";
165 const wchar_t*
const c_ab = L"ab";
166 const wchar_t*
const c_abc = L"\x0110qq";
167 const wchar_t*
const c_def = L"\x1001qq";
169 EXPECT_FALSE(empty
< empty);
171 EXPECT_FALSE(abc
< abc);
172 EXPECT_FALSE(def
< def);
173 EXPECT_FALSE(c_null
< empty);
174 EXPECT_FALSE(c_empty
< empty);
175 EXPECT_FALSE(c_a
< a);
176 EXPECT_FALSE(c_abc
< abc);
177 EXPECT_FALSE(c_def
< def);
178 EXPECT_FALSE(empty
< c_null);
179 EXPECT_FALSE(empty
< c_empty);
180 EXPECT_FALSE(a
< c_a);
181 EXPECT_FALSE(abc
< c_abc);
182 EXPECT_FALSE(def
< c_def);
183 EXPECT_FALSE(empty < v_empty);
184 EXPECT_FALSE(a < v_a);
185 EXPECT_FALSE(abc < v_abc);
186 EXPECT_FALSE(def < v_def);
188 EXPECT_TRUE(empty
< a);
189 EXPECT_FALSE(a
< empty);
190 EXPECT_TRUE(c_null
< a);
191 EXPECT_TRUE(c_empty
< a);
192 EXPECT_FALSE(c_a
< empty);
193 EXPECT_TRUE(empty
< c_a);
194 EXPECT_FALSE(a
< c_null);
195 EXPECT_FALSE(a
< c_empty);
196 EXPECT_TRUE(empty < v_a);
197 EXPECT_FALSE(a < v_empty);
199 EXPECT_TRUE(empty
< abc);
200 EXPECT_FALSE(abc
< empty);
201 EXPECT_TRUE(c_null
< abc);
202 EXPECT_TRUE(c_empty
< abc);
203 EXPECT_FALSE(c_abc
< empty);
204 EXPECT_TRUE(empty
< c_abc);
205 EXPECT_FALSE(abc
< c_null);
206 EXPECT_FALSE(abc
< c_empty);
207 EXPECT_TRUE(empty < v_abc);
208 EXPECT_FALSE(abc < v_empty);
210 EXPECT_TRUE(empty
< def);
211 EXPECT_FALSE(def
< empty);
212 EXPECT_TRUE(c_null
< def);
213 EXPECT_TRUE(c_empty
< def);
214 EXPECT_FALSE(c_def
< empty);
215 EXPECT_TRUE(empty
< c_def);
216 EXPECT_FALSE(def
< c_null);
217 EXPECT_FALSE(def
< c_empty);
218 EXPECT_TRUE(empty < v_def);
219 EXPECT_FALSE(def < v_empty);
221 EXPECT_TRUE(a
< abc);
222 EXPECT_FALSE(abc
< a);
223 EXPECT_TRUE(c_a
< abc);
224 EXPECT_FALSE(c_abc
< a);
225 EXPECT_TRUE(a
< c_abc);
226 EXPECT_FALSE(abc
< c_a);
227 EXPECT_TRUE(a < v_abc);
228 EXPECT_FALSE(abc < v_a);
230 EXPECT_TRUE(a
< def);
231 EXPECT_FALSE(def
< a);
232 EXPECT_TRUE(c_a
< def);
233 EXPECT_FALSE(c_def
< a);
234 EXPECT_TRUE(a
< c_def);
235 EXPECT_FALSE(def
< c_a);
236 EXPECT_TRUE(a < v_def);
237 EXPECT_FALSE(def < v_a);
239 EXPECT_TRUE(abc
< def);
240 EXPECT_FALSE(def
< abc);
241 EXPECT_TRUE(c_abc
< def);
242 EXPECT_FALSE(c_def
< abc);
243 EXPECT_TRUE(abc
< c_def);
244 EXPECT_FALSE(def
< c_abc);
245 EXPECT_TRUE(abc < v_def);
246 EXPECT_FALSE(def < v_abc);
249 EXPECT_TRUE(a
< c_ab);
250 EXPECT_TRUE(a < v_ab);
251 EXPECT_TRUE(c_a
< ab);
252 EXPECT_TRUE(c_a < v_ab);
253 EXPECT_TRUE(v_a < c_ab);
254 EXPECT_TRUE(v_a < v_ab);
259 EXPECT_TRUE(null_string
== null_string);
262 EXPECT_TRUE(empty_string
== empty_string);
263 EXPECT_TRUE(empty_string
== null_string);
264 EXPECT_TRUE(null_string
== empty_string);
267 deleted_string.Delete(0, 5);
268 EXPECT_TRUE(deleted_string
== deleted_string);
269 EXPECT_TRUE(deleted_string
== null_string);
270 EXPECT_TRUE(deleted_string
== empty_string);
271 EXPECT_TRUE(null_string
== deleted_string);
272 EXPECT_TRUE(null_string
== empty_string);
275 EXPECT_TRUE(wide_string
== wide_string);
276 EXPECT_FALSE(wide_string
== null_string);
277 EXPECT_FALSE(wide_string
== empty_string);
278 EXPECT_FALSE(wide_string
== deleted_string);
279 EXPECT_FALSE(null_string
== wide_string);
280 EXPECT_FALSE(empty_string
== wide_string);
281 EXPECT_FALSE(deleted_string
== wide_string);
284 EXPECT_TRUE(wide_string
== wide_string_same1);
285 EXPECT_TRUE(wide_string_same1
== wide_string);
288 EXPECT_TRUE(wide_string
== wide_string_same2);
289 EXPECT_TRUE(wide_string_same2
== wide_string);
294 EXPECT_FALSE(wide_string
== wide_string1);
295 EXPECT_FALSE(wide_string
== wide_string2);
296 EXPECT_FALSE(wide_string
== wide_string3);
297 EXPECT_FALSE(wide_string1
== wide_string);
298 EXPECT_FALSE(wide_string2
== wide_string);
299 EXPECT_FALSE(wide_string3
== wide_string);
303 EXPECT_TRUE(null_string == null_string_c);
304 EXPECT_TRUE(null_string == empty_string_c);
305 EXPECT_TRUE(empty_string == null_string_c);
306 EXPECT_TRUE(empty_string == empty_string_c);
307 EXPECT_TRUE(deleted_string == null_string_c);
308 EXPECT_TRUE(deleted_string == empty_string_c);
309 EXPECT_TRUE(null_string_c == null_string);
310 EXPECT_TRUE(empty_string_c == null_string);
311 EXPECT_TRUE(null_string_c == empty_string);
312 EXPECT_TRUE(empty_string_c == empty_string);
313 EXPECT_TRUE(null_string_c == deleted_string);
314 EXPECT_TRUE(empty_string_c == deleted_string);
317 EXPECT_TRUE(wide_string == wide_string_c_same1);
318 EXPECT_TRUE(wide_string_c_same1 == wide_string);
323 EXPECT_FALSE(wide_string == wide_string_c1);
324 EXPECT_FALSE(wide_string == wide_string_c2);
325 EXPECT_FALSE(wide_string == wide_string_c3);
326 EXPECT_FALSE(wide_string_c1 == wide_string);
327 EXPECT_FALSE(wide_string_c2 == wide_string);
328 EXPECT_FALSE(wide_string_c3 == wide_string);
330 const wchar_t*
const c_null_string =
nullptr;
331 const wchar_t*
const c_empty_string = L"";
332 EXPECT_TRUE(null_string
== c_null_string);
333 EXPECT_TRUE(null_string
== c_empty_string);
334 EXPECT_TRUE(empty_string
== c_null_string);
335 EXPECT_TRUE(empty_string
== c_empty_string);
336 EXPECT_TRUE(deleted_string
== c_null_string);
337 EXPECT_TRUE(deleted_string
== c_empty_string);
338 EXPECT_TRUE(c_null_string
== null_string);
339 EXPECT_TRUE(c_empty_string
== null_string);
340 EXPECT_TRUE(c_null_string
== empty_string);
341 EXPECT_TRUE(c_empty_string
== empty_string);
342 EXPECT_TRUE(c_null_string
== deleted_string);
343 EXPECT_TRUE(c_empty_string
== deleted_string);
345 const wchar_t*
const c_string_same1 = L"hello";
346 EXPECT_TRUE(wide_string
== c_string_same1);
347 EXPECT_TRUE(c_string_same1
== wide_string);
349 const wchar_t*
const c_string1 = L"he";
350 const wchar_t*
const c_string2 = L"hellp";
351 const wchar_t*
const c_string3 = L"hellod";
352 EXPECT_FALSE(wide_string
== c_string1);
353 EXPECT_FALSE(wide_string
== c_string2);
354 EXPECT_FALSE(wide_string
== c_string3);
355 EXPECT_FALSE(c_string1
== wide_string);
356 EXPECT_FALSE(c_string2
== wide_string);
357 EXPECT_FALSE(c_string3
== wide_string);
362 EXPECT_FALSE(null_string
!= null_string);
365 EXPECT_FALSE(empty_string
!= empty_string);
366 EXPECT_FALSE(empty_string
!= null_string);
367 EXPECT_FALSE(null_string
!= empty_string);
370 deleted_string.Delete(0, 5);
371 EXPECT_FALSE(deleted_string
!= deleted_string);
372 EXPECT_FALSE(deleted_string
!= null_string);
373 EXPECT_FALSE(deleted_string
!= empty_string);
374 EXPECT_FALSE(null_string
!= deleted_string);
375 EXPECT_FALSE(null_string
!= empty_string);
378 EXPECT_FALSE(wide_string
!= wide_string);
379 EXPECT_TRUE(wide_string
!= null_string);
380 EXPECT_TRUE(wide_string
!= empty_string);
381 EXPECT_TRUE(wide_string
!= deleted_string);
382 EXPECT_TRUE(null_string
!= wide_string);
383 EXPECT_TRUE(empty_string
!= wide_string);
384 EXPECT_TRUE(deleted_string
!= wide_string);
387 EXPECT_FALSE(wide_string
!= wide_string_same1);
388 EXPECT_FALSE(wide_string_same1
!= wide_string);
391 EXPECT_FALSE(wide_string
!= wide_string_same2);
392 EXPECT_FALSE(wide_string_same2
!= wide_string);
397 EXPECT_TRUE(wide_string
!= wide_string1);
398 EXPECT_TRUE(wide_string
!= wide_string2);
399 EXPECT_TRUE(wide_string
!= wide_string3);
400 EXPECT_TRUE(wide_string1
!= wide_string);
401 EXPECT_TRUE(wide_string2
!= wide_string);
402 EXPECT_TRUE(wide_string3
!= wide_string);
406 EXPECT_FALSE(null_string != null_string_c);
407 EXPECT_FALSE(null_string != empty_string_c);
408 EXPECT_FALSE(empty_string != null_string_c);
409 EXPECT_FALSE(empty_string != empty_string_c);
410 EXPECT_FALSE(deleted_string != null_string_c);
411 EXPECT_FALSE(deleted_string != empty_string_c);
412 EXPECT_FALSE(null_string_c != null_string);
413 EXPECT_FALSE(empty_string_c != null_string);
414 EXPECT_FALSE(null_string_c != empty_string);
415 EXPECT_FALSE(empty_string_c != empty_string);
418 EXPECT_FALSE(wide_string != wide_string_c_same1);
419 EXPECT_FALSE(wide_string_c_same1 != wide_string);
424 EXPECT_TRUE(wide_string != wide_string_c1);
425 EXPECT_TRUE(wide_string != wide_string_c2);
426 EXPECT_TRUE(wide_string != wide_string_c3);
427 EXPECT_TRUE(wide_string_c1 != wide_string);
428 EXPECT_TRUE(wide_string_c2 != wide_string);
429 EXPECT_TRUE(wide_string_c3 != wide_string);
431 const wchar_t*
const c_null_string =
nullptr;
432 const wchar_t*
const c_empty_string = L"";
433 EXPECT_FALSE(null_string
!= c_null_string);
434 EXPECT_FALSE(null_string
!= c_empty_string);
435 EXPECT_FALSE(empty_string
!= c_null_string);
436 EXPECT_FALSE(empty_string
!= c_empty_string);
437 EXPECT_FALSE(deleted_string
!= c_null_string);
438 EXPECT_FALSE(deleted_string
!= c_empty_string);
439 EXPECT_FALSE(c_null_string
!= null_string);
440 EXPECT_FALSE(c_empty_string
!= null_string);
441 EXPECT_FALSE(c_null_string
!= empty_string);
442 EXPECT_FALSE(c_empty_string
!= empty_string);
443 EXPECT_FALSE(c_null_string
!= deleted_string);
444 EXPECT_FALSE(c_empty_string
!= deleted_string);
446 const wchar_t*
const c_string_same1 = L"hello";
447 EXPECT_FALSE(wide_string
!= c_string_same1);
448 EXPECT_FALSE(c_string_same1
!= wide_string);
450 const wchar_t*
const c_string1 = L"he";
451 const wchar_t*
const c_string2 = L"hellp";
452 const wchar_t*
const c_string3 = L"hellod";
453 EXPECT_TRUE(wide_string
!= c_string1);
454 EXPECT_TRUE(wide_string
!= c_string2);
455 EXPECT_TRUE(wide_string
!= c_string3);
456 EXPECT_TRUE(c_string1
!= wide_string);
457 EXPECT_TRUE(c_string2
!= wide_string);
458 EXPECT_TRUE(c_string3
!= wide_string);
463 EXPECT_EQ(L"Dogs like me",
WideString(L"Dogs"
) + L" like me");
464 EXPECT_EQ(L"Oh no, error number 42",
472 const wchar_t* buffer = str.c_str();
473 for (size_t i = 0; i < 10000; ++i) {
475 const wchar_t* new_buffer = str.c_str();
476 if (new_buffer != buffer) {
481 EXPECT_LT(allocations, 25);
482 EXPECT_GT(allocations, 10);
488 fred.Concat(L"FRED", 4);
489 EXPECT_EQ(L"FRED", fred);
491 fred.Concat(L"DY", 2);
492 EXPECT_EQ(L"FREDDY", fred);
495 EXPECT_EQ(L"FRE", fred);
497 fred.Concat(L"D", 1);
498 EXPECT_EQ(L"FRED", fred);
501 fred.Concat(L"DY", 2);
502 EXPECT_EQ(L"FREDDY", fred);
503 EXPECT_EQ(L"FRED", copy);
509 EXPECT_EQ(L"FRD", freed);
511 EXPECT_EQ(L"RD", freed);
513 EXPECT_EQ(L"R", freed);
515 EXPECT_EQ(L"R", freed);
517 EXPECT_EQ(L"", freed);
521 EXPECT_EQ(L"", empty);
526 const wchar_t* old_buffer = freed.c_str();
530 EXPECT_EQ(L"FREED", freed);
531 EXPECT_EQ(old_buffer, freed.c_str());
535 EXPECT_EQ(L"FRD", freed);
536 EXPECT_EQ(old_buffer, freed.c_str());
541 EXPECT_EQ(L"FRD", freed);
542 EXPECT_EQ(old_buffer, freed.c_str());
543 EXPECT_EQ(old_buffer, shared.c_str());
547 EXPECT_EQ(L"FR", freed);
548 EXPECT_NE(old_buffer, freed.c_str());
549 EXPECT_EQ(L"FRD", shared);
550 EXPECT_EQ(old_buffer, shared.c_str());
555 empty.Replace(L"", L"CLAMS");
556 empty.Replace(L"xx", L"CLAMS");
557 EXPECT_EQ(L"", empty);
560 fred.Replace(L"", L"");
561 EXPECT_EQ(L"FRED", fred);
562 fred.Replace(L"", L"CLAMS");
563 EXPECT_EQ(L"FRED", fred);
564 fred.Replace(L"FR", L"BL");
565 EXPECT_EQ(L"BLED", fred);
566 fred.Replace(L"D", L"DDY");
567 EXPECT_EQ(L"BLEDDY", fred);
568 fred.Replace(L"LEDD", L"");
569 EXPECT_EQ(L"BY", fred);
570 fred.Replace(L"X", L"CLAMS");
571 EXPECT_EQ(L"BY", fred);
572 fred.Replace(L"BY", L"HI");
573 EXPECT_EQ(L"HI", fred);
574 fred.Replace(L"I", L"IHIHI");
575 EXPECT_EQ(L"HIHIHI", fred);
576 fred.Replace(L"HI", L"HO");
577 EXPECT_EQ(L"HOHOHO", fred);
578 fred.Replace(L"HO", L"");
579 EXPECT_EQ(L"", fred);
582 five_xs.Replace(L"xx", L"xxx");
583 EXPECT_EQ(L"xxxxxxx", five_xs);
586 five_ys.Replace(L"yy", L"y");
587 EXPECT_EQ(L"yyy", five_ys);
592 EXPECT_EQ(5u, fred.Insert(0,
'S'));
593 EXPECT_EQ(L"SFRED", fred);
594 EXPECT_EQ(6u, fred.Insert(1,
'T'));
595 EXPECT_EQ(L"STFRED", fred);
596 EXPECT_EQ(7u, fred.Insert(4,
'U'));
597 EXPECT_EQ(L"STFRUED", fred);
598 EXPECT_EQ(8u, fred.Insert(7,
'V'));
599 EXPECT_EQ(L"STFRUEDV", fred);
600 EXPECT_EQ(8u, fred.Insert(12,
'P'));
601 EXPECT_EQ(L"STFRUEDV", fred);
604 EXPECT_EQ(1u, empty.Insert(0,
'X'));
605 EXPECT_EQ(L"X", empty);
609 EXPECT_EQ(0u, empty.Insert(5,
'X'));
610 EXPECT_NE(L"X", empty);
617 EXPECT_EQ(1u, empty.InsertAtFront(
'D'));
618 EXPECT_EQ(L"D", empty);
619 EXPECT_EQ(2u, empty.InsertAtFront(
'E'));
620 EXPECT_EQ(L"ED", empty);
621 EXPECT_EQ(3u, empty.InsertAtFront(
'R'));
622 EXPECT_EQ(L"RED", empty);
623 EXPECT_EQ(4u, empty.InsertAtFront(
'F'));
624 EXPECT_EQ(L"FRED", empty);
628 EXPECT_EQ(1u, empty.InsertAtBack(
'F'));
629 EXPECT_EQ(L"F", empty);
630 EXPECT_EQ(2u, empty.InsertAtBack(
'R'));
631 EXPECT_EQ(L"FR", empty);
632 EXPECT_EQ(3u, empty.InsertAtBack(
'E'));
633 EXPECT_EQ(L"FRE", empty);
634 EXPECT_EQ(4u, empty.InsertAtBack(
'D'));
635 EXPECT_EQ(L"FRED", empty);
639 EXPECT_EQ(1u, empty.InsertAtBack(
'E'));
640 EXPECT_EQ(L"E", empty);
641 EXPECT_EQ(2u, empty.InsertAtFront(
'R'));
642 EXPECT_EQ(L"RE", empty);
643 EXPECT_EQ(3u, empty.InsertAtBack(
'D'));
644 EXPECT_EQ(L"RED", empty);
645 EXPECT_EQ(4u, empty.InsertAtFront(
'F'));
646 EXPECT_EQ(L"FRED", empty);
652 EXPECT_EQ(4u, fred.Delete(0, 0));
653 EXPECT_EQ(L"FRED", fred);
654 EXPECT_EQ(2u, fred.Delete(0, 2));
655 EXPECT_EQ(L"ED", fred);
656 EXPECT_EQ(1u, fred.Delete(1));
657 EXPECT_EQ(L"E", fred);
658 EXPECT_EQ(0u, fred.Delete(0));
659 EXPECT_EQ(L"", fred);
660 EXPECT_EQ(0u, fred.Delete(0));
661 EXPECT_EQ(L"", fred);
664 EXPECT_EQ(0u, empty.Delete(0));
665 EXPECT_EQ(L"", empty);
666 EXPECT_EQ(0u, empty.Delete(1));
667 EXPECT_EQ(L"", empty);
672 EXPECT_EQ(L"FRED", fred.Substr(0));
673 EXPECT_EQ(L"RED", fred.Substr(1));
674 EXPECT_EQ(L"ED", fred.Substr(2));
675 EXPECT_EQ(L"D", fred.Substr(3));
676 EXPECT_EQ(L"", fred.Substr(4));
679 EXPECT_EQ(L"", empty.Substr(0));
680 EXPECT_EQ(L"", empty.Substr(1));
685 EXPECT_EQ(L"", fred.Substr(0, 0));
686 EXPECT_EQ(L"", fred.Substr(3, 0));
687 EXPECT_EQ(L"FRED", fred.Substr(0, 4));
688 EXPECT_EQ(L"RED", fred.Substr(1, 3));
689 EXPECT_EQ(L"ED", fred.Substr(2, 2));
690 EXPECT_EQ(L"D", fred.Substr(3, 1));
691 EXPECT_EQ(L"F", fred.Substr(0, 1));
692 EXPECT_EQ(L"R", fred.Substr(1, 1));
693 EXPECT_EQ(L"E", fred.Substr(2, 1));
694 EXPECT_EQ(L"D", fred.Substr(3, 1));
695 EXPECT_EQ(L"FR", fred.Substr(0, 2));
696 EXPECT_EQ(L"FRED", fred.Substr(0, 4));
697 EXPECT_EQ(L"", fred.Substr(0, 10));
699 EXPECT_EQ(L"", fred.Substr(1, 4));
700 EXPECT_EQ(L"", fred.Substr(4, 1));
703 EXPECT_EQ(L"", empty.Substr(0, 0));
708 EXPECT_EQ(L"", fred.First(0));
709 EXPECT_EQ(L"F", fred.First(1));
710 EXPECT_EQ(L"FR", fred.First(2));
711 EXPECT_EQ(L"FRE", fred.First(3));
712 EXPECT_EQ(L"FRED", fred.First(4));
714 EXPECT_EQ(L"", fred.First(5));
717 EXPECT_EQ(L"", empty.First(0));
718 EXPECT_EQ(L"", empty.First(1));
723 EXPECT_EQ(L"", fred.Last(0));
724 EXPECT_EQ(L"D", fred.Last(1));
725 EXPECT_EQ(L"ED", fred.Last(2));
726 EXPECT_EQ(L"RED", fred.Last(3));
727 EXPECT_EQ(L"FRED", fred.Last(4));
729 EXPECT_EQ(L"", fred.Last(5));
732 EXPECT_EQ(L"", empty.Last(0));
733 EXPECT_EQ(L"", empty.Last(1));
738 EXPECT_FALSE(null_string.Find(L'a').has_value());
739 EXPECT_FALSE(null_string.Find(L'\0').has_value());
742 EXPECT_FALSE(empty_string.Find(L'a').has_value());
743 EXPECT_FALSE(empty_string.Find(L'\0').has_value());
746 std::optional<size_t> result = single_string.Find(L'a');
747 ASSERT_TRUE(result.has_value());
748 EXPECT_EQ(0u, result.value());
749 EXPECT_FALSE(single_string.Find(L'b').has_value());
750 EXPECT_FALSE(single_string.Find(L'\0').has_value());
753 result = longer_string.Find(L'a');
754 ASSERT_TRUE(result.has_value());
755 EXPECT_EQ(0u, result.value());
756 result = longer_string.Find(L'c');
757 ASSERT_TRUE(result.has_value());
758 EXPECT_EQ(2u, result.value());
759 result = longer_string.Find(L'c', 3);
760 ASSERT_TRUE(result.has_value());
761 EXPECT_EQ(3u, result.value());
762 EXPECT_FALSE(longer_string.Find(L'\0').has_value());
764 result = longer_string.Find(L"ab");
765 ASSERT_TRUE(result.has_value());
766 EXPECT_EQ(0u, result.value());
767 result = longer_string.Find(L"ccc");
768 ASSERT_TRUE(result.has_value());
769 EXPECT_EQ(2u, result.value());
770 result = longer_string.Find(L"cc", 3);
771 ASSERT_TRUE(result.has_value());
772 EXPECT_EQ(3u, result.value());
773 EXPECT_FALSE(longer_string.Find(L"d").has_value());
778 result = hibyte_string.Find(L'\xff8c');
779 ASSERT_TRUE(result.has_value());
780 EXPECT_EQ(2u, result.value());
785 EXPECT_FALSE(null_string.ReverseFind(L'a').has_value());
786 EXPECT_FALSE(null_string.ReverseFind(L'\0').has_value());
789 EXPECT_FALSE(empty_string.ReverseFind(L'a').has_value());
790 EXPECT_FALSE(empty_string.ReverseFind(L'\0').has_value());
793 std::optional<size_t> result = single_string.ReverseFind(L'a');
794 ASSERT_TRUE(result.has_value());
795 EXPECT_EQ(0u, result.value());
796 EXPECT_FALSE(single_string.ReverseFind(L'b').has_value());
797 EXPECT_FALSE(single_string.ReverseFind(L'\0').has_value());
800 result = longer_string.ReverseFind(L'a');
801 ASSERT_TRUE(result.has_value());
802 EXPECT_EQ(0u, result.value());
803 result = longer_string.ReverseFind(L'c');
804 ASSERT_TRUE(result.has_value());
805 EXPECT_EQ(4u, result.value());
806 EXPECT_FALSE(longer_string.ReverseFind(L'\0').has_value());
811 result = hibyte_string.ReverseFind(L'\xff8c');
812 ASSERT_TRUE(result.has_value());
813 EXPECT_EQ(2u, result.value());
819 EXPECT_EQ(L"f-re.42d", fred);
821 EXPECT_EQ(L"F-RE.42D", fred);
825 EXPECT_EQ(L"", empty);
827 EXPECT_EQ(L"", empty);
830 empty_with_buffer.Delete(0);
832 WideString additional_empty_with_buffer_ref = empty_with_buffer;
834 EXPECT_EQ(L"", additional_empty_with_buffer_ref);
836 additional_empty_with_buffer_ref
= empty_with_buffer;
838 EXPECT_EQ(L"", additional_empty_with_buffer_ref);
844 EXPECT_EQ(L"FRED", fred);
846 EXPECT_EQ(L"FRED", fred);
848 EXPECT_EQ(L"RED", fred);
850 EXPECT_EQ(L"D", fred);
854 EXPECT_EQ(L" ", blank);
856 EXPECT_EQ(L" ", blank);
858 EXPECT_EQ(L"", blank);
862 EXPECT_EQ(L"", empty);
864 EXPECT_EQ(L"", empty);
866 EXPECT_EQ(L"", empty);
870 EXPECT_EQ(L" ABCCBA ", abc);
872 EXPECT_EQ(L"BCCB", abc);
878 EXPECT_EQ(L"FRED ", fred);
879 fred.TrimFront(L'E');
880 EXPECT_EQ(L"FRED ", fred);
881 fred.TrimFront(L'F');
882 EXPECT_EQ(L"RED ", fred);
883 fred.TrimFront(L"ERP");
884 EXPECT_EQ(L"D ", fred);
887 blank.TrimFront(L"ERP");
888 EXPECT_EQ(L" ", blank);
889 blank.TrimFront(L'E');
890 EXPECT_EQ(L" ", blank);
892 EXPECT_EQ(L"", blank);
895 empty.TrimFront(L"ERP");
896 EXPECT_EQ(L"", empty);
897 empty.TrimFront(L'E');
898 EXPECT_EQ(L"", empty);
900 EXPECT_EQ(L"", empty);
907 const wchar_t* old_buffer = fred.c_str();
909 EXPECT_EQ(L"FRED ", fred);
910 EXPECT_EQ(old_buffer, fred.c_str());
916 const wchar_t* old_buffer = fred.c_str();
918 EXPECT_EQ(L"FRED ", fred);
919 EXPECT_EQ(L" FRED ", other_fred);
920 EXPECT_NE(old_buffer, fred.c_str());
926 const wchar_t* old_buffer = fred.c_str();
928 EXPECT_EQ(L"FRED", fred);
929 EXPECT_EQ(L"FRED", other_fred);
930 EXPECT_EQ(old_buffer, fred.c_str());
937 EXPECT_EQ(L" FRED", fred);
939 EXPECT_EQ(L" FRED", fred);
941 EXPECT_EQ(L" FRE", fred);
942 fred.TrimBack(L"ERP");
943 EXPECT_EQ(L" F", fred);
946 blank.TrimBack(L"ERP");
947 EXPECT_EQ(L" ", blank);
948 blank.TrimBack(L'E');
949 EXPECT_EQ(L" ", blank);
951 EXPECT_EQ(L"", blank);
954 empty.TrimBack(L"ERP");
955 EXPECT_EQ(L"", empty);
956 empty.TrimBack(L'E');
957 EXPECT_EQ(L"", empty);
959 EXPECT_EQ(L"", empty);
966 const wchar_t* old_buffer = fred.c_str();
968 EXPECT_EQ(L" FRED", fred);
969 EXPECT_EQ(old_buffer, fred.c_str());
975 const wchar_t* old_buffer = fred.c_str();
977 EXPECT_EQ(L" FRED", fred);
978 EXPECT_EQ(L" FRED ", other_fred);
979 EXPECT_NE(old_buffer, fred.c_str());
985 const wchar_t* old_buffer = fred.c_str();
987 EXPECT_EQ(L"FRED", fred);
988 EXPECT_EQ(L"FRED", other_fred);
989 EXPECT_EQ(old_buffer, fred.c_str());
997 const wchar_t* old_buffer = str.c_str();
999 EXPECT_EQ(old_buffer, str.c_str());
1000 str
+= L"Blah Blah Blah Blah Blah Blah";
1001 EXPECT_NE(old_buffer, str.c_str());
1006 const wchar_t* old_buffer = str.c_str();
1008 EXPECT_EQ(old_buffer, str.c_str());
1009 str
+= L"Blah Blah Blah Blah Blah Blah";
1010 EXPECT_NE(old_buffer, str.c_str());
1017 pdfium::span<
wchar_t> buffer = str1.GetBuffer(12);
1018 wcscpy(buffer.data(), L"clams");
1020 str1.ReleaseBuffer(str1.GetStringLength());
1021 EXPECT_EQ(L"clams", str1);
1025 pdfium::span<
wchar_t> buffer = str2.GetBuffer(12);
1028 str2.ReleaseBuffer(str2.GetStringLength());
1029 EXPECT_EQ(L"clams", str2);
1037 const wchar_t* old_buffer = str.c_str();
1038 str.ReleaseBuffer(4);
1039 EXPECT_EQ(old_buffer, str.c_str());
1040 EXPECT_EQ(L"clam", str);
1046 const wchar_t* old_buffer = str.c_str();
1047 str.ReleaseBuffer(4);
1048 EXPECT_EQ(old_buffer, str.c_str());
1049 EXPECT_EQ(L"clam", str);
1055 const wchar_t* old_buffer = str.c_str();
1056 str.ReleaseBuffer(4);
1057 EXPECT_NE(old_buffer, str.c_str());
1058 EXPECT_EQ(L"clam", str);
1064 const wchar_t* old_buffer = str.c_str();
1065 str.ReleaseBuffer(4);
1066 EXPECT_NE(old_buffer, str.c_str());
1067 EXPECT_EQ(L"clam", str);
1073 auto iter = empty.rbegin();
1074 EXPECT_TRUE(iter == empty.rend());
1075 EXPECT_FALSE(iter != empty.rend());
1076 EXPECT_FALSE(iter < empty.rend());
1081 auto iter = one_str.rbegin();
1082 EXPECT_FALSE(iter == one_str.rend());
1083 EXPECT_TRUE(iter != one_str.rend());
1084 EXPECT_TRUE(iter < one_str.rend());
1088 EXPECT_TRUE(iter == one_str.rend());
1089 EXPECT_FALSE(iter != one_str.rend());
1090 EXPECT_FALSE(iter < one_str.rend());
1095 auto iter = multi_str.rbegin();
1096 EXPECT_NE(iter, multi_str.rend());
1097 EXPECT_EQ(4, multi_str.rend() - iter);
1098 EXPECT_EQ(0, iter - multi_str.rbegin());
1102 EXPECT_EQ(
'c', *iter);
1103 EXPECT_NE(iter, multi_str.rend());
1104 EXPECT_EQ(3, multi_str.rend() - iter);
1105 EXPECT_EQ(1, iter - multi_str.rbegin());
1109 EXPECT_EQ(
'b', *iter);
1110 EXPECT_NE(iter, multi_str.rend());
1111 EXPECT_EQ(2, multi_str.rend() - iter);
1112 EXPECT_EQ(2, iter - multi_str.rbegin());
1116 EXPECT_EQ(
'a', *iter);
1117 EXPECT_NE(iter, multi_str.rend());
1118 EXPECT_EQ(1, multi_str.rend() - iter);
1119 EXPECT_EQ(3, iter - multi_str.rbegin());
1123 EXPECT_EQ(iter, multi_str.rend());
1124 EXPECT_EQ(0, multi_str.rend() - iter);
1125 EXPECT_EQ(4, iter - multi_str.rbegin());
1129 EXPECT_EQ(
'a', *iter);
1130 EXPECT_NE(iter, multi_str.rend());
1131 EXPECT_EQ(1, multi_str.rend() - iter);
1132 EXPECT_EQ(3, iter - multi_str.rbegin());
1136 EXPECT_EQ(
'b', *iter);
1137 EXPECT_NE(iter, multi_str.rend());
1138 EXPECT_EQ(2, multi_str.rend() - iter);
1139 EXPECT_EQ(2, iter - multi_str.rbegin());
1143 EXPECT_EQ(
'c', *iter);
1144 EXPECT_NE(iter, multi_str.rend());
1145 EXPECT_EQ(3, multi_str.rend() - iter);
1146 EXPECT_EQ(1, iter - multi_str.rbegin());
1150 EXPECT_EQ(
'd', *iter);
1151 EXPECT_EQ(iter, multi_str.rbegin());
1152 EXPECT_EQ(4, multi_str.rend() - iter);
1153 EXPECT_EQ(0, iter - multi_str.rbegin());
1189 <<
"Invalid continuation";
1191 <<
"Invalid continuation";
1193 <<
"Invalid continuation";
1197 <<
"Invalid leading";
1199 <<
"Invalid leading";
1201 <<
"Code point greater than U+10FFFF";
1206 wstr.Reserve(0x10000);
1212 wstr
+= static_cast<
wchar_t>(w);
1214 ASSERT_EQ(0xf800u, wstr.GetLength());
1216 ByteString bstr = FX_UTF8Encode(wstr.AsStringView());
1218 EXPECT_EQ(wstr, wstr2);
1223 wstr.Reserve(0x400);
1228 ASSERT_EQ(0x400u, wstr.GetLength());
1230 ByteString bstr = FX_UTF8Encode(wstr.AsStringView());
1232 EXPECT_EQ(wstr, wstr2);
1237 wstr.Reserve(0x400);
1242 ASSERT_EQ(0x400u, wstr.GetLength());
1244 ByteString bstr = FX_UTF8Encode(wstr.AsStringView());
1246 EXPECT_EQ(wstr, wstr2);
1250 struct UTF16BEDecodeCase {
1253 }
const utf16be_decode_cases[] = {
1262 for (size_t i = 0; i <
std::size(utf16be_decode_cases); ++i) {
1264 WideString::FromUTF16BE(utf16be_decode_cases[i].in.unsigned_span()),
1265 utf16be_decode_cases[i].out)
1266 <<
" for case number " << i;
1272 struct UTF16LEDecodeCase {
1275 }
const utf16le_decode_cases[] = {
1285 for (size_t i = 0; i <
std::size(utf16le_decode_cases); ++i) {
1287 WideString::FromUTF16LE(utf16le_decode_cases[i].in.unsigned_span()),
1288 utf16le_decode_cases[i].out)
1289 <<
" for case number " << i;
1295 struct UTF16LEEncodeCase {
1298 }
const utf16le_encode_cases[] = {
1300 {L"abc",
UNSAFE_TODO(ByteString(
"a\0b\0c\0\0\0", 8))},
1301 {L"abcdef",
UNSAFE_TODO(ByteString(
"a\0b\0c\0d\0e\0f\0\0\0", 14))},
1302 {L"abc\0def",
UNSAFE_TODO(ByteString(
"a\0b\0c\0\0\0", 8))},
1303 {L"\xaabb\xccdd",
UNSAFE_TODO(ByteString(
"\xbb\xaa\xdd\xcc\0\0", 6))},
1304 {L"\x3132\x6162",
UNSAFE_TODO(ByteString(
"\x32\x31\x62\x61\0\0", 6))},
1305 {L"🎨",
UNSAFE_TODO(ByteString(
"\x3C\xD8\xA8\xDF\0\0", 6))},
1308 for (size_t i = 0; i <
std::size(utf16le_encode_cases); ++i) {
1309 EXPECT_EQ(utf16le_encode_cases[i].bs,
1310 utf16le_encode_cases[i].ws.ToUTF16LE())
1311 <<
" for case number " << i;
1317 struct UCS2LEEncodeCase {
1320 }
const ucs2le_encode_cases[] = {
1322 {L"abc",
UNSAFE_TODO(ByteString(
"a\0b\0c\0\0\0", 8))},
1323 {L"abcdef",
UNSAFE_TODO(ByteString(
"a\0b\0c\0d\0e\0f\0\0\0", 14))},
1324 {L"abc\0def",
UNSAFE_TODO(ByteString(
"a\0b\0c\0\0\0", 8))},
1325 {L"\xaabb\xccdd",
UNSAFE_TODO(ByteString(
"\xbb\xaa\xdd\xcc\0\0", 6))},
1326 {L"\x3132\x6162",
UNSAFE_TODO(ByteString(
"\x32\x31\x62\x61\0\0", 6))},
1327#if defined(WCHAR_T_IS_32_BIT)
1328 {L"🎨", UNSAFE_TODO(ByteString(
"\0\0", 2))},
1332 for (size_t i = 0; i <
std::size(ucs2le_encode_cases); ++i) {
1333 EXPECT_EQ(ucs2le_encode_cases[i].bs, ucs2le_encode_cases[i].ws.ToUCS2LE())
1334 <<
" for case number " << i;
1341 L"Symbols &<>'".");
1371 const char* kResult =
1388 const char* kResult =
1406#if BUILDFLAG(IS_WIN)
1407 const char* kResult =
1415 const char* kResult =
1432 const wchar_t* kResult =
1445 const wchar_t* kResult =
1458#if BUILDFLAG(IS_WIN)
1459 const wchar_t* kResult =
1465 const wchar_t* kResult =
1478 std::vector<WideStringView::UnsignedType> null_vec;
1480 EXPECT_EQ(0u, null_string.GetLength());
1482 std::vector<WideStringView::UnsignedType> lower_a_vec(
1483 10,
static_cast<WideStringView::UnsignedType>(L'a'));
1485 EXPECT_EQ(10u, lower_a_string.GetLength());
1486 EXPECT_EQ(L"aaaaaaaaaa", lower_a_string);
1488 std::vector<WideStringView::UnsignedType> cleared_vec;
1489 cleared_vec.push_back(42);
1490 cleared_vec.pop_back();
1492 EXPECT_EQ(0u, cleared_string.GetLength());
1493 EXPECT_FALSE(cleared_string.unterminated_unsigned_str());
1498 EXPECT_EQ(L'a',
static_cast<
wchar_t>(abc[0]));
1499 EXPECT_EQ(L'b',
static_cast<
wchar_t>(abc[1]));
1500 EXPECT_EQ(L'c',
static_cast<
wchar_t>(abc[2]));
1502 EXPECT_DEATH({ abc[4]; },
"");
1511 const wchar_t*
const c_null =
nullptr;
1512 const wchar_t*
const c_empty = L"";
1513 const wchar_t*
const c_a = L"a";
1514 const wchar_t*
const c_abc = L"\x0110qq";
1515 const wchar_t*
const c_def = L"\x1001qq";
1517 EXPECT_FALSE(empty < empty);
1518 EXPECT_FALSE(a < a);
1519 EXPECT_FALSE(abc < abc);
1520 EXPECT_FALSE(def < def);
1521 EXPECT_FALSE(c_null < empty);
1522 EXPECT_FALSE(c_empty < empty);
1523 EXPECT_FALSE(c_a < a);
1524 EXPECT_FALSE(c_abc < abc);
1525 EXPECT_FALSE(c_def < def);
1526 EXPECT_FALSE(empty < c_null);
1527 EXPECT_FALSE(empty < c_empty);
1528 EXPECT_FALSE(a < c_a);
1529 EXPECT_FALSE(abc < c_abc);
1530 EXPECT_FALSE(def < c_def);
1532 EXPECT_TRUE(empty < a);
1533 EXPECT_FALSE(a < empty);
1534 EXPECT_TRUE(empty < c_a);
1535 EXPECT_FALSE(a < c_null);
1536 EXPECT_FALSE(a < c_empty);
1538 EXPECT_TRUE(empty < abc);
1539 EXPECT_FALSE(abc < empty);
1540 EXPECT_TRUE(empty < c_abc);
1541 EXPECT_FALSE(abc < c_null);
1542 EXPECT_FALSE(abc < c_empty);
1544 EXPECT_TRUE(empty < def);
1545 EXPECT_FALSE(def < empty);
1546 EXPECT_TRUE(empty < c_def);
1547 EXPECT_FALSE(def < c_null);
1548 EXPECT_FALSE(def < c_empty);
1550 EXPECT_TRUE(a < abc);
1551 EXPECT_FALSE(abc < a);
1552 EXPECT_TRUE(a < c_abc);
1553 EXPECT_FALSE(abc < c_a);
1555 EXPECT_TRUE(a < def);
1556 EXPECT_FALSE(def < a);
1557 EXPECT_TRUE(a < c_def);
1558 EXPECT_FALSE(def < c_a);
1560 EXPECT_TRUE(abc < def);
1561 EXPECT_FALSE(def < abc);
1562 EXPECT_TRUE(abc < c_def);
1563 EXPECT_FALSE(def < c_abc);
1568 EXPECT_TRUE(wide_string_c == wide_string_c);
1571 EXPECT_TRUE(wide_string_c == wide_string_c_same1);
1572 EXPECT_TRUE(wide_string_c_same1 == wide_string_c);
1575 EXPECT_TRUE(wide_string_c == wide_string_c_same2);
1576 EXPECT_TRUE(wide_string_c_same2 == wide_string_c);
1581 EXPECT_FALSE(wide_string_c == wide_string_c1);
1582 EXPECT_FALSE(wide_string_c == wide_string_c2);
1583 EXPECT_FALSE(wide_string_c == wide_string_c3);
1584 EXPECT_FALSE(wide_string_c1 == wide_string_c);
1585 EXPECT_FALSE(wide_string_c2 == wide_string_c);
1586 EXPECT_FALSE(wide_string_c3 == wide_string_c);
1589 EXPECT_TRUE(wide_string_c == wide_string_same1);
1590 EXPECT_TRUE(wide_string_same1 == wide_string_c);
1595 EXPECT_FALSE(wide_string_c == wide_string1);
1596 EXPECT_FALSE(wide_string_c == wide_string2);
1597 EXPECT_FALSE(wide_string_c == wide_string3);
1598 EXPECT_FALSE(wide_string1 == wide_string_c);
1599 EXPECT_FALSE(wide_string2 == wide_string_c);
1600 EXPECT_FALSE(wide_string3 == wide_string_c);
1602 const wchar_t*
const c_string_same1 = L"hello";
1603 EXPECT_TRUE(wide_string_c == c_string_same1);
1604 EXPECT_TRUE(c_string_same1 == wide_string_c);
1606 const wchar_t*
const c_string1 = L"he";
1607 const wchar_t*
const c_string2 = L"hellp";
1608 const wchar_t*
const c_string3 = L"hellod";
1609 EXPECT_FALSE(wide_string_c == c_string1);
1610 EXPECT_FALSE(wide_string_c == c_string2);
1611 EXPECT_FALSE(wide_string_c == c_string3);
1613 EXPECT_FALSE(c_string1 == wide_string_c);
1614 EXPECT_FALSE(c_string2 == wide_string_c);
1615 EXPECT_FALSE(c_string3 == wide_string_c);
1620 EXPECT_FALSE(wide_string_c != wide_string_c);
1623 EXPECT_FALSE(wide_string_c != wide_string_c_same1);
1624 EXPECT_FALSE(wide_string_c_same1 != wide_string_c);
1627 EXPECT_FALSE(wide_string_c != wide_string_c_same2);
1628 EXPECT_FALSE(wide_string_c_same2 != wide_string_c);
1633 EXPECT_TRUE(wide_string_c != wide_string_c1);
1634 EXPECT_TRUE(wide_string_c != wide_string_c2);
1635 EXPECT_TRUE(wide_string_c != wide_string_c3);
1636 EXPECT_TRUE(wide_string_c1 != wide_string_c);
1637 EXPECT_TRUE(wide_string_c2 != wide_string_c);
1638 EXPECT_TRUE(wide_string_c3 != wide_string_c);
1641 EXPECT_FALSE(wide_string_c != wide_string_same1);
1642 EXPECT_FALSE(wide_string_same1 != wide_string_c);
1647 EXPECT_TRUE(wide_string_c != wide_string1);
1648 EXPECT_TRUE(wide_string_c != wide_string2);
1649 EXPECT_TRUE(wide_string_c != wide_string3);
1650 EXPECT_TRUE(wide_string1 != wide_string_c);
1651 EXPECT_TRUE(wide_string2 != wide_string_c);
1652 EXPECT_TRUE(wide_string3 != wide_string_c);
1654 const wchar_t*
const c_string_same1 = L"hello";
1655 EXPECT_FALSE(wide_string_c != c_string_same1);
1656 EXPECT_FALSE(c_string_same1 != wide_string_c);
1658 const wchar_t*
const c_string1 = L"he";
1659 const wchar_t*
const c_string2 = L"hellp";
1660 const wchar_t*
const c_string3 = L"hellod";
1661 EXPECT_TRUE(wide_string_c != c_string1);
1662 EXPECT_TRUE(wide_string_c != c_string2);
1663 EXPECT_TRUE(wide_string_c != c_string3);
1665 EXPECT_TRUE(c_string1 != wide_string_c);
1666 EXPECT_TRUE(c_string2 != wide_string_c);
1667 EXPECT_TRUE(c_string3 != wide_string_c);
1672 EXPECT_FALSE(null_string.Find(L'a').has_value());
1673 EXPECT_FALSE(null_string.Find(L'\0').has_value());
1676 EXPECT_FALSE(empty_string.Find(L'a').has_value());
1677 EXPECT_FALSE(empty_string.Find(L'\0').has_value());
1680 std::optional<size_t> result = single_string.Find(L'a');
1681 ASSERT_TRUE(result.has_value());
1682 EXPECT_EQ(0u, result.value());
1683 EXPECT_FALSE(single_string.Find(L'b').has_value());
1684 EXPECT_FALSE(single_string.Find(L'\0').has_value());
1687 result = longer_string.Find(L'a');
1688 ASSERT_TRUE(result.has_value());
1689 EXPECT_EQ(0u, result.value());
1690 result = longer_string.Find(L'c');
1691 ASSERT_TRUE(result.has_value());
1692 EXPECT_EQ(2u, result.value());
1693 EXPECT_FALSE(longer_string.Find(L'd').has_value());
1694 EXPECT_FALSE(longer_string.Find(L'\0').has_value());
1699 result = hibyte_string.Find(L'\xFF8c');
1700 ASSERT_TRUE(result.has_value());
1701 EXPECT_EQ(2u, result.value());
1707 bool any_present =
false;
1708 for (
const auto& c : null_str) {
1712 EXPECT_FALSE(any_present);
1719 bool any_present =
false;
1720 for (
const auto& c : empty_str) {
1724 EXPECT_FALSE(any_present);
1731 bool any_present =
false;
1732 for (
const auto& c : one_str) {
1736 EXPECT_TRUE(any_present);
1737 EXPECT_EQ(
static_cast<int32_t>(L'a'), sum);
1743 bool any_present =
false;
1744 for (
const auto& c : one_str) {
1748 EXPECT_TRUE(any_present);
1749 EXPECT_EQ(
static_cast<int32_t>(L'a' + L'b' + L'c'), sum);
1754 auto iter = empty.rbegin();
1755 EXPECT_TRUE(iter == empty.rend());
1756 EXPECT_FALSE(iter != empty.rend());
1757 EXPECT_FALSE(iter < empty.rend());
1762 auto iter = one_str.rbegin();
1763 EXPECT_FALSE(iter == one_str.rend());
1764 EXPECT_TRUE(iter != one_str.rend());
1765 EXPECT_TRUE(iter < one_str.rend());
1769 EXPECT_TRUE(iter == one_str.rend());
1770 EXPECT_FALSE(iter != one_str.rend());
1771 EXPECT_FALSE(iter < one_str.rend());
1776 auto iter = multi_str.rbegin();
1777 EXPECT_FALSE(iter == multi_str.rend());
1781 EXPECT_EQ(
'c', *iter);
1782 EXPECT_FALSE(iter == multi_str.rend());
1786 EXPECT_EQ(
'b', *iter);
1787 EXPECT_FALSE(iter == multi_str.rend());
1791 EXPECT_EQ(
'a', *iter);
1792 EXPECT_FALSE(iter == multi_str.rend());
1796 EXPECT_TRUE(iter == multi_str.rend());
1800 EXPECT_EQ(
'a', *iter);
1801 EXPECT_FALSE(iter == multi_str.rend());
1805 EXPECT_EQ(
'b', *iter);
1806 EXPECT_FALSE(iter == multi_str.rend());
1810 EXPECT_EQ(
'c', *iter);
1811 EXPECT_FALSE(iter == multi_str.rend());
1815 EXPECT_EQ(
'd', *iter);
1816 EXPECT_TRUE(iter == multi_str.rbegin());
1821 EXPECT_FALSE(
std::all_of(str.begin(), str.end(),
1822 [](
const wchar_t& c) {
return c == L'a'; }));
1824 EXPECT_FALSE(
std::none_of(str.begin(), str.end(),
1825 [](
const wchar_t& c) {
return c == L'a'; }));
1827 EXPECT_TRUE(
std::any_of(str.begin(), str.end(),
1828 [](
const wchar_t& c) {
return c == L'a'; }));
1830 EXPECT_TRUE(
pdfium::Contains(str, L'a'));
1831 EXPECT_TRUE(
pdfium::Contains(str, L'b'));
1832 EXPECT_FALSE(
pdfium::Contains(str, L'z'));
1837 EXPECT_EQ(L"FRED", fred.TrimmedRight(L'E'));
1838 EXPECT_EQ(L"FRE", fred.TrimmedRight(L'D'));
1840 EXPECT_EQ(L"FRE", fredd.TrimmedRight(L'D'));
1871 EXPECT_EQ(L"\u043e\u043f",
WideString(L"\u043e\u043f"
));
1873#if !BUILDFLAG(IS_APPLE)
1875 EXPECT_EQ(L"\u043e\u043f", WideString::Format(L"\u043e\u043f"));
1876 EXPECT_EQ(L"\u043e\u043f", WideString::Format(L"%ls", L"\u043e\u043f"));
1877 EXPECT_EQ(L"\u043e", WideString::Format(L"%.1ls", L"\u043e\u043f"));
1883 EXPECT_TRUE(empty_str.IsEmpty());
1884 EXPECT_EQ(0u, empty_str.GetLength());
1886 const wchar_t* cstr = empty_str.c_str();
1888 EXPECT_EQ(0u, wcslen(cstr));
1890 pdfium::span<
const wchar_t> cspan = empty_str.span();
1891 EXPECT_TRUE(cspan.empty());
1892 EXPECT_FALSE(cspan.data());
1896 WideString many_str({L"clams", L" and ", L"oysters"});
1897 EXPECT_EQ(L"clams and oysters", many_str);
1898 many_str = {L"fish", L" and ", L"chips", L" and ", L"soda"};
1899 EXPECT_EQ(L"fish and chips and soda", many_str);
1905 bool any_present =
false;
1906 for (
const auto& c : null_str) {
1910 EXPECT_FALSE(any_present);
1917 bool any_present =
false;
1918 for (
const auto& c : empty_str) {
1922 EXPECT_FALSE(any_present);
1929 bool any_present =
false;
1930 for (
const auto& c : one_str) {
1934 EXPECT_TRUE(any_present);
1935 EXPECT_EQ(
static_cast<int32_t>(L'a'), sum);
1941 bool any_present =
false;
1942 for (
const auto& c : one_str) {
1946 EXPECT_TRUE(any_present);
1947 EXPECT_EQ(
static_cast<int32_t>(L'a' + L'b' + L'c'), sum);
1952 std::vector<
wchar_t> vec(
std::begin(one_str),
std::end(one_str));
1953 ASSERT_EQ(3u, vec.size());
1954 EXPECT_EQ(L'a', vec[0]);
1955 EXPECT_EQ(L'b', vec[1]);
1956 EXPECT_EQ(L'c', vec[2]);
1961 EXPECT_FALSE(
std::all_of(str.begin(), str.end(),
1962 [](
const wchar_t& c) {
return c == L'a'; }));
1964 EXPECT_FALSE(
std::none_of(str.begin(), str.end(),
1965 [](
const wchar_t& c) {
return c == L'a'; }));
1967 EXPECT_TRUE(
std::any_of(str.begin(), str.end(),
1968 [](
const wchar_t& c) {
return c == L'a'; }));
1970 EXPECT_TRUE(
pdfium::Contains(str, L'a'));
1971 EXPECT_TRUE(
pdfium::Contains(str, L'b'));
1972 EXPECT_FALSE(
pdfium::Contains(str, L'z'));
1976 std::ostringstream stream;
1981 EXPECT_EQ(
"", stream.str());
1986 EXPECT_EQ(
"\u20AC", stream.str());
1991 stream <<
"abc" << str <<
"ghi";
1992 EXPECT_EQ(
"abcdefghi", stream.str());
1996 EXPECT_EQ(
"abcdefghi", stream.str());
2000 stream <<
"abc" << str <<
"ghi";
2001 EXPECT_EQ(
"abc123ghi", stream.str());
2003 wchar_t stringWithNulls[]{
'x',
'y',
'\0',
'z'};
2008 EXPECT_EQ(2u, str.GetLength());
2011 EXPECT_EQ(2u, stream.tellp());
2017 EXPECT_EQ(4u, str.GetLength());
2020 EXPECT_EQ(4u, stream.tellp());
2026 stream << str1 << str2;
2027 EXPECT_EQ(
"abcdef", stream.str());
2031 std::wostringstream stream;
2036 EXPECT_EQ(L"", stream.str());
2041 EXPECT_EQ(L"\u20AC", stream.str());
2046 stream << L"abc" << str << L"ghi";
2047 EXPECT_EQ(L"abcdefghi", stream.str());
2051 EXPECT_EQ(L"abcdefghi", stream.str());
2055 stream << L"abc" << str << L"ghi";
2056 EXPECT_EQ(L"abc123ghi", stream.str());
2058 wchar_t stringWithNulls[]{
'x',
'y',
'\0',
'z'};
2063 EXPECT_EQ(2u, str.GetLength());
2066 EXPECT_EQ(2u, stream.tellp());
2071 EXPECT_EQ(4u, str.GetLength());
2074 EXPECT_EQ(4u, stream.tellp());
2080 stream << str1 << str2;
2081 EXPECT_EQ(L"abcdef", stream.str());
2087 std::ostringstream stream;
2090 EXPECT_EQ(
"", stream.str());
2095 std::ostringstream stream;
2097 stream <<
"abc" << str <<
"ghi";
2098 EXPECT_EQ(
"abcdefghi", stream.str());
2103 std::ostringstream stream;
2106 EXPECT_EQ(
"\u20AC", stream.str());
2111 std::ostringstream stream;
2115 EXPECT_EQ(
"abc", stream.str());
2120 std::ostringstream stream;
2126 EXPECT_EQ(
"123", stream.str());
2132 wchar_t stringWithNulls[]{
'x',
'y',
'\0',
'z'};
2133 std::ostringstream stream;
2135 EXPECT_EQ(2u, str.GetLength());
2137 EXPECT_EQ(2u, stream.tellp());
2144 wchar_t stringWithNulls[]{
'x',
'y',
'\0',
'z'};
2147 std::ostringstream stream;
2148 EXPECT_EQ(4u, str.GetLength());
2150 EXPECT_EQ(4u, stream.tellp());
2156 std::ostringstream stream;
2159 stream << str1 << str2;
2160 EXPECT_EQ(
"abcdef", stream.str());
2167 std::wostringstream stream;
2170 EXPECT_EQ(L"", stream.str());
2175 std::wostringstream stream;
2177 stream <<
"abc" << str <<
"ghi";
2178 EXPECT_EQ(L"abcdefghi", stream.str());
2183 std::wostringstream stream;
2186 EXPECT_EQ(L"\u20AC", stream.str());
2191 std::wostringstream stream;
2195 EXPECT_EQ(L"abc", stream.str());
2200 std::wostringstream stream;
2206 EXPECT_EQ(L"123", stream.str());
2212 wchar_t stringWithNulls[]{
'x',
'y',
'\0',
'z'};
2213 std::wostringstream stream;
2215 EXPECT_EQ(2u, str.GetLength());
2217 EXPECT_EQ(2u, stream.tellp());
2223 wchar_t stringWithNulls[]{
'x',
'y',
'\0',
'z'};
2226 std::wostringstream stream;
2227 EXPECT_EQ(4u, str.GetLength());
2229 EXPECT_EQ(4u, stream.tellp());
2234 std::wostringstream stream;
2237 stream << str1 << str2;
2238 EXPECT_EQ(L"abcdef", stream.str());
2253 EXPECT_EQ(L"2147483647", WideString::FormatInteger(INT_MAX));
2254 EXPECT_EQ(L"-2147483648", WideString::FormatInteger(INT_MIN));
2258 EXPECT_EQ(0u, FX_HashCode_GetW(L""));
2259 EXPECT_EQ(65u, FX_HashCode_GetW(L"A"));
2260 EXPECT_EQ(97u, FX_HashCode_GetLoweredW(L"A"));
2261 EXPECT_EQ(1313 * 65u + 66u, FX_HashCode_GetW(L"AB"));
2262 EXPECT_EQ(FX_HashCode_GetAsIfW(
"AB\xff"), FX_HashCode_GetW(L"AB\xff"));
2263 EXPECT_EQ(FX_HashCode_GetLoweredAsIfW(
"AB\xff"),
2264 FX_HashCode_GetLoweredW(L"AB\xff"));
void TrimWhitespaceFront()
bool operator==(const WideString &other) const
static WideString Format(const wchar_t *pFormat,...)
WideString & operator=(WideString &&that) noexcept
static WideString FromUTF8(ByteStringView str)
WideString & operator+=(const wchar_t *str)
bool operator==(const wchar_t *ptr) const
WideString & operator+=(wchar_t ch)
bool EqualsASCIINoCase(ByteStringView that) const
WideString(const WideString &other)=default
static WideString FromDefANSI(ByteStringView str)
WideString(const wchar_t *ptr)
static WideString FromLatin1(ByteStringView str)
void TrimWhitespaceBack()
bool operator!=(const WideString &other) const
ByteString ToLatin1() const
intptr_t ReferenceCountForTesting() const
bool operator<(const WideString &other) const
WideString & operator=(const WideString &that)
WideString EncodeEntities() const
ByteString ToASCII() const
static WideString FromASCII(ByteStringView str)
WideString & operator=(const wchar_t *str)
bool operator!=(const wchar_t *ptr) const
static WideString FormatInteger(int i)
bool EqualsASCII(ByteStringView that) const
ByteString ToDefANSI() const
bool operator<(const wchar_t *ptr) const
#define UNSAFE_BUFFERS(...)
bool operator==(const wchar_t *lhs, const WideString &rhs)
StringViewTemplate< wchar_t > WideStringView
TEST(CFX_BytrString, EqualNoCase)
bool operator!=(const wchar_t *lhs, const WideString &rhs)
TEST(WideStringView, FromVector)
TEST(WideString, ElementAccess)
WideString operator+(const wchar_t *str1, const WideString &str2)
bool operator<(const wchar_t *lhs, const WideString &rhs)
WideString operator+(const WideString &str1, const wchar_t *str2)
constexpr char32_t kMinimumSupplementaryCodePoint
constexpr bool IsHighSurrogate(char32_t code_point)
constexpr char16_t kMaximumHighSurrogateCodeUnit
constexpr char16_t kMaximumLowSurrogateCodeUnit
constexpr char16_t kMinimumHighSurrogateCodeUnit
constexpr bool IsLowSurrogate(char32_t code_point)
constexpr char16_t kMinimumLowSurrogateCodeUnit