2 // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // Official repository: https://github.com/boostorg/json
10 // Test that header file is self-contained.
11 #include <boost/json/string.hpp>
13 #include <boost/json/monotonic_resource.hpp>
14 #include <boost/json/parse.hpp>
20 #include <unordered_set>
23 #include "test_suite.hpp"
27 BOOST_STATIC_ASSERT( std::is_nothrow_destructible
<string
>::value
);
28 BOOST_STATIC_ASSERT( std::is_nothrow_move_constructible
<string
>::value
);
34 #if BOOST_JSON_ARCH == 64
35 # define INIT1 { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n' }
36 # define INIT2 { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O' }
37 #elif BOOST_JSON_ARCH == 32
38 # define INIT1 { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }
39 # define INIT2 { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K' }
41 # error Unknown architecture
47 string_view v1
; // "abc...
50 string_view v2
; // "ABC...
59 s
.resize(string
{}.capacity());
60 std::iota(s
.begin(), s
.end(), 'a');
66 s
.resize(string
{}.capacity() + 1);
67 std::iota(s
.begin(), s
.end(), 'A');
74 BOOST_TEST(std::string(INIT1
) == s1
);
75 BOOST_TEST(std::string(INIT2
) == s2
);
85 return s
.substr(s
.size() - n
);
98 // string(storage_ptr)
101 make_shared_resource
<unique_resource
>();
103 BOOST_TEST(s
.empty());
104 BOOST_TEST(*s
.storage() == *sp
.get());
107 // string(size_type, char, storage_ptr)
109 fail_loop([&](storage_ptr
const& sp
)
111 string
s(t
.v1
.size(), '*', sp
);
112 BOOST_TEST(s
== std::string(t
.v1
.size(), '*'));
116 string
s(t
.v2
.size(), '*');
117 BOOST_TEST(s
== std::string(t
.v2
.size(), '*'));
121 // string(char const*, storage_ptr)
123 fail_loop([&](storage_ptr
const& sp
)
125 string
s(t
.s1
.c_str(), sp
);
126 BOOST_TEST(s
== t
.v1
);
129 fail_loop([&](storage_ptr
const& sp
)
131 string
s(t
.s2
.c_str(), sp
);
132 BOOST_TEST(s
== t
.v2
);
136 string
s(t
.s1
.c_str());
137 BOOST_TEST(s
== t
.v1
);
141 string
s(t
.s2
.c_str());
142 BOOST_TEST(s
== t
.v2
);
146 // string(char const*, size_type, storage_ptr)
148 fail_loop([&](storage_ptr
const& sp
)
150 string
s(t
.s1
.c_str(), 3, sp
);
151 BOOST_TEST(s
== "abc");
154 fail_loop([&](storage_ptr
const& sp
)
156 string
s(t
.s2
.c_str(), 3, sp
);
157 BOOST_TEST(s
== "ABC");
161 string
s(t
.s1
.c_str(), 3);
162 BOOST_TEST(s
== "abc");
166 string
s(t
.s2
.c_str(), 3);
167 BOOST_TEST(s
== "ABC");
171 // string(InputIt, InputIt, storage_ptr)
173 fail_loop([&](storage_ptr
const& sp
)
175 string
s(t
.v1
.begin(), t
.v1
.end(), sp
);
176 BOOST_TEST(s
== t
.v1
);
179 fail_loop([&](storage_ptr
const& sp
)
181 string
s(t
.v2
.begin(), t
.v2
.end(), sp
);
182 BOOST_TEST(s
== t
.v2
);
185 fail_loop([&](storage_ptr
const& sp
)
188 make_input_iterator(t
.v1
.begin()),
189 make_input_iterator(t
.v1
.end()), sp
);
190 BOOST_TEST(s
== t
.v1
);
193 fail_loop([&](storage_ptr
const& sp
)
196 make_input_iterator(t
.v2
.begin()),
197 make_input_iterator(t
.v2
.end()), sp
);
198 BOOST_TEST(s
== t
.v2
);
202 string
s(t
.v1
.begin(), t
.v1
.end());
203 BOOST_TEST(s
== t
.v1
);
207 string
s(t
.v2
.begin(), t
.v2
.end());
208 BOOST_TEST(s
== t
.v2
);
213 make_input_iterator(t
.v1
.begin()),
214 make_input_iterator(t
.v1
.end()));
215 BOOST_TEST(s
== t
.v1
);
220 make_input_iterator(t
.v2
.begin()),
221 make_input_iterator(t
.v2
.end()));
222 BOOST_TEST(s
== t
.v2
);
229 string
const s0(t
.v1
);
231 BOOST_TEST(s
== t
.v1
);
235 string
const s0(t
.v2
);
237 BOOST_TEST(s
== t
.v2
);
241 // string(string, storage_ptr)
243 fail_loop([&](storage_ptr
const& sp
)
245 string
const s0(t
.v1
);
247 BOOST_TEST(s
== t
.v1
);
250 fail_loop([&](storage_ptr
const& sp
)
252 string
const s0(t
.v2
);
254 BOOST_TEST(s
== t
.v2
);
258 // string(pilfered<string>)
262 string
s2(pilfer(s1
));
263 BOOST_TEST(s2
== t
.v1
);
264 BOOST_TEST(s1
.empty());
266 s1
.storage() == storage_ptr());
271 string
s2(pilfer(s1
));
272 BOOST_TEST(s2
== t
.v2
);
273 BOOST_TEST(s1
.empty());
275 s1
.storage() == storage_ptr());
278 // ensure pilfered-from objects
279 // are trivially destructible
281 string
s1(make_shared_resource
<
282 monotonic_resource
>());
283 string
s2(pilfer(s1
));
284 BOOST_TEST(s1
.storage().get() ==
285 storage_ptr().get());
293 string
s2(std::move(s1
));
294 BOOST_TEST(s2
== t
.v1
);
295 BOOST_TEST(s1
.empty());
303 string
s2(std::move(s1
));
304 BOOST_TEST(s2
== t
.v2
);
305 BOOST_TEST(s1
.empty());
312 // string(string&&, storage_ptr)
316 fail_loop([&](storage_ptr
const& sp
)
319 string
s2(std::move(s1
), sp
);
320 BOOST_TEST(s2
== t
.v1
);
321 BOOST_TEST(s1
.empty());
327 fail_loop([&](storage_ptr
const& sp
)
330 string
s2(std::move(s1
));
331 BOOST_TEST(s2
== t
.v2
);
332 BOOST_TEST(s1
.empty());
340 fail_loop([&](storage_ptr
const& sp
)
343 string
s2(std::move(s1
), sp
);
344 BOOST_TEST(s2
== t
.v1
);
345 BOOST_TEST(s1
== t
.v1
);
351 fail_loop([&](storage_ptr
const& sp
)
354 string
s2(std::move(s1
), sp
);
355 BOOST_TEST(s2
== t
.v2
);
356 BOOST_TEST(s1
== t
.v2
);
363 // string(string_view, storage_ptr)
365 fail_loop([&](storage_ptr
const& sp
)
368 BOOST_TEST(s
== t
.v1
);
371 fail_loop([&](storage_ptr
const& sp
)
374 BOOST_TEST(s
== t
.v2
);
379 BOOST_TEST(s
== t
.v1
);
384 BOOST_TEST(s
== t
.v2
);
392 test_vectors
const t
;
396 fail_loop([&](storage_ptr
const& sp
)
398 std::string
c(t
.v1
.size(), '*');
400 string
const s2(t
.v1
);
402 BOOST_TEST(s
== t
.v1
);
405 fail_loop([&](storage_ptr
const& sp
)
407 std::string
c(t
.v2
.size(), '*');
409 string
const s2(t
.v1
);
411 BOOST_TEST(s
== t
.v1
);
414 fail_loop([&](storage_ptr
const& sp
)
416 std::string
c(t
.v1
.size(), '*');
418 string
const s2(t
.v2
);
420 BOOST_TEST(s
== t
.v2
);
423 fail_loop([&](storage_ptr
const& sp
)
425 std::string
c(t
.v2
.size(), '*');
427 string
const s2(t
.v2
);
429 BOOST_TEST(s
== t
.v2
);
433 // operator=(string&&)
437 fail_loop([&](storage_ptr
const& sp
)
439 std::string
c(t
.v1
.size(), '*');
443 BOOST_TEST(s
== t
.v1
);
444 BOOST_TEST(s2
.empty());
450 fail_loop([&](storage_ptr
const& sp
)
452 std::string
c(t
.v2
.size(), '*');
456 BOOST_TEST(s
== t
.v1
);
457 BOOST_TEST(s2
.empty());
463 fail_loop([&](storage_ptr
const& sp
)
465 std::string
c(t
.v1
.size(), '*');
469 BOOST_TEST(s
== t
.v2
);
470 BOOST_TEST(s2
.empty());
476 fail_loop([&](storage_ptr
const& sp
)
478 std::string
c(t
.v2
.size(), '*');
482 BOOST_TEST(s
== t
.v2
);
483 BOOST_TEST(s2
.empty());
491 fail_loop([&](storage_ptr
const& sp
)
493 std::string
c(t
.v1
.size(), '*');
497 BOOST_TEST(s
== t
.v1
);
498 BOOST_TEST(s2
== t
.v1
);
504 fail_loop([&](storage_ptr
const& sp
)
506 std::string
c(t
.v2
.size(), '*');
510 BOOST_TEST(s
== t
.v1
);
511 BOOST_TEST(s2
== t
.v1
);
517 fail_loop([&](storage_ptr
const& sp
)
519 std::string
c(t
.v1
.size(), '*');
523 BOOST_TEST(s
== t
.v2
);
524 BOOST_TEST(s2
== t
.v2
);
530 fail_loop([&](storage_ptr
const& sp
)
532 std::string
c(t
.v2
.size(), '*');
536 BOOST_TEST(s
== t
.v2
);
537 BOOST_TEST(s2
== t
.v2
);
544 // operator=(char const*)
546 fail_loop([&](storage_ptr
const& sp
)
548 string
s(t
.v1
.size(), '*', sp
);
550 BOOST_TEST(s
== t
.v1
);
553 fail_loop([&](storage_ptr
const& sp
)
555 string
s(t
.v2
.size(), '*', sp
);
557 BOOST_TEST(s
== t
.v1
);
560 fail_loop([&](storage_ptr
const& sp
)
562 string
s(t
.v1
.size(), '*', sp
);
564 BOOST_TEST(s
== t
.v2
);
567 fail_loop([&](storage_ptr
const& sp
)
569 string
s(t
.v2
.size(), '*', sp
);
571 BOOST_TEST(s
== t
.v2
);
575 // operator=(string_view)
577 fail_loop([&](storage_ptr
const& sp
)
579 string
s(t
.v1
.size(), '*', sp
);
581 BOOST_TEST(s
== t
.v1
);
584 fail_loop([&](storage_ptr
const& sp
)
586 string
s(t
.v2
.size(), '*', sp
);
588 BOOST_TEST(s
== t
.v1
);
591 fail_loop([&](storage_ptr
const& sp
)
593 string
s(t
.v1
.size(), '*', sp
);
595 BOOST_TEST(s
== t
.v2
);
598 fail_loop([&](storage_ptr
const& sp
)
600 string
s(t
.v2
.size(), '*', sp
);
602 BOOST_TEST(s
== t
.v2
);
610 test_vectors
const t
;
612 // assign(size_type, char)
614 fail_loop([&](storage_ptr
const& sp
)
616 string
s(t
.v1
.size(), 'x', sp
);
617 s
.assign(t
.v1
.size(), '*');
619 s
== std::string(t
.v1
.size(), '*'));
622 fail_loop([&](storage_ptr
const& sp
)
624 string
s(t
.v2
.size(), 'x', sp
);
625 s
.assign(t
.v1
.size(), '*');
627 s
== std::string(t
.v1
.size(), '*'));
630 fail_loop([&](storage_ptr
const& sp
)
632 string
s(t
.v1
.size(), 'x', sp
);
633 s
.assign(t
.v2
.size(), '*');
635 s
== std::string(t
.v2
.size(), '*'));
638 fail_loop([&](storage_ptr
const& sp
)
640 string
s(t
.v2
.size(), 'x', sp
);
641 s
.assign(t
.v2
.size(), '*');
643 s
== std::string(t
.v2
.size(), '*'));
649 fail_loop([&](storage_ptr
const& sp
)
651 string
s(t
.v1
.size(), 'x', sp
);
652 s
.assign(string(t
.v1
.size(), '*'));
654 s
== std::string(t
.v1
.size(), '*'));
657 fail_loop([&](storage_ptr
const& sp
)
659 string
s(t
.v2
.size(), 'x', sp
);
660 s
.assign(string(t
.v1
.size(), '*'));
662 s
== std::string(t
.v1
.size(), '*'));
665 fail_loop([&](storage_ptr
const& sp
)
667 string
s(t
.v1
.size(), 'x', sp
);
668 s
.assign(string(t
.v2
.size(), '*'));
670 s
== std::string(t
.v2
.size(), '*'));
673 fail_loop([&](storage_ptr
const& sp
)
675 string
s(t
.v2
.size(), 'x', sp
);
676 s
.assign(string(t
.v2
.size(), '*'));
678 s
== std::string(t
.v2
.size(), '*'));
684 s
= static_cast<string
const&>(s
);
685 BOOST_TEST(s
== t
.v1
);
693 fail_loop([&](storage_ptr
const& sp
)
695 std::string
c(t
.v1
.size(), '*');
698 s
.assign(std::move(s2
));
699 BOOST_TEST(s
== t
.v1
);
700 BOOST_TEST(s2
.empty());
706 fail_loop([&](storage_ptr
const& sp
)
708 std::string
c(t
.v2
.size(), '*');
711 s
.assign(std::move(s2
));
712 BOOST_TEST(s
== t
.v1
);
713 BOOST_TEST(s2
.empty());
719 fail_loop([&](storage_ptr
const& sp
)
721 std::string
c(t
.v1
.size(), '*');
724 s
.assign(std::move(s2
));
725 BOOST_TEST(s
== t
.v2
);
726 BOOST_TEST(s2
.empty());
732 fail_loop([&](storage_ptr
const& sp
)
734 std::string
c(t
.v2
.size(), '*');
737 s
.assign(std::move(s2
));
738 BOOST_TEST(s
== t
.v2
);
739 BOOST_TEST(s2
.empty());
747 fail_loop([&](storage_ptr
const& sp
)
749 std::string
c(t
.v1
.size(), '*');
752 s
.assign(std::move(s2
));
753 BOOST_TEST(s
== t
.v1
);
754 BOOST_TEST(s2
== t
.v1
);
760 fail_loop([&](storage_ptr
const& sp
)
762 std::string
c(t
.v2
.size(), '*');
765 s
.assign(std::move(s2
));
766 BOOST_TEST(s
== t
.v1
);
767 BOOST_TEST(s2
== t
.v1
);
773 fail_loop([&](storage_ptr
const& sp
)
775 std::string
c(t
.v1
.size(), '*');
778 s
.assign(std::move(s2
));
779 BOOST_TEST(s
== t
.v2
);
780 BOOST_TEST(s2
== t
.v2
);
786 fail_loop([&](storage_ptr
const& sp
)
788 std::string
c(t
.v2
.size(), '*');
791 s
.assign(std::move(s2
));
792 BOOST_TEST(s
== t
.v2
);
793 BOOST_TEST(s2
== t
.v2
);
800 // assign(char const*, size_type)
802 fail_loop([&](storage_ptr
const& sp
)
804 string
s(t
.v1
.size(), '*', sp
);
805 s
.assign(t
.s1
.c_str(), 3);
806 BOOST_TEST(s
== "abc");
809 fail_loop([&](storage_ptr
const& sp
)
811 string
s(t
.v2
.size(), '*', sp
);
812 s
.assign(t
.s1
.c_str(), 3);
813 BOOST_TEST(s
== "abc");
816 fail_loop([&](storage_ptr
const& sp
)
818 string
s(t
.v1
.size(), '*', sp
);
819 s
.assign(t
.s2
.c_str(), 3);
820 BOOST_TEST(s
== "ABC");
823 fail_loop([&](storage_ptr
const& sp
)
825 string
s(t
.v2
.size(), '*', sp
);
826 s
.assign(t
.s2
.c_str(), 3);
827 BOOST_TEST(s
== "ABC");
831 // assign(char const* s)
833 fail_loop([&](storage_ptr
const& sp
)
835 string
s(t
.v1
.size(), '*', sp
);
836 s
.assign(t
.s1
.c_str());
837 BOOST_TEST(s
== t
.v1
);
840 fail_loop([&](storage_ptr
const& sp
)
842 string
s(t
.v2
.size(), '*', sp
);
843 s
.assign(t
.s1
.c_str());
844 BOOST_TEST(s
== t
.v1
);
847 fail_loop([&](storage_ptr
const& sp
)
849 string
s(t
.v1
.size(), '*', sp
);
850 s
.assign(t
.s2
.c_str());
851 BOOST_TEST(s
== t
.v2
);
854 fail_loop([&](storage_ptr
const& sp
)
856 string
s(t
.v2
.size(), '*', sp
);
857 s
.assign(t
.s2
.c_str());
858 BOOST_TEST(s
== t
.v2
);
862 // assign(InputIt, InputIt)
864 fail_loop([&](storage_ptr
const& sp
)
866 string
s(t
.v1
.size(), '*', sp
);
867 s
.assign(t
.s1
.begin(), t
.s1
.end());
868 BOOST_TEST(s
== t
.v1
);
871 fail_loop([&](storage_ptr
const& sp
)
873 string
s(t
.v2
.size(), '*', sp
);
874 s
.assign(t
.s1
.begin(), t
.s1
.end());
875 BOOST_TEST(s
== t
.v1
);
878 fail_loop([&](storage_ptr
const& sp
)
880 string
s(t
.v1
.size(), '*', sp
);
882 make_input_iterator(t
.s1
.begin()),
883 make_input_iterator(t
.s1
.end()));
884 BOOST_TEST(s
== t
.v1
);
887 fail_loop([&](storage_ptr
const& sp
)
889 string
s(t
.v2
.size(), '*', sp
);
891 make_input_iterator(t
.s1
.begin()),
892 make_input_iterator(t
.s1
.end()));
893 BOOST_TEST(s
== t
.v1
);
896 fail_loop([&](storage_ptr
const& sp
)
898 string
s(t
.v1
.size(), '*', sp
);
899 s
.assign(t
.s2
.begin(), t
.s2
.end());
900 BOOST_TEST(s
== t
.v2
);
903 fail_loop([&](storage_ptr
const& sp
)
905 string
s(t
.v2
.size(), '*', sp
);
906 s
.assign(t
.s2
.begin(), t
.s2
.end());
907 BOOST_TEST(s
== t
.v2
);
910 fail_loop([&](storage_ptr
const& sp
)
912 string
s(t
.v1
.size(), '*', sp
);
914 make_input_iterator(t
.s2
.begin()),
915 make_input_iterator(t
.s2
.end()));
916 BOOST_TEST(s
== t
.v2
);
919 fail_loop([&](storage_ptr
const& sp
)
921 string
s(t
.v2
.size(), '*', sp
);
923 make_input_iterator(t
.s2
.begin()),
924 make_input_iterator(t
.s2
.end()));
925 BOOST_TEST(s
== t
.v2
);
931 s
.assign(t
.s1
.begin(), t
.s1
.begin());
932 BOOST_TEST(s
.empty());
939 make_input_iterator(t
.s1
.begin()),
940 make_input_iterator(t
.s1
.begin()));
941 BOOST_TEST(s
.empty());
945 // assign(string_view)
947 fail_loop([&](storage_ptr
const& sp
)
949 string
s(t
.v1
.size(), '*', sp
);
951 BOOST_TEST(s
== t
.v1
);
954 fail_loop([&](storage_ptr
const& sp
)
956 string
s(t
.v2
.size(), '*', sp
);
958 BOOST_TEST(s
== t
.v1
);
961 fail_loop([&](storage_ptr
const& sp
)
963 string
s(t
.v1
.size(), '*', sp
);
965 BOOST_TEST(s
== t
.v2
);
968 fail_loop([&](storage_ptr
const& sp
)
970 string
s(t
.v2
.size(), '*', sp
);
972 BOOST_TEST(s
== t
.v2
);
980 test_vectors
const t
;
985 char const* chars
= cs
.c_str();
986 BOOST_TEST(chars
== t
.s1
);
987 json::string_view sv
= cs
;
988 BOOST_TEST(sv
== t
.s1
);
989 #if ! defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
990 std::string_view std_sv
= cs
;
991 BOOST_TEST(std_sv
== t
.s1
);
997 BOOST_TEST(chars
== t
.s2
);
999 BOOST_TEST(sv
== t
.s2
);
1000 #if ! defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
1002 BOOST_TEST(std_sv
== t
.s2
);
1009 test_vectors
const t
;
1013 auto const& cs1(s1
);
1014 auto const& cs2(s2
);
1018 BOOST_TEST(s1
.at(1) == 'b');
1020 BOOST_TEST(s1
.at(1) == '*');
1022 BOOST_TEST(s1
.at(1) == 'b');
1024 BOOST_TEST(s2
.at(1) == 'B');
1026 BOOST_TEST(s2
.at(1) == '*');
1028 BOOST_TEST(s2
.at(1) == 'B');
1030 BOOST_TEST_THROWS(s1
.at(s2
.size()),
1034 // at(size_type) const
1036 BOOST_TEST(cs1
.at(1) == 'b');
1037 BOOST_TEST(cs2
.at(1) == 'B');
1039 BOOST_TEST_THROWS(cs1
.at(cs2
.size()),
1043 // operator[&](size_type)
1045 BOOST_TEST(s1
[1] == 'b');
1047 BOOST_TEST(s1
[1] == '*');
1049 BOOST_TEST(s1
[1] == 'b');
1051 BOOST_TEST(s2
[1] == 'B');
1053 BOOST_TEST(s2
[1] == '*');
1055 BOOST_TEST(s2
[1] == 'B');
1058 // operator[&](size_type) const
1060 BOOST_TEST(cs1
[1] == 'b');
1061 BOOST_TEST(cs2
[1] == 'B');
1066 BOOST_TEST(s1
.front() == 'a');
1068 BOOST_TEST(s1
.front() == '*');
1070 BOOST_TEST(s1
.front() == 'a');
1072 BOOST_TEST(s2
.front() == 'A');
1074 BOOST_TEST(s2
.front() == '*');
1076 BOOST_TEST(s2
.front() == 'A');
1081 BOOST_TEST(cs1
.front() == 'a');
1082 BOOST_TEST(cs2
.front() == 'A');
1087 auto const ch1
= s1
.at(s1
.size()-1);
1088 auto const ch2
= s2
.at(s2
.size()-1);
1090 BOOST_TEST(s1
.back() == ch1
);
1092 BOOST_TEST(s1
.back() == '*');
1094 BOOST_TEST(s1
.back() == ch1
);
1096 BOOST_TEST(s2
.back() == ch2
);
1098 BOOST_TEST(s2
.back() == '*');
1100 BOOST_TEST(s2
.back() == ch2
);
1105 auto const ch1
= s1
.at(s1
.size()-1);
1106 auto const ch2
= s2
.at(s2
.size()-1);
1108 BOOST_TEST(cs1
.back() == ch1
);
1109 BOOST_TEST(cs2
.back() == ch2
);
1115 string_view(s1
.data()) == t
.v1
);
1117 string_view(s2
.data()) == t
.v2
);
1122 string_view(cs1
.data()) == t
.v1
);
1124 string_view(cs2
.data()) == t
.v2
);
1130 string_view(cs1
.c_str()) == t
.v1
);
1132 string_view(cs2
.c_str()) == t
.v2
);
1135 // operator string_view()
1138 string_view(cs1
) == t
.v1
);
1140 string_view(cs2
) == t
.v2
);
1151 auto it
= s
.begin();
1152 BOOST_TEST(*it
== 'a'); ++it
;
1153 BOOST_TEST(*it
== 'b'); it
++;
1154 BOOST_TEST(*it
== 'c'); ++it
;
1155 BOOST_TEST(it
== s
.end());
1158 auto it
= s
.cbegin();
1159 BOOST_TEST(*it
== 'a'); ++it
;
1160 BOOST_TEST(*it
== 'b'); it
++;
1161 BOOST_TEST(*it
== 'c'); ++it
;
1162 BOOST_TEST(it
== s
.cend());
1165 auto it
= ac
.begin();
1166 BOOST_TEST(*it
== 'a'); ++it
;
1167 BOOST_TEST(*it
== 'b'); it
++;
1168 BOOST_TEST(*it
== 'c'); ++it
;
1169 BOOST_TEST(it
== ac
.end());
1173 --it
; BOOST_TEST(*it
== 'c');
1174 it
--; BOOST_TEST(*it
== 'b');
1175 --it
; BOOST_TEST(*it
== 'a');
1176 BOOST_TEST(it
== s
.begin());
1180 --it
; BOOST_TEST(*it
== 'c');
1181 it
--; BOOST_TEST(*it
== 'b');
1182 --it
; BOOST_TEST(*it
== 'a');
1183 BOOST_TEST(it
== s
.cbegin());
1187 --it
; BOOST_TEST(*it
== 'c');
1188 it
--; BOOST_TEST(*it
== 'b');
1189 --it
; BOOST_TEST(*it
== 'a');
1190 BOOST_TEST(it
== ac
.begin());
1194 auto it
= s
.rbegin();
1195 BOOST_TEST(*it
== 'c'); ++it
;
1196 BOOST_TEST(*it
== 'b'); it
++;
1197 BOOST_TEST(*it
== 'a'); ++it
;
1198 BOOST_TEST(it
== s
.rend());
1201 auto it
= s
.crbegin();
1202 BOOST_TEST(*it
== 'c'); ++it
;
1203 BOOST_TEST(*it
== 'b'); it
++;
1204 BOOST_TEST(*it
== 'a'); ++it
;
1205 BOOST_TEST(it
== s
.crend());
1208 auto it
= ac
.rbegin();
1209 BOOST_TEST(*it
== 'c'); ++it
;
1210 BOOST_TEST(*it
== 'b'); it
++;
1211 BOOST_TEST(*it
== 'a'); ++it
;
1212 BOOST_TEST(it
== ac
.rend());
1216 --it
; BOOST_TEST(*it
== 'a');
1217 it
--; BOOST_TEST(*it
== 'b');
1218 --it
; BOOST_TEST(*it
== 'c');
1219 BOOST_TEST(it
== s
.rbegin());
1222 auto it
= s
.crend();
1223 --it
; BOOST_TEST(*it
== 'a');
1224 it
--; BOOST_TEST(*it
== 'b');
1225 --it
; BOOST_TEST(*it
== 'c');
1226 BOOST_TEST(it
== s
.crbegin());
1229 auto it
= ac
.rend();
1230 --it
; BOOST_TEST(*it
== 'a');
1231 it
--; BOOST_TEST(*it
== 'b');
1232 --it
; BOOST_TEST(*it
== 'c');
1233 BOOST_TEST(it
== ac
.rbegin());
1238 string
const& cs2(s2
);
1239 BOOST_TEST(std::distance(
1240 s2
.begin(), s2
.end()) == 0);
1241 BOOST_TEST(std::distance(
1242 cs2
.begin(), cs2
.end()) == 0);
1243 BOOST_TEST(std::distance(
1244 s2
.rbegin(), s2
.rend()) == 0);
1245 BOOST_TEST(std::distance(
1246 cs2
.rbegin(), cs2
.rend()) == 0);
1253 test_vectors
const t
;
1259 BOOST_TEST(s
.empty());
1263 BOOST_TEST(! s
.empty());
1271 BOOST_TEST(s
.size() == 3);
1272 BOOST_TEST(s
.max_size() < string::npos
);
1275 // reserve(size_type)
1277 fail_loop([&](storage_ptr
const& sp
)
1284 BOOST_TEST(s
.size() ==
1285 t
.v1
.size() + t
.v2
.size());
1287 s
.reserve(t
.v1
.size() + t
.v2
.size());
1288 BOOST_TEST(s
.size() ==
1289 t
.v1
.size() + t
.v2
.size());
1291 s
.reserve(s
.size() * 2);
1292 BOOST_TEST(s
.capacity() >
1293 t
.v1
.size() + t
.v2
.size());
1295 s
.resize(t
.v1
.size());
1296 s
.reserve(t
.v1
.size());
1297 BOOST_TEST(s
== t
.v1
);
1307 fail_loop([&](storage_ptr
const& sp
)
1310 string::size_type cap
;
1314 BOOST_TEST(s
.capacity() == cap
);
1316 s
.reserve(s
.capacity() + 1);
1318 BOOST_TEST(s
.capacity() == cap
);
1320 s
.resize(cap
* 3, '*');
1324 BOOST_TEST(s
.capacity() == cap
);
1327 BOOST_TEST(s
.capacity() == cap
);
1330 BOOST_TEST(s
.capacity() < cap
);
1337 test_vectors
const t
;
1344 BOOST_TEST(s
.empty());
1345 BOOST_TEST(s
.size() == 0);
1346 BOOST_TEST(s
.capacity() > 0);
1352 BOOST_TEST(s
.empty());
1353 BOOST_TEST(s
.size() == 0);
1354 BOOST_TEST(s
.capacity() > 0);
1362 test_vectors
const t
;
1364 // insert(size_type, size_type, char)
1366 fail_loop([&](storage_ptr
const& sp
)
1369 s
.insert(1, 3, '*');
1370 BOOST_TEST(s
== std::string(
1371 t
.v1
).insert(1, 3, '*'));
1374 fail_loop([&](storage_ptr
const& sp
)
1377 s
.insert(1, 3, '*');
1378 BOOST_TEST(s
== std::string(
1379 t
.v2
).insert(1, 3, '*'));
1386 (s
.insert(s
.size() + 2, 1, '*')),
1394 (s
.insert(1, s
.max_size(), 'a')),
1399 // insert(size_type, char const*)
1401 fail_loop([&](storage_ptr
const& sp
)
1405 BOOST_TEST(s
== std::string(
1406 t
.v1
).insert(1, "***"));
1409 fail_loop([&](storage_ptr
const& sp
)
1413 BOOST_TEST(s
== std::string(
1414 t
.v2
).insert(1, "***"));
1421 (s
.insert(s
.size() + 2, "*")),
1426 // insert(size_type, char const*, size_type)
1428 fail_loop([&](storage_ptr
const& sp
)
1431 s
.insert(1, "*****");
1432 BOOST_TEST(s
== std::string(
1433 t
.v1
).insert(1, "*****"));
1436 fail_loop([&](storage_ptr
const& sp
)
1439 s
.insert(1, "*****");
1440 BOOST_TEST(s
== std::string(
1441 t
.v2
).insert(1, "*****"));
1445 // insert(size_type, string const&)
1447 fail_loop([&](storage_ptr
const& sp
)
1450 s
.insert(1, string(t
.v2
));
1451 BOOST_TEST(s
== std::string(
1452 t
.v1
).insert(1, t
.s2
));
1455 fail_loop([&](storage_ptr
const& sp
)
1458 s
.insert(1, string(t
.v1
));
1459 BOOST_TEST(s
== std::string(
1460 t
.v2
).insert(1, t
.s1
));
1464 //// KRYSTIAN These tests are superseded by the new string_view overloads
1465 //// insert(size_type, string const&, size_type, size_type)
1467 // fail_loop([&](storage_ptr const& sp)
1469 // string s(t.v1, sp);
1470 // s.insert(1, string(t.v2), 1, 3);
1471 // BOOST_TEST(s == std::string(
1472 // t.v1).insert(1, t.s2, 1, 3));
1475 // fail_loop([&](storage_ptr const& sp)
1477 // string s(t.v2, sp);
1478 // s.insert(1, string(t.v1), 1, 3);
1479 // BOOST_TEST(s == std::string(
1480 // t.v2).insert(1, t.s1, 1, 3));
1483 // fail_loop([&](storage_ptr const& sp)
1485 // string s(t.v1, sp);
1486 // s.insert(1, string(t.v2), 1);
1487 // BOOST_TEST(s == std::string(
1488 // t.v1).insert(1, t.s2, 1, std::string::npos));
1491 // fail_loop([&](storage_ptr const& sp)
1493 // string s(t.v2, sp);
1494 // s.insert(1, string(t.v1), 1);
1495 // BOOST_TEST(s == std::string(
1496 // t.v2).insert(1, t.s1, 1, std::string::npos));
1500 // insert(size_type, char)
1502 fail_loop([&](storage_ptr
const& sp
)
1506 s
.insert(2, '*')[2] == '*');
1509 fail_loop([&](storage_ptr
const& sp
)
1513 s
.insert(2, '*')[2] == '*');
1517 // insert(const_iterator, size_type, char)
1519 fail_loop([&](storage_ptr
const& sp
)
1522 BOOST_TEST(string_view(
1523 &(s
.insert(2, 3, '*')[2]), 5) ==
1527 fail_loop([&](storage_ptr
const& sp
)
1530 BOOST_TEST(string_view(
1531 &(s
.insert(2, 3, '*')[2]), 5) ==
1536 // insert(const_iterator, InputIt, InputIt)
1538 fail_loop([&](storage_ptr
const& sp
)
1541 s
.insert(2, t
.s2
.begin(), t
.s2
.end());
1542 std::string
cs(t
.s1
);
1543 cs
.insert(2, &t
.s2
[0], t
.s2
.size());
1544 BOOST_TEST(s
== cs
);
1547 fail_loop([&](storage_ptr
const& sp
)
1550 s
.insert(2, t
.s1
.begin(), t
.s1
.end());
1551 std::string
cs(t
.s2
);
1552 cs
.insert(2, &t
.s1
[0], t
.s1
.size());
1553 BOOST_TEST(s
== cs
);
1556 fail_loop([&](storage_ptr
const& sp
)
1560 make_input_iterator(t
.s2
.begin()),
1561 make_input_iterator(t
.s2
.end()));
1562 std::string
cs(t
.s1
);
1563 cs
.insert(2, &t
.s2
[0], t
.s2
.size());
1564 BOOST_TEST(s
== cs
);
1567 fail_loop([&](storage_ptr
const& sp
)
1571 make_input_iterator(t
.s1
.begin()),
1572 make_input_iterator(t
.s1
.end()));
1573 std::string
cs(t
.s2
);
1574 cs
.insert(2, &t
.s1
[0], t
.s1
.size());
1575 BOOST_TEST(s
== cs
);
1579 // insert(const_iterator, string_view)
1581 fail_loop([&](storage_ptr
const& sp
)
1584 s
.insert(2, string_view(t
.v2
));
1585 std::string
cs(t
.v1
);
1587 BOOST_TEST(s
== cs
);
1590 fail_loop([&](storage_ptr
const& sp
)
1593 s
.insert(2, string_view(t
.v1
));
1594 std::string
cs(t
.v2
);
1596 BOOST_TEST(s
== cs
);
1600 // insert(const_iterator, string_view)
1602 fail_loop([&](storage_ptr
const& sp
)
1605 s
.insert(2, string_view(t
.v2
).substr(2, 3));
1606 std::string
cs(t
.v1
);
1607 cs
.insert(2, t
.s2
, 2, 3);
1608 BOOST_TEST(s
== cs
);
1611 fail_loop([&](storage_ptr
const& sp
)
1614 s
.insert(2, string_view(t
.v1
).substr(2, 3));
1615 std::string
cs(t
.v2
);
1616 cs
.insert(2, t
.s1
, 2, 3);
1617 BOOST_TEST(s
== cs
);
1621 // insert(size_type, char const*)
1623 fail_loop([&](storage_ptr
const& sp
)
1627 BOOST_TEST(s
== std::string(
1628 t
.v1
).insert(1, "***"));
1631 fail_loop([&](storage_ptr
const& sp
)
1635 BOOST_TEST(s
== std::string(
1636 t
.v2
).insert(1, "***"));
1643 (s
.insert(s
.size() + 2, "*")),
1648 // insert tests for when source is within destination
1650 // start before splice point
1651 fail_loop([&](storage_ptr
const& sp
)
1654 s
.reserve(s
.size() + 10);
1655 s
.insert(4, s
.subview(0, 3));
1656 std::string
cs(t
.v1
);
1657 cs
.insert(4, cs
.substr(0, 3));
1658 BOOST_TEST(s
== cs
);
1661 // start after splice point
1662 fail_loop([&](storage_ptr
const& sp
)
1665 s
.reserve(s
.size() + 10);
1666 s
.insert(0, s
.subview(3, 3));
1667 std::string
cs(t
.v1
);
1668 cs
.insert(0, cs
.substr(3, 3));
1669 BOOST_TEST(s
== cs
);
1672 // insert pos bisects the inserted string
1673 fail_loop([&](storage_ptr
const& sp
)
1676 s
.reserve(s
.size() + 10);
1677 s
.insert(2, s
.subview(0, 5));
1678 std::string
cs(t
.v1
);
1679 cs
.insert(2, cs
.substr(0, 5));
1680 BOOST_TEST(s
== cs
);
1684 // insert reallocation test
1686 fail_loop([&](storage_ptr
const& sp
)
1689 std::string
cs(t
.v2
);
1690 const auto view
= t
.v2
.substr(0, 4);
1694 cs
.insert(2, view
.data(), view
.size());
1695 BOOST_TEST(s
== cs
);
1703 test_vectors
const t
;
1705 // erase(size_type, size_type)
1711 std::string(t
.v1
).erase(1, 3));
1718 std::string(t
.v2
).erase(1, 3));
1725 std::string(t
.v1
).erase(3));
1732 std::string(t
.v2
).erase(3));
1739 std::string(t
.v1
).erase());
1746 std::string(t
.v2
).erase());
1752 (s
.erase(t
.v1
.size() + 1, 1)),
1757 // iterator erase(const_iterator)
1761 std::string
s2(t
.v1
);
1762 s
.erase(s
.begin() + 3);
1763 s2
.erase(s2
.begin() + 3);
1764 BOOST_TEST(s
== s2
);
1769 std::string
s2(t
.v2
);
1770 s
.erase(s
.begin() + 3);
1771 s2
.erase(s2
.begin() + 3);
1772 BOOST_TEST(s
== s2
);
1776 // iterator erase(const_iterator, const_iterator)
1779 std::string
s2(t
.v1
);
1780 s
.erase(s
.begin() + 1, s
.begin() + 3);
1781 s2
.erase(s2
.begin() + 1, s2
.begin() + 3);
1782 BOOST_TEST(s
== s2
);
1789 test_vectors
const t
;
1793 fail_loop([&](storage_ptr
const& sp
)
1798 BOOST_TEST(s
== t
.v1
);
1801 fail_loop([&](storage_ptr
const& sp
)
1806 BOOST_TEST(s
== t
.v2
);
1816 BOOST_TEST(s
.empty());
1817 BOOST_TEST(s
.capacity() > 0);
1824 BOOST_TEST(s
.empty());
1825 BOOST_TEST(s
.capacity() > 0);
1833 test_vectors
const t
;
1835 // append(size_type, char)
1837 fail_loop([&](storage_ptr
const& sp
)
1840 s
.append(t
.v2
.size(), '*');
1841 BOOST_TEST(s
== t
.s1
+
1842 std::string(t
.v2
.size(), '*'));
1845 fail_loop([&](storage_ptr
const& sp
)
1848 s
.append(t
.v1
.size(), '*');
1849 BOOST_TEST(s
== t
.s2
+
1850 std::string(t
.v1
.size(), '*'));
1854 // append(string_view)
1856 fail_loop([&](storage_ptr
const& sp
)
1859 s
.append(string(t
.v2
));
1860 BOOST_TEST(s
== t
.s1
+ t
.s2
);
1863 fail_loop([&](storage_ptr
const& sp
)
1866 s
.append(string(t
.v1
));
1867 BOOST_TEST(s
== t
.s2
+ t
.s1
);
1871 // append(string_view)
1873 fail_loop([&](storage_ptr
const& sp
)
1876 s
.append(string(t
.v2
).subview(3));
1877 BOOST_TEST(s
== t
.s1
+ t
.s2
.substr(3));
1880 fail_loop([&](storage_ptr
const& sp
)
1883 s
.append(string(t
.v1
).subview(3));
1884 BOOST_TEST(s
== t
.s2
+ t
.s1
.substr(3));
1887 fail_loop([&](storage_ptr
const& sp
)
1890 s
.append(string(t
.v2
).subview(2, 3));
1891 BOOST_TEST(s
== t
.s1
+ t
.s2
.substr(2, 3));
1894 fail_loop([&](storage_ptr
const& sp
)
1897 s
.append(string(t
.v1
).subview(2, 3));
1898 BOOST_TEST(s
== t
.s2
+ t
.s1
.substr(2, 3));
1902 // append(char const*)
1904 fail_loop([&](storage_ptr
const& sp
)
1907 s
.append(t
.s2
.c_str());
1908 BOOST_TEST(s
== t
.s1
+ t
.s2
);
1911 fail_loop([&](storage_ptr
const& sp
)
1914 s
.append(t
.s1
.c_str());
1915 BOOST_TEST(s
== t
.s2
+ t
.s1
);
1919 // append(InputIt, InputIt)
1921 fail_loop([&](storage_ptr
const& sp
)
1924 s
.append(t
.s2
.begin(), t
.s2
.end());
1925 BOOST_TEST(s
== t
.s1
+ t
.s2
);
1928 fail_loop([&](storage_ptr
const& sp
)
1931 s
.append(t
.s1
.begin(), t
.s1
.end());
1932 BOOST_TEST(s
== t
.s2
+ t
.s1
);
1935 // Fails on Visual Studio 2017 C++2a Strict
1936 fail_loop([&](storage_ptr
const& sp
)
1940 make_input_iterator(t
.s2
.begin()),
1941 make_input_iterator(t
.s2
.end()));
1942 BOOST_TEST(s
== t
.s1
+ t
.s2
);
1945 fail_loop([&](storage_ptr
const& sp
)
1949 make_input_iterator(t
.s1
.begin()),
1950 make_input_iterator(t
.s1
.end()));
1951 BOOST_TEST(s
== t
.s2
+ t
.s1
);
1955 // append(string_view)
1957 fail_loop([&](storage_ptr
const& sp
)
1961 BOOST_TEST(s
== t
.s1
+ t
.s2
);
1964 fail_loop([&](storage_ptr
const& sp
)
1968 BOOST_TEST(s
== t
.s2
+ t
.s1
);
1972 // append(string_view)
1974 fail_loop([&](storage_ptr
const& sp
)
1977 s
.append(t
.v2
.substr(2));
1978 BOOST_TEST(s
== t
.s1
+ t
.s2
.substr(2));
1981 fail_loop([&](storage_ptr
const& sp
)
1984 s
.append(t
.v1
.substr(2));
1985 BOOST_TEST(s
== t
.s2
+ t
.s1
.substr(2));
1988 fail_loop([&](storage_ptr
const& sp
)
1991 s
.append(t
.v2
.substr(2, 3));
1992 BOOST_TEST(s
== t
.s1
+ t
.s2
.substr(2, 3));
1995 fail_loop([&](storage_ptr
const& sp
)
1998 s
.append(t
.v1
.substr(2, 3));
1999 BOOST_TEST(s
== t
.s2
+ t
.s1
.substr(2, 3));
2007 test_vectors
const t
;
2009 // operator+=(string)
2011 fail_loop([&](storage_ptr
const& sp
)
2015 BOOST_TEST(s
== t
.s1
+ t
.s2
);
2018 fail_loop([&](storage_ptr
const& sp
)
2022 BOOST_TEST(s
== t
.s2
+ t
.s1
);
2028 fail_loop([&](storage_ptr
const& sp
)
2033 BOOST_TEST(s
== t
.v1
);
2036 fail_loop([&](storage_ptr
const& sp
)
2041 BOOST_TEST(s
== t
.v2
);
2045 // operator+=(char const*)
2047 fail_loop([&](storage_ptr
const& sp
)
2051 BOOST_TEST(s
== t
.s1
+ t
.s2
);
2054 fail_loop([&](storage_ptr
const& sp
)
2058 BOOST_TEST(s
== t
.s2
+ t
.s1
);
2062 // operator+=(string_view)
2064 fail_loop([&](storage_ptr
const& sp
)
2068 BOOST_TEST(s
== t
.s1
+ t
.s2
);
2071 fail_loop([&](storage_ptr
const& sp
)
2075 BOOST_TEST(s
== t
.s2
+ t
.s1
);
2083 test_vectors
const t
;
2084 string
const v1
= t
.v1
;
2087 BOOST_TEST(v1
.compare(string("aaaaaaa")) > 0);
2088 BOOST_TEST(v1
.compare(string(t
.v1
)) == 0);
2089 BOOST_TEST(v1
.compare(string("bbbbbbb")) < 0);
2091 // compare(char const*)
2092 BOOST_TEST(v1
.compare("aaaaaaa") > 0);
2093 BOOST_TEST(v1
.compare(t
.s1
.c_str()) == 0);
2094 BOOST_TEST(v1
.compare("bbbbbbb") < 0);
2096 // compare(string_view s)
2097 BOOST_TEST(v1
.compare(string_view("aaaaaaa")) > 0);
2098 BOOST_TEST(v1
.compare(t
.v1
) == 0);
2099 BOOST_TEST(v1
.compare(string_view("bbbbbbb")) < 0);
2105 test_vectors
const t
;
2106 string
const v1
= t
.v1
;
2107 string
const v2
= t
.v2
;
2109 // starts_with(string_view)
2111 BOOST_TEST(v1
.starts_with(string_view("abc")));
2112 BOOST_TEST(v2
.starts_with(string_view("ABC")));
2113 BOOST_TEST(! v1
.starts_with(string_view("xyz")));
2114 BOOST_TEST(! v2
.starts_with(string_view("XYZ")));
2117 // starts_with(char)
2119 BOOST_TEST(v1
.starts_with('a'));
2120 BOOST_TEST(v2
.starts_with('A'));
2121 BOOST_TEST(! v1
.starts_with('x'));
2122 BOOST_TEST(! v2
.starts_with('X'));
2125 // starts_with(char const*)
2127 BOOST_TEST(v1
.starts_with("abc"));
2128 BOOST_TEST(v2
.starts_with("ABC"));
2129 BOOST_TEST(! v1
.starts_with("xyz"));
2130 BOOST_TEST(! v2
.starts_with("XYZ"));
2133 // ends_with(string_view)
2135 BOOST_TEST(v1
.ends_with(last_of(t
.s1
,3)));
2136 BOOST_TEST(v2
.ends_with(last_of(t
.s2
,3)));
2137 BOOST_TEST(! v1
.ends_with(string_view("abc")));
2138 BOOST_TEST(! v2
.ends_with(string_view("ABC")));
2143 BOOST_TEST(v1
.ends_with(last_of(t
.s1
, 1)[0]));
2144 BOOST_TEST(v2
.ends_with(last_of(t
.s2
, 1)[0]));
2145 BOOST_TEST(! v1
.ends_with('a'));
2146 BOOST_TEST(! v2
.ends_with('A'));
2149 // ends_with(char const*)
2151 BOOST_TEST(v1
.ends_with(last_of(t
.s1
, 3).data()));
2152 BOOST_TEST(v2
.ends_with(last_of(t
.s2
, 3).data()));
2153 BOOST_TEST(! v1
.ends_with("abc"));
2154 BOOST_TEST(! v2
.ends_with("ABC"));
2161 test_vectors
const t
;
2163 // replace(std::size_t, std::size_t, string_view)
2166 fail_loop([&](storage_ptr
const& sp
)
2169 BOOST_TEST_THROWS(s
.replace(s
.size() + 1, 1, t
.v2
),
2174 fail_loop([&](storage_ptr
const& sp
)
2176 std::string
s1(t
.v2
.data(), t
.v2
.size());
2177 string
s2(t
.v2
, sp
);
2178 BOOST_TEST(s2
.replace(0, 4, t
.v2
.substr(4, 2)) ==
2179 s1
.replace(0, 4, t
.v2
.data() + 4, 2));
2183 fail_loop([&](storage_ptr
const& sp
)
2185 std::string
s1(t
.v2
.data(), t
.v2
.size());
2186 string
s2(t
.v2
, sp
);
2187 BOOST_TEST(s2
.replace(0, 1, t
.v2
.substr(0)) ==
2188 s1
.replace(0, 1, t
.v2
.data(), t
.v2
.size()));
2191 // outside, grow, reallocate
2192 fail_loop([&](storage_ptr
const& sp
)
2194 std::string
s1(t
.v2
.data(), t
.v2
.size());
2195 string
s2(t
.v2
, sp
);
2198 BOOST_TEST(s2
.replace(0, 1, t
.v2
.substr(0)) ==
2199 s1
.replace(0, 1, t
.v2
.data(), t
.v2
.size()));
2203 fail_loop([&](storage_ptr
const& sp
)
2205 std::string
s1(t
.v2
.data(), t
.v2
.size());
2206 string
s2(t
.v2
, sp
);
2207 BOOST_TEST(s2
.replace(0, 2, t
.v2
.substr(0, 2)) ==
2208 s1
.replace(0, 2, t
.v2
.data(), 2));
2211 // replace tests for full coverage
2213 // inside, no effect
2214 fail_loop([&](storage_ptr
const& sp
)
2216 std::string
s1(t
.v2
.data(), t
.v2
.size());
2217 string
s2(t
.v2
, sp
);
2218 BOOST_TEST(s2
.replace(0, 4, s2
.subview(0, 4)) ==
2219 s1
.replace(0, 4, s1
.data() + 0, 4));
2222 // inside, shrink, split
2223 fail_loop([&](storage_ptr
const& sp
)
2225 std::string
s1(t
.v2
.data(), t
.v2
.size());
2226 string
s2(t
.v2
, sp
);
2227 BOOST_TEST(s2
.replace(1, 4, s2
.subview(4, 2)) ==
2228 s1
.replace(1, 4, s1
.data() + 4, 2));
2231 // inside, grow no reallocate, split
2232 fail_loop([&](storage_ptr
const& sp
)
2234 std::string
s1(t
.v2
.data(), t
.v2
.size());
2235 string
s2(t
.v2
, sp
);
2236 BOOST_TEST(s2
.replace(1, 1, s2
.subview(0)) ==
2237 s1
.replace(1, 1, s1
.data(), s1
.size()));
2240 // inside, reallocate, split
2241 fail_loop([&](storage_ptr
const& sp
)
2243 std::string
s1(t
.v2
.data(), t
.v2
.size());
2244 string
s2(t
.v2
, sp
);
2247 BOOST_TEST(s2
.replace(1, 1, s2
.subview(0)) ==
2248 s1
.replace(1, 1, s1
.data(), s1
.size()));
2251 // inside, same, split
2252 fail_loop([&](storage_ptr
const& sp
)
2254 std::string
s1(t
.v2
.data(), t
.v2
.size());
2255 string
s2(t
.v2
, sp
);
2256 BOOST_TEST(s2
.replace(1, 2, s2
.subview(0, 2)) ==
2257 s1
.replace(1, 2, s1
.data(), 2));
2261 // replace(const_iterator, const_iterator, string_view)
2264 fail_loop([&](storage_ptr
const& sp
)
2266 std::string
s1(t
.v2
.data(), t
.v2
.size());
2267 string
s2(t
.v2
, sp
);
2272 t
.v2
.substr(4, 2)) ==
2279 fail_loop([&](storage_ptr
const& sp
)
2281 std::string
s1(t
.v2
.data(), t
.v2
.size());
2282 string
s2(t
.v2
, sp
);
2294 fail_loop([&](storage_ptr
const& sp
)
2296 std::string
s1(t
.v2
.data(), t
.v2
.size());
2297 string
s2(t
.v2
, sp
);
2302 t
.v2
.substr(0, 2)) ==
2310 fail_loop([&](storage_ptr
const& sp
)
2312 std::string
s1(t
.v2
.data(), t
.v2
.size());
2313 string
s2(t
.v2
, sp
);
2318 s2
.subview(4, 2)) ==
2326 fail_loop([&](storage_ptr
const& sp
)
2328 std::string
s1(t
.v2
.data(), t
.v2
.size());
2329 string
s2(t
.v2
, sp
);
2342 fail_loop([&](storage_ptr
const& sp
)
2344 std::string
s1(t
.v2
.data(), t
.v2
.size());
2345 string
s2(t
.v2
, sp
);
2350 s2
.subview(0, 2)) ==
2358 // replace(std::size_t, std::size_t, std::size_t, char)
2361 fail_loop([&](storage_ptr
const& sp
)
2363 std::string
s1(t
.v2
.data(), t
.v2
.size());
2364 string
s2(t
.v2
, sp
);
2365 BOOST_TEST(s2
.replace(0, 4, 10, 'a') ==
2366 s1
.replace(0, 4, 10, 'a'));
2370 fail_loop([&](storage_ptr
const& sp
)
2372 std::string
s1(t
.v2
.data(), t
.v2
.size());
2373 string
s2(t
.v2
, sp
);
2374 const auto grow
= (std::max
)(s1
.capacity(), s2
.capacity());
2375 BOOST_TEST(s2
.replace(0, 4, grow
, 'a') ==
2376 s1
.replace(0, 4, grow
, 'a'));
2379 // no change in size
2380 fail_loop([&](storage_ptr
const& sp
)
2382 std::string
s1(t
.v2
.data(), t
.v2
.size());
2383 string
s2(t
.v2
, sp
);
2384 BOOST_TEST(s2
.replace(0, 1, 1, 'a') ==
2385 s1
.replace(0, 1, 1, 'a'));
2389 fail_loop([&](storage_ptr
const& sp
)
2392 BOOST_TEST_THROWS(s
.replace(s
.size() + 1, 1, 1, 'a'),
2397 // replace(const_iterator, const_iterator, std::size_t, char)
2399 fail_loop([&](storage_ptr
const& sp
)
2401 std::string
s1(t
.v2
.data(), t
.v2
.size());
2402 string
s2(t
.v2
, sp
);
2404 s2
.replace(s2
.begin(), s2
.begin() + 4, 10, 'a') ==
2405 s1
.replace(0, 4, 10, 'a'));
2413 test_vectors
const t
;
2414 string
const s1
= t
.v1
;
2415 string
const s2
= t
.v2
;
2417 // subview(size_type, size_type)
2418 BOOST_TEST(s1
.subview() == t
.v1
);
2419 BOOST_TEST(s1
.subview(1) == t
.v1
.substr(1));
2420 BOOST_TEST(s1
.subview(1, 3) == t
.v1
.substr(1, 3));
2421 BOOST_TEST(s2
.subview() == t
.v2
);
2422 BOOST_TEST(s2
.subview(1) == t
.v2
.substr(1));
2423 BOOST_TEST(s2
.subview(1, 3) == t
.v2
.substr(1, 3));
2429 test_vectors
const t
;
2431 // copy(char*, count, pos)
2437 s
.copy(&d
[0], d
.size(), 0);
2438 BOOST_TEST(d
== t
.v1
);
2445 s
.copy(&d
[0], d
.size());
2446 BOOST_TEST(d
== t
.v1
);
2454 test_vectors
const t
;
2456 // resize(size_type)
2458 fail_loop([&](storage_ptr
const& sp
)
2461 s
.resize(t
.v1
.size());
2462 BOOST_TEST(s
.size() == t
.v1
.size());
2463 BOOST_TEST(s
== string(t
.v1
.size(), '\0'));
2466 fail_loop([&](storage_ptr
const& sp
)
2469 s
.resize(t
.v2
.size());
2470 BOOST_TEST(s
.size() == t
.v2
.size());
2471 BOOST_TEST(s
== string(t
.v2
.size(), '\0'));
2474 fail_loop([&](storage_ptr
const& sp
)
2477 s
.resize(t
.v1
.size());
2478 s
.resize(t
.v2
.size());
2479 BOOST_TEST(s
== string(t
.v2
.size(), '\0'));
2480 s
.resize(t
.v1
.size());
2481 BOOST_TEST(s
== string(t
.v1
.size(), '\0'));
2485 // resize(size_type, char)
2487 fail_loop([&](storage_ptr
const& sp
)
2490 s
.resize(t
.v1
.size(), '*');
2491 BOOST_TEST(s
.size() == t
.v1
.size());
2492 BOOST_TEST(s
== string(t
.v1
.size(), '*'));
2495 fail_loop([&](storage_ptr
const& sp
)
2498 s
.resize(t
.v2
.size(), '*');
2499 BOOST_TEST(s
.size() == t
.v2
.size());
2500 BOOST_TEST(s
== string(t
.v2
.size(), '*'));
2503 fail_loop([&](storage_ptr
const& sp
)
2506 s
.resize(t
.v1
.size(), '*');
2507 s
.resize(t
.v2
.size(), '*');
2508 BOOST_TEST(s
== string(t
.v2
.size(), '*'));
2509 s
.resize(t
.v1
.size());
2510 BOOST_TEST(s
== string(t
.v1
.size(), '*'));
2518 test_vectors
const t
;
2522 fail_loop([&](storage_ptr
const& sp
)
2524 string
s1(t
.v1
, sp
);
2525 string
s2(t
.v2
, sp
);
2527 BOOST_TEST(s1
== t
.v2
);
2528 BOOST_TEST(s2
== t
.v1
);
2531 fail_loop([&](storage_ptr
const& sp
)
2533 string
s1(t
.v1
, sp
);
2534 string
s2(t
.v2
, sp
);
2536 BOOST_TEST(s1
== t
.v2
);
2537 BOOST_TEST(s2
== t
.v1
);
2540 fail_loop([&](storage_ptr
const& sp
)
2543 string
s2(t
.v2
, sp
);
2545 BOOST_TEST(s1
== t
.v2
);
2546 BOOST_TEST(s2
== t
.v1
);
2554 test_vectors
const t
;
2555 string
const s1
= t
.v1
;
2557 // find(string_view, size_type)
2558 BOOST_TEST(s1
.find("bcd") == 1);
2559 BOOST_TEST(s1
.find("cde") == 2);
2561 BOOST_TEST(s1
.find("bcd", 0) == 1);
2562 BOOST_TEST(s1
.find("cde", 1) == 2);
2563 BOOST_TEST(s1
.find("efg", 5) == string::npos
);
2565 // find(char, size_type)
2566 BOOST_TEST(s1
.find('b') == 1);
2567 BOOST_TEST(s1
.find('c', 1) == 2);
2568 BOOST_TEST(s1
.find('e', 5) == string::npos
);
2574 test_vectors
const t
;
2575 string
const s1
= t
.v1
;
2577 // rfind(string_view, size_type)
2578 BOOST_TEST(s1
.rfind("bcd") == 1);
2579 BOOST_TEST(s1
.rfind("cde") == 2);
2581 BOOST_TEST(s1
.rfind("bcd", 1) == 1);
2582 BOOST_TEST(s1
.rfind("cde", 2) == 2);
2583 BOOST_TEST(s1
.rfind("efg", 3) == string::npos
);
2585 // rfind(char, size_type)
2586 BOOST_TEST(s1
.rfind('b') == 1);
2587 BOOST_TEST(s1
.rfind('c', 2) == 2);
2588 BOOST_TEST(s1
.rfind('e', 3) == string::npos
);
2594 test_vectors
const t
;
2595 string
const s1
= t
.v1
;
2597 // find_first_of(string_view, size_type)
2598 BOOST_TEST(s1
.find_first_of("bcd") == 1);
2599 BOOST_TEST(s1
.find_first_of("cde") == 2);
2601 BOOST_TEST(s1
.find_first_of("bcd", 0) == 1);
2602 BOOST_TEST(s1
.find_first_of("cde", 1) == 2);
2603 BOOST_TEST(s1
.find_first_of("efg", 7) == string::npos
);
2607 testFindFirstNotOf()
2609 test_vectors
const t
;
2610 string
const s1
= t
.v1
;
2612 // find_first_not_of(string_view, size_type)
2613 BOOST_TEST(s1
.find_first_not_of("abc") == 3);
2614 BOOST_TEST(s1
.find_first_not_of("cde") == 0);
2616 BOOST_TEST(s1
.find_first_not_of("bcd", 0) == 0);
2617 BOOST_TEST(s1
.find_first_not_of("cde", 2) == 5);
2619 // find_first_not_of(char, size_type)
2620 BOOST_TEST(s1
.find_first_not_of('b') == 0);
2621 BOOST_TEST(s1
.find_first_not_of('a', 0) == 1);
2622 BOOST_TEST(s1
.find_first_not_of('e', 4) == 5);
2628 test_vectors
const t
;
2629 string
const s1
= t
.v1
;
2631 // find_last_of(string_view, size_type)
2632 BOOST_TEST(s1
.find_last_of("bcd") == 3);
2633 BOOST_TEST(s1
.find_last_of("cde") == 4);
2635 BOOST_TEST(s1
.find_last_of("bcd", 3) == 3);
2636 BOOST_TEST(s1
.find_last_of("cde", 5) == 4);
2637 BOOST_TEST(s1
.find_last_of("efg", 3) == string::npos
);
2643 test_vectors
const t
;
2644 string
const s1
= t
.v1
;
2646 // find_last_not_of(string_view, size_type)
2647 BOOST_TEST(s1
.find_last_not_of("abc", 3) == 3);
2648 BOOST_TEST(s1
.find_last_not_of("bcd", 3) == 0);
2650 BOOST_TEST(s1
.find_last_not_of("efg", 4) == 3);
2651 BOOST_TEST(s1
.find_last_not_of("abc", 2) == string::npos
);
2653 // find_first_not_of(char, size_type)
2654 BOOST_TEST(s1
.find_last_not_of('a', 3) == 3);
2655 BOOST_TEST(s1
.find_last_not_of('e', 4) == 3);
2656 BOOST_TEST(s1
.find_last_not_of('a', 0) == string::npos
);
2662 test_vectors
const t
;
2663 string
const s1(t
.v1
);
2664 string
const s2(t
.v2
);
2665 auto const v1(t
.v1
);
2666 auto const v2(t
.v2
);
2667 auto const c1
= t
.s1
.c_str();
2668 auto const c2
= t
.s2
.c_str();
2670 BOOST_TEST(! operator< (s1
, s2
));
2671 BOOST_TEST(! operator< (s1
, v2
));
2672 BOOST_TEST(! operator< (s1
, c2
));
2673 BOOST_TEST(! operator<=(s1
, s2
));
2674 BOOST_TEST(! operator<=(s1
, v2
));
2675 BOOST_TEST(! operator<=(s1
, c2
));
2676 BOOST_TEST(! operator==(s1
, s2
));
2677 BOOST_TEST(! operator==(s1
, v2
));
2678 BOOST_TEST(! operator==(s1
, c2
));
2679 BOOST_TEST( operator!=(s1
, s2
));
2680 BOOST_TEST( operator!=(s1
, v2
));
2681 BOOST_TEST( operator!=(s1
, c2
));
2682 BOOST_TEST( operator>=(s1
, s2
));
2683 BOOST_TEST( operator>=(s1
, v2
));
2684 BOOST_TEST( operator>=(s1
, c2
));
2685 BOOST_TEST( operator> (s1
, s2
));
2686 BOOST_TEST( operator> (s1
, v2
));
2687 BOOST_TEST( operator> (s1
, c2
));
2689 BOOST_TEST( operator< (s2
, s1
));
2690 BOOST_TEST( operator< (s2
, v1
));
2691 BOOST_TEST( operator< (s2
, c1
));
2692 BOOST_TEST( operator<=(s2
, s1
));
2693 BOOST_TEST( operator<=(s2
, v1
));
2694 BOOST_TEST( operator<=(s2
, c1
));
2695 BOOST_TEST( operator!=(s2
, s1
));
2696 BOOST_TEST( operator!=(s2
, v1
));
2697 BOOST_TEST( operator!=(s2
, c1
));
2698 BOOST_TEST(! operator==(s2
, s1
));
2699 BOOST_TEST(! operator==(s2
, v1
));
2700 BOOST_TEST(! operator==(s2
, c1
));
2701 BOOST_TEST(! operator>=(s2
, s1
));
2702 BOOST_TEST(! operator>=(s2
, v1
));
2703 BOOST_TEST(! operator>=(s2
, c1
));
2704 BOOST_TEST(! operator> (s2
, s1
));
2705 BOOST_TEST(! operator> (s2
, v1
));
2706 BOOST_TEST(! operator> (s2
, c1
));
2708 BOOST_TEST( operator< (s2
, s1
));
2709 BOOST_TEST( operator< (v2
, s1
));
2710 BOOST_TEST( operator< (c2
, s1
));
2711 BOOST_TEST( operator<=(s2
, s1
));
2712 BOOST_TEST( operator<=(v2
, s1
));
2713 BOOST_TEST( operator<=(c2
, s1
));
2714 BOOST_TEST( operator!=(s2
, s1
));
2715 BOOST_TEST( operator!=(v2
, s1
));
2716 BOOST_TEST( operator!=(c2
, s1
));
2717 BOOST_TEST(! operator==(s2
, s1
));
2718 BOOST_TEST(! operator==(v2
, s1
));
2719 BOOST_TEST(! operator==(c2
, s1
));
2720 BOOST_TEST(! operator>=(s2
, s1
));
2721 BOOST_TEST(! operator>=(v2
, s1
));
2722 BOOST_TEST(! operator>=(c2
, s1
));
2723 BOOST_TEST(! operator> (s2
, s1
));
2724 BOOST_TEST(! operator> (v2
, s1
));
2725 BOOST_TEST(! operator> (c2
, s1
));
2727 BOOST_TEST(! operator< (s1
, s2
));
2728 BOOST_TEST(! operator< (v1
, s2
));
2729 BOOST_TEST(! operator< (c1
, s2
));
2730 BOOST_TEST(! operator<=(s1
, s2
));
2731 BOOST_TEST(! operator<=(v1
, s2
));
2732 BOOST_TEST(! operator<=(c1
, s2
));
2733 BOOST_TEST(! operator==(s1
, s2
));
2734 BOOST_TEST(! operator==(v1
, s2
));
2735 BOOST_TEST(! operator==(c1
, s2
));
2736 BOOST_TEST( operator!=(s1
, s2
));
2737 BOOST_TEST( operator!=(v1
, s2
));
2738 BOOST_TEST( operator!=(c1
, s2
));
2739 BOOST_TEST( operator>=(s1
, s2
));
2740 BOOST_TEST( operator>=(v1
, s2
));
2741 BOOST_TEST( operator>=(c1
, s2
));
2742 BOOST_TEST( operator> (s1
, s2
));
2743 BOOST_TEST( operator> (v1
, s2
));
2744 BOOST_TEST( operator> (c1
, s2
));
2750 // libstdc++ 4.8 bug
2751 #if !defined(__GNUC__) || (__GNUC__ > 4 || \
2752 (__GNUC__ == 4 && __GNUC_MINOR__ > 8))
2754 std::unordered_set
<string
> us
;
2755 us
.emplace("first");
2756 us
.emplace("second");
2759 std::unordered_set
<string
>(
2761 std::hash
<string
>(32));
2765 std::hash
<string
> h1(32);
2766 std::hash
<string
> h2(h1
);
2767 std::hash
<string
> h3(59);
2781 testElementAccess();
2792 testStartEndsWith();
2802 testFindFirstNotOf();
2804 testFindLastNotOf();
2812 TEST_SUITE(string_test
, "boost.json.string");