1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // <string>
10
11 // template<class InputIterator>
12 // basic_string&
13 // replace(const_iterator i1, const_iterator i2, InputIterator j1, InputIterator j2); // constexpr since C++20
14
15 #include <string>
16 #include <iterator>
17 #include <cassert>
18
19 #include "test_macros.h"
20 #include "min_allocator.h"
21 #include "test_iterators.h"
22
23 template <class S, class It>
24 TEST_CONSTEXPR_CXX20 void
test(S s,typename S::size_type pos1,typename S::size_type n1,It f,It l,S expected)25 test(S s, typename S::size_type pos1, typename S::size_type n1, It f, It l, S expected)
26 {
27 typename S::size_type old_size = s.size();
28 typename S::const_iterator first = s.begin() + pos1;
29 typename S::const_iterator last = s.begin() + pos1 + n1;
30 typename S::size_type xlen = last - first;
31 s.replace(first, last, f, l);
32 LIBCPP_ASSERT(s.__invariants());
33 assert(s == expected);
34 typename S::size_type rlen = std::distance(f, l);
35 assert(s.size() == old_size - xlen + rlen);
36 }
37
38 #ifndef TEST_HAS_NO_EXCEPTIONS
operator charWidget39 struct Widget { operator char() const { throw 42; } };
40
41 template <class S, class It>
42 TEST_CONSTEXPR_CXX20 void
test_exceptions(S s,typename S::size_type pos1,typename S::size_type n1,It f,It l)43 test_exceptions(S s, typename S::size_type pos1, typename S::size_type n1, It f, It l)
44 {
45 typename S::const_iterator first = s.begin() + pos1;
46 typename S::const_iterator last = s.begin() + pos1 + n1;
47
48 S original = s;
49 typename S::iterator begin = s.begin();
50 typename S::iterator end = s.end();
51
52 try {
53 s.replace(first, last, f, l);
54 assert(false);
55 } catch (...) {}
56
57 // Part of "no effects" is that iterators and pointers
58 // into the string must not have been invalidated.
59 LIBCPP_ASSERT(s.__invariants());
60 assert(s == original);
61 assert(s.begin() == begin);
62 assert(s.end() == end);
63 }
64 #endif
65
66 TEST_CONSTEXPR const char* str = "12345678901234567890";
67
68 template <class S>
test0()69 TEST_CONSTEXPR_CXX20 bool test0()
70 {
71 test(S(""), 0, 0, str, str+0, S(""));
72 test(S(""), 0, 0, str, str+0, S(""));
73 test(S(""), 0, 0, str, str+1, S("1"));
74 test(S(""), 0, 0, str, str+2, S("12"));
75 test(S(""), 0, 0, str, str+4, S("1234"));
76 test(S(""), 0, 0, str, str+5, S("12345"));
77 test(S(""), 0, 0, str, str+0, S(""));
78 test(S(""), 0, 0, str, str+1, S("1"));
79 test(S(""), 0, 0, str, str+5, S("12345"));
80 test(S(""), 0, 0, str, str+9, S("123456789"));
81 test(S(""), 0, 0, str, str+10, S("1234567890"));
82 test(S(""), 0, 0, str, str+0, S(""));
83 test(S(""), 0, 0, str, str+1, S("1"));
84 test(S(""), 0, 0, str, str+10, S("1234567890"));
85 test(S(""), 0, 0, str, str+19, S("1234567890123456789"));
86 test(S(""), 0, 0, str, str+20, S("12345678901234567890"));
87 test(S("abcde"), 0, 0, str, str+0, S("abcde"));
88 test(S("abcde"), 0, 0, str, str+0, S("abcde"));
89 test(S("abcde"), 0, 0, str, str+1, S("1abcde"));
90 test(S("abcde"), 0, 0, str, str+2, S("12abcde"));
91 test(S("abcde"), 0, 0, str, str+4, S("1234abcde"));
92 test(S("abcde"), 0, 0, str, str+5, S("12345abcde"));
93 test(S("abcde"), 0, 0, str, str+0, S("abcde"));
94 test(S("abcde"), 0, 0, str, str+1, S("1abcde"));
95 test(S("abcde"), 0, 0, str, str+5, S("12345abcde"));
96 test(S("abcde"), 0, 0, str, str+9, S("123456789abcde"));
97 test(S("abcde"), 0, 0, str, str+10, S("1234567890abcde"));
98 test(S("abcde"), 0, 0, str, str+0, S("abcde"));
99 test(S("abcde"), 0, 0, str, str+1, S("1abcde"));
100 test(S("abcde"), 0, 0, str, str+10, S("1234567890abcde"));
101 test(S("abcde"), 0, 0, str, str+19, S("1234567890123456789abcde"));
102 test(S("abcde"), 0, 0, str, str+20, S("12345678901234567890abcde"));
103 test(S("abcde"), 0, 1, str, str+0, S("bcde"));
104 test(S("abcde"), 0, 1, str, str+0, S("bcde"));
105 test(S("abcde"), 0, 1, str, str+1, S("1bcde"));
106 test(S("abcde"), 0, 1, str, str+2, S("12bcde"));
107 test(S("abcde"), 0, 1, str, str+4, S("1234bcde"));
108 test(S("abcde"), 0, 1, str, str+5, S("12345bcde"));
109 test(S("abcde"), 0, 1, str, str+0, S("bcde"));
110 test(S("abcde"), 0, 1, str, str+1, S("1bcde"));
111 test(S("abcde"), 0, 1, str, str+5, S("12345bcde"));
112 test(S("abcde"), 0, 1, str, str+9, S("123456789bcde"));
113 test(S("abcde"), 0, 1, str, str+10, S("1234567890bcde"));
114 test(S("abcde"), 0, 1, str, str+0, S("bcde"));
115 test(S("abcde"), 0, 1, str, str+1, S("1bcde"));
116 test(S("abcde"), 0, 1, str, str+10, S("1234567890bcde"));
117 test(S("abcde"), 0, 1, str, str+19, S("1234567890123456789bcde"));
118 test(S("abcde"), 0, 1, str, str+20, S("12345678901234567890bcde"));
119 test(S("abcde"), 0, 2, str, str+0, S("cde"));
120 test(S("abcde"), 0, 2, str, str+0, S("cde"));
121 test(S("abcde"), 0, 2, str, str+1, S("1cde"));
122 test(S("abcde"), 0, 2, str, str+2, S("12cde"));
123 test(S("abcde"), 0, 2, str, str+4, S("1234cde"));
124 test(S("abcde"), 0, 2, str, str+5, S("12345cde"));
125 test(S("abcde"), 0, 2, str, str+0, S("cde"));
126 test(S("abcde"), 0, 2, str, str+1, S("1cde"));
127 test(S("abcde"), 0, 2, str, str+5, S("12345cde"));
128 test(S("abcde"), 0, 2, str, str+9, S("123456789cde"));
129 test(S("abcde"), 0, 2, str, str+10, S("1234567890cde"));
130 test(S("abcde"), 0, 2, str, str+0, S("cde"));
131 test(S("abcde"), 0, 2, str, str+1, S("1cde"));
132 test(S("abcde"), 0, 2, str, str+10, S("1234567890cde"));
133 test(S("abcde"), 0, 2, str, str+19, S("1234567890123456789cde"));
134 test(S("abcde"), 0, 2, str, str+20, S("12345678901234567890cde"));
135 test(S("abcde"), 0, 4, str, str+0, S("e"));
136 test(S("abcde"), 0, 4, str, str+0, S("e"));
137 test(S("abcde"), 0, 4, str, str+1, S("1e"));
138 test(S("abcde"), 0, 4, str, str+2, S("12e"));
139 test(S("abcde"), 0, 4, str, str+4, S("1234e"));
140 test(S("abcde"), 0, 4, str, str+5, S("12345e"));
141 test(S("abcde"), 0, 4, str, str+0, S("e"));
142 test(S("abcde"), 0, 4, str, str+1, S("1e"));
143 test(S("abcde"), 0, 4, str, str+5, S("12345e"));
144 test(S("abcde"), 0, 4, str, str+9, S("123456789e"));
145 test(S("abcde"), 0, 4, str, str+10, S("1234567890e"));
146 test(S("abcde"), 0, 4, str, str+0, S("e"));
147 test(S("abcde"), 0, 4, str, str+1, S("1e"));
148 test(S("abcde"), 0, 4, str, str+10, S("1234567890e"));
149 test(S("abcde"), 0, 4, str, str+19, S("1234567890123456789e"));
150 test(S("abcde"), 0, 4, str, str+20, S("12345678901234567890e"));
151 test(S("abcde"), 0, 5, str, str+0, S(""));
152 test(S("abcde"), 0, 5, str, str+0, S(""));
153 test(S("abcde"), 0, 5, str, str+1, S("1"));
154 test(S("abcde"), 0, 5, str, str+2, S("12"));
155 test(S("abcde"), 0, 5, str, str+4, S("1234"));
156 test(S("abcde"), 0, 5, str, str+5, S("12345"));
157 test(S("abcde"), 0, 5, str, str+0, S(""));
158 test(S("abcde"), 0, 5, str, str+1, S("1"));
159 test(S("abcde"), 0, 5, str, str+5, S("12345"));
160 test(S("abcde"), 0, 5, str, str+9, S("123456789"));
161 test(S("abcde"), 0, 5, str, str+10, S("1234567890"));
162 test(S("abcde"), 0, 5, str, str+0, S(""));
163 test(S("abcde"), 0, 5, str, str+1, S("1"));
164 test(S("abcde"), 0, 5, str, str+10, S("1234567890"));
165 test(S("abcde"), 0, 5, str, str+19, S("1234567890123456789"));
166 test(S("abcde"), 0, 5, str, str+20, S("12345678901234567890"));
167 test(S("abcde"), 1, 0, str, str+0, S("abcde"));
168 test(S("abcde"), 1, 0, str, str+0, S("abcde"));
169 test(S("abcde"), 1, 0, str, str+1, S("a1bcde"));
170 test(S("abcde"), 1, 0, str, str+2, S("a12bcde"));
171
172 return true;
173 }
174
175 template <class S>
test1()176 TEST_CONSTEXPR_CXX20 bool test1()
177 {
178 test(S("abcde"), 1, 0, str, str+4, S("a1234bcde"));
179 test(S("abcde"), 1, 0, str, str+5, S("a12345bcde"));
180 test(S("abcde"), 1, 0, str, str+0, S("abcde"));
181 test(S("abcde"), 1, 0, str, str+1, S("a1bcde"));
182 test(S("abcde"), 1, 0, str, str+5, S("a12345bcde"));
183 test(S("abcde"), 1, 0, str, str+9, S("a123456789bcde"));
184 test(S("abcde"), 1, 0, str, str+10, S("a1234567890bcde"));
185 test(S("abcde"), 1, 0, str, str+0, S("abcde"));
186 test(S("abcde"), 1, 0, str, str+1, S("a1bcde"));
187 test(S("abcde"), 1, 0, str, str+10, S("a1234567890bcde"));
188 test(S("abcde"), 1, 0, str, str+19, S("a1234567890123456789bcde"));
189 test(S("abcde"), 1, 0, str, str+20, S("a12345678901234567890bcde"));
190 test(S("abcde"), 1, 1, str, str+0, S("acde"));
191 test(S("abcde"), 1, 1, str, str+0, S("acde"));
192 test(S("abcde"), 1, 1, str, str+1, S("a1cde"));
193 test(S("abcde"), 1, 1, str, str+2, S("a12cde"));
194 test(S("abcde"), 1, 1, str, str+4, S("a1234cde"));
195 test(S("abcde"), 1, 1, str, str+5, S("a12345cde"));
196 test(S("abcde"), 1, 1, str, str+0, S("acde"));
197 test(S("abcde"), 1, 1, str, str+1, S("a1cde"));
198 test(S("abcde"), 1, 1, str, str+5, S("a12345cde"));
199 test(S("abcde"), 1, 1, str, str+9, S("a123456789cde"));
200 test(S("abcde"), 1, 1, str, str+10, S("a1234567890cde"));
201 test(S("abcde"), 1, 1, str, str+0, S("acde"));
202 test(S("abcde"), 1, 1, str, str+1, S("a1cde"));
203 test(S("abcde"), 1, 1, str, str+10, S("a1234567890cde"));
204 test(S("abcde"), 1, 1, str, str+19, S("a1234567890123456789cde"));
205 test(S("abcde"), 1, 1, str, str+20, S("a12345678901234567890cde"));
206 test(S("abcde"), 1, 2, str, str+0, S("ade"));
207 test(S("abcde"), 1, 2, str, str+0, S("ade"));
208 test(S("abcde"), 1, 2, str, str+1, S("a1de"));
209 test(S("abcde"), 1, 2, str, str+2, S("a12de"));
210 test(S("abcde"), 1, 2, str, str+4, S("a1234de"));
211 test(S("abcde"), 1, 2, str, str+5, S("a12345de"));
212 test(S("abcde"), 1, 2, str, str+0, S("ade"));
213 test(S("abcde"), 1, 2, str, str+1, S("a1de"));
214 test(S("abcde"), 1, 2, str, str+5, S("a12345de"));
215 test(S("abcde"), 1, 2, str, str+9, S("a123456789de"));
216 test(S("abcde"), 1, 2, str, str+10, S("a1234567890de"));
217 test(S("abcde"), 1, 2, str, str+0, S("ade"));
218 test(S("abcde"), 1, 2, str, str+1, S("a1de"));
219 test(S("abcde"), 1, 2, str, str+10, S("a1234567890de"));
220 test(S("abcde"), 1, 2, str, str+19, S("a1234567890123456789de"));
221 test(S("abcde"), 1, 2, str, str+20, S("a12345678901234567890de"));
222 test(S("abcde"), 1, 3, str, str+0, S("ae"));
223 test(S("abcde"), 1, 3, str, str+0, S("ae"));
224 test(S("abcde"), 1, 3, str, str+1, S("a1e"));
225 test(S("abcde"), 1, 3, str, str+2, S("a12e"));
226 test(S("abcde"), 1, 3, str, str+4, S("a1234e"));
227 test(S("abcde"), 1, 3, str, str+5, S("a12345e"));
228 test(S("abcde"), 1, 3, str, str+0, S("ae"));
229 test(S("abcde"), 1, 3, str, str+1, S("a1e"));
230 test(S("abcde"), 1, 3, str, str+5, S("a12345e"));
231 test(S("abcde"), 1, 3, str, str+9, S("a123456789e"));
232 test(S("abcde"), 1, 3, str, str+10, S("a1234567890e"));
233 test(S("abcde"), 1, 3, str, str+0, S("ae"));
234 test(S("abcde"), 1, 3, str, str+1, S("a1e"));
235 test(S("abcde"), 1, 3, str, str+10, S("a1234567890e"));
236 test(S("abcde"), 1, 3, str, str+19, S("a1234567890123456789e"));
237 test(S("abcde"), 1, 3, str, str+20, S("a12345678901234567890e"));
238 test(S("abcde"), 1, 4, str, str+0, S("a"));
239 test(S("abcde"), 1, 4, str, str+0, S("a"));
240 test(S("abcde"), 1, 4, str, str+1, S("a1"));
241 test(S("abcde"), 1, 4, str, str+2, S("a12"));
242 test(S("abcde"), 1, 4, str, str+4, S("a1234"));
243 test(S("abcde"), 1, 4, str, str+5, S("a12345"));
244 test(S("abcde"), 1, 4, str, str+0, S("a"));
245 test(S("abcde"), 1, 4, str, str+1, S("a1"));
246 test(S("abcde"), 1, 4, str, str+5, S("a12345"));
247 test(S("abcde"), 1, 4, str, str+9, S("a123456789"));
248 test(S("abcde"), 1, 4, str, str+10, S("a1234567890"));
249 test(S("abcde"), 1, 4, str, str+0, S("a"));
250 test(S("abcde"), 1, 4, str, str+1, S("a1"));
251 test(S("abcde"), 1, 4, str, str+10, S("a1234567890"));
252 test(S("abcde"), 1, 4, str, str+19, S("a1234567890123456789"));
253 test(S("abcde"), 1, 4, str, str+20, S("a12345678901234567890"));
254 test(S("abcde"), 2, 0, str, str+0, S("abcde"));
255 test(S("abcde"), 2, 0, str, str+0, S("abcde"));
256 test(S("abcde"), 2, 0, str, str+1, S("ab1cde"));
257 test(S("abcde"), 2, 0, str, str+2, S("ab12cde"));
258 test(S("abcde"), 2, 0, str, str+4, S("ab1234cde"));
259 test(S("abcde"), 2, 0, str, str+5, S("ab12345cde"));
260 test(S("abcde"), 2, 0, str, str+0, S("abcde"));
261 test(S("abcde"), 2, 0, str, str+1, S("ab1cde"));
262 test(S("abcde"), 2, 0, str, str+5, S("ab12345cde"));
263 test(S("abcde"), 2, 0, str, str+9, S("ab123456789cde"));
264 test(S("abcde"), 2, 0, str, str+10, S("ab1234567890cde"));
265 test(S("abcde"), 2, 0, str, str+0, S("abcde"));
266 test(S("abcde"), 2, 0, str, str+1, S("ab1cde"));
267 test(S("abcde"), 2, 0, str, str+10, S("ab1234567890cde"));
268 test(S("abcde"), 2, 0, str, str+19, S("ab1234567890123456789cde"));
269 test(S("abcde"), 2, 0, str, str+20, S("ab12345678901234567890cde"));
270 test(S("abcde"), 2, 1, str, str+0, S("abde"));
271 test(S("abcde"), 2, 1, str, str+0, S("abde"));
272 test(S("abcde"), 2, 1, str, str+1, S("ab1de"));
273 test(S("abcde"), 2, 1, str, str+2, S("ab12de"));
274 test(S("abcde"), 2, 1, str, str+4, S("ab1234de"));
275 test(S("abcde"), 2, 1, str, str+5, S("ab12345de"));
276 test(S("abcde"), 2, 1, str, str+0, S("abde"));
277 test(S("abcde"), 2, 1, str, str+1, S("ab1de"));
278
279 return true;
280 }
281
282 template <class S>
test2()283 TEST_CONSTEXPR_CXX20 bool test2()
284 {
285 test(S("abcde"), 2, 1, str, str+5, S("ab12345de"));
286 test(S("abcde"), 2, 1, str, str+9, S("ab123456789de"));
287 test(S("abcde"), 2, 1, str, str+10, S("ab1234567890de"));
288 test(S("abcde"), 2, 1, str, str+0, S("abde"));
289 test(S("abcde"), 2, 1, str, str+1, S("ab1de"));
290 test(S("abcde"), 2, 1, str, str+10, S("ab1234567890de"));
291 test(S("abcde"), 2, 1, str, str+19, S("ab1234567890123456789de"));
292 test(S("abcde"), 2, 1, str, str+20, S("ab12345678901234567890de"));
293 test(S("abcde"), 2, 2, str, str+0, S("abe"));
294 test(S("abcde"), 2, 2, str, str+0, S("abe"));
295 test(S("abcde"), 2, 2, str, str+1, S("ab1e"));
296 test(S("abcde"), 2, 2, str, str+2, S("ab12e"));
297 test(S("abcde"), 2, 2, str, str+4, S("ab1234e"));
298 test(S("abcde"), 2, 2, str, str+5, S("ab12345e"));
299 test(S("abcde"), 2, 2, str, str+0, S("abe"));
300 test(S("abcde"), 2, 2, str, str+1, S("ab1e"));
301 test(S("abcde"), 2, 2, str, str+5, S("ab12345e"));
302 test(S("abcde"), 2, 2, str, str+9, S("ab123456789e"));
303 test(S("abcde"), 2, 2, str, str+10, S("ab1234567890e"));
304 test(S("abcde"), 2, 2, str, str+0, S("abe"));
305 test(S("abcde"), 2, 2, str, str+1, S("ab1e"));
306 test(S("abcde"), 2, 2, str, str+10, S("ab1234567890e"));
307 test(S("abcde"), 2, 2, str, str+19, S("ab1234567890123456789e"));
308 test(S("abcde"), 2, 2, str, str+20, S("ab12345678901234567890e"));
309 test(S("abcde"), 2, 3, str, str+0, S("ab"));
310 test(S("abcde"), 2, 3, str, str+0, S("ab"));
311 test(S("abcde"), 2, 3, str, str+1, S("ab1"));
312 test(S("abcde"), 2, 3, str, str+2, S("ab12"));
313 test(S("abcde"), 2, 3, str, str+4, S("ab1234"));
314 test(S("abcde"), 2, 3, str, str+5, S("ab12345"));
315 test(S("abcde"), 2, 3, str, str+0, S("ab"));
316 test(S("abcde"), 2, 3, str, str+1, S("ab1"));
317 test(S("abcde"), 2, 3, str, str+5, S("ab12345"));
318 test(S("abcde"), 2, 3, str, str+9, S("ab123456789"));
319 test(S("abcde"), 2, 3, str, str+10, S("ab1234567890"));
320 test(S("abcde"), 2, 3, str, str+0, S("ab"));
321 test(S("abcde"), 2, 3, str, str+1, S("ab1"));
322 test(S("abcde"), 2, 3, str, str+10, S("ab1234567890"));
323 test(S("abcde"), 2, 3, str, str+19, S("ab1234567890123456789"));
324 test(S("abcde"), 2, 3, str, str+20, S("ab12345678901234567890"));
325 test(S("abcde"), 4, 0, str, str+0, S("abcde"));
326 test(S("abcde"), 4, 0, str, str+0, S("abcde"));
327 test(S("abcde"), 4, 0, str, str+1, S("abcd1e"));
328 test(S("abcde"), 4, 0, str, str+2, S("abcd12e"));
329 test(S("abcde"), 4, 0, str, str+4, S("abcd1234e"));
330 test(S("abcde"), 4, 0, str, str+5, S("abcd12345e"));
331 test(S("abcde"), 4, 0, str, str+0, S("abcde"));
332 test(S("abcde"), 4, 0, str, str+1, S("abcd1e"));
333 test(S("abcde"), 4, 0, str, str+5, S("abcd12345e"));
334 test(S("abcde"), 4, 0, str, str+9, S("abcd123456789e"));
335 test(S("abcde"), 4, 0, str, str+10, S("abcd1234567890e"));
336 test(S("abcde"), 4, 0, str, str+0, S("abcde"));
337 test(S("abcde"), 4, 0, str, str+1, S("abcd1e"));
338 test(S("abcde"), 4, 0, str, str+10, S("abcd1234567890e"));
339 test(S("abcde"), 4, 0, str, str+19, S("abcd1234567890123456789e"));
340 test(S("abcde"), 4, 0, str, str+20, S("abcd12345678901234567890e"));
341 test(S("abcde"), 4, 1, str, str+0, S("abcd"));
342 test(S("abcde"), 4, 1, str, str+0, S("abcd"));
343 test(S("abcde"), 4, 1, str, str+1, S("abcd1"));
344 test(S("abcde"), 4, 1, str, str+2, S("abcd12"));
345 test(S("abcde"), 4, 1, str, str+4, S("abcd1234"));
346 test(S("abcde"), 4, 1, str, str+5, S("abcd12345"));
347 test(S("abcde"), 4, 1, str, str+0, S("abcd"));
348 test(S("abcde"), 4, 1, str, str+1, S("abcd1"));
349 test(S("abcde"), 4, 1, str, str+5, S("abcd12345"));
350 test(S("abcde"), 4, 1, str, str+9, S("abcd123456789"));
351 test(S("abcde"), 4, 1, str, str+10, S("abcd1234567890"));
352 test(S("abcde"), 4, 1, str, str+0, S("abcd"));
353 test(S("abcde"), 4, 1, str, str+1, S("abcd1"));
354 test(S("abcde"), 4, 1, str, str+10, S("abcd1234567890"));
355 test(S("abcde"), 4, 1, str, str+19, S("abcd1234567890123456789"));
356 test(S("abcde"), 4, 1, str, str+20, S("abcd12345678901234567890"));
357 test(S("abcde"), 5, 0, str, str+0, S("abcde"));
358 test(S("abcde"), 5, 0, str, str+0, S("abcde"));
359 test(S("abcde"), 5, 0, str, str+1, S("abcde1"));
360 test(S("abcde"), 5, 0, str, str+2, S("abcde12"));
361 test(S("abcde"), 5, 0, str, str+4, S("abcde1234"));
362 test(S("abcde"), 5, 0, str, str+5, S("abcde12345"));
363 test(S("abcde"), 5, 0, str, str+0, S("abcde"));
364 test(S("abcde"), 5, 0, str, str+1, S("abcde1"));
365 test(S("abcde"), 5, 0, str, str+5, S("abcde12345"));
366 test(S("abcde"), 5, 0, str, str+9, S("abcde123456789"));
367 test(S("abcde"), 5, 0, str, str+10, S("abcde1234567890"));
368 test(S("abcde"), 5, 0, str, str+0, S("abcde"));
369 test(S("abcde"), 5, 0, str, str+1, S("abcde1"));
370 test(S("abcde"), 5, 0, str, str+10, S("abcde1234567890"));
371 test(S("abcde"), 5, 0, str, str+19, S("abcde1234567890123456789"));
372 test(S("abcde"), 5, 0, str, str+20, S("abcde12345678901234567890"));
373 test(S("abcdefghij"), 0, 0, str, str+0, S("abcdefghij"));
374 test(S("abcdefghij"), 0, 0, str, str+0, S("abcdefghij"));
375 test(S("abcdefghij"), 0, 0, str, str+1, S("1abcdefghij"));
376 test(S("abcdefghij"), 0, 0, str, str+2, S("12abcdefghij"));
377 test(S("abcdefghij"), 0, 0, str, str+4, S("1234abcdefghij"));
378 test(S("abcdefghij"), 0, 0, str, str+5, S("12345abcdefghij"));
379 test(S("abcdefghij"), 0, 0, str, str+0, S("abcdefghij"));
380 test(S("abcdefghij"), 0, 0, str, str+1, S("1abcdefghij"));
381 test(S("abcdefghij"), 0, 0, str, str+5, S("12345abcdefghij"));
382 test(S("abcdefghij"), 0, 0, str, str+9, S("123456789abcdefghij"));
383 test(S("abcdefghij"), 0, 0, str, str+10, S("1234567890abcdefghij"));
384 test(S("abcdefghij"), 0, 0, str, str+0, S("abcdefghij"));
385
386 return true;
387 }
388
389 template <class S>
test3()390 TEST_CONSTEXPR_CXX20 bool test3()
391 {
392 test(S("abcdefghij"), 0, 0, str, str+1, S("1abcdefghij"));
393 test(S("abcdefghij"), 0, 0, str, str+10, S("1234567890abcdefghij"));
394 test(S("abcdefghij"), 0, 0, str, str+19, S("1234567890123456789abcdefghij"));
395 test(S("abcdefghij"), 0, 0, str, str+20, S("12345678901234567890abcdefghij"));
396 test(S("abcdefghij"), 0, 1, str, str+0, S("bcdefghij"));
397 test(S("abcdefghij"), 0, 1, str, str+0, S("bcdefghij"));
398 test(S("abcdefghij"), 0, 1, str, str+1, S("1bcdefghij"));
399 test(S("abcdefghij"), 0, 1, str, str+2, S("12bcdefghij"));
400 test(S("abcdefghij"), 0, 1, str, str+4, S("1234bcdefghij"));
401 test(S("abcdefghij"), 0, 1, str, str+5, S("12345bcdefghij"));
402 test(S("abcdefghij"), 0, 1, str, str+0, S("bcdefghij"));
403 test(S("abcdefghij"), 0, 1, str, str+1, S("1bcdefghij"));
404 test(S("abcdefghij"), 0, 1, str, str+5, S("12345bcdefghij"));
405 test(S("abcdefghij"), 0, 1, str, str+9, S("123456789bcdefghij"));
406 test(S("abcdefghij"), 0, 1, str, str+10, S("1234567890bcdefghij"));
407 test(S("abcdefghij"), 0, 1, str, str+0, S("bcdefghij"));
408 test(S("abcdefghij"), 0, 1, str, str+1, S("1bcdefghij"));
409 test(S("abcdefghij"), 0, 1, str, str+10, S("1234567890bcdefghij"));
410 test(S("abcdefghij"), 0, 1, str, str+19, S("1234567890123456789bcdefghij"));
411 test(S("abcdefghij"), 0, 1, str, str+20, S("12345678901234567890bcdefghij"));
412 test(S("abcdefghij"), 0, 5, str, str+0, S("fghij"));
413 test(S("abcdefghij"), 0, 5, str, str+0, S("fghij"));
414 test(S("abcdefghij"), 0, 5, str, str+1, S("1fghij"));
415 test(S("abcdefghij"), 0, 5, str, str+2, S("12fghij"));
416 test(S("abcdefghij"), 0, 5, str, str+4, S("1234fghij"));
417 test(S("abcdefghij"), 0, 5, str, str+5, S("12345fghij"));
418 test(S("abcdefghij"), 0, 5, str, str+0, S("fghij"));
419 test(S("abcdefghij"), 0, 5, str, str+1, S("1fghij"));
420 test(S("abcdefghij"), 0, 5, str, str+5, S("12345fghij"));
421 test(S("abcdefghij"), 0, 5, str, str+9, S("123456789fghij"));
422 test(S("abcdefghij"), 0, 5, str, str+10, S("1234567890fghij"));
423 test(S("abcdefghij"), 0, 5, str, str+0, S("fghij"));
424 test(S("abcdefghij"), 0, 5, str, str+1, S("1fghij"));
425 test(S("abcdefghij"), 0, 5, str, str+10, S("1234567890fghij"));
426 test(S("abcdefghij"), 0, 5, str, str+19, S("1234567890123456789fghij"));
427 test(S("abcdefghij"), 0, 5, str, str+20, S("12345678901234567890fghij"));
428 test(S("abcdefghij"), 0, 9, str, str+0, S("j"));
429 test(S("abcdefghij"), 0, 9, str, str+0, S("j"));
430 test(S("abcdefghij"), 0, 9, str, str+1, S("1j"));
431 test(S("abcdefghij"), 0, 9, str, str+2, S("12j"));
432 test(S("abcdefghij"), 0, 9, str, str+4, S("1234j"));
433 test(S("abcdefghij"), 0, 9, str, str+5, S("12345j"));
434 test(S("abcdefghij"), 0, 9, str, str+0, S("j"));
435 test(S("abcdefghij"), 0, 9, str, str+1, S("1j"));
436 test(S("abcdefghij"), 0, 9, str, str+5, S("12345j"));
437 test(S("abcdefghij"), 0, 9, str, str+9, S("123456789j"));
438 test(S("abcdefghij"), 0, 9, str, str+10, S("1234567890j"));
439 test(S("abcdefghij"), 0, 9, str, str+0, S("j"));
440 test(S("abcdefghij"), 0, 9, str, str+1, S("1j"));
441 test(S("abcdefghij"), 0, 9, str, str+10, S("1234567890j"));
442 test(S("abcdefghij"), 0, 9, str, str+19, S("1234567890123456789j"));
443 test(S("abcdefghij"), 0, 9, str, str+20, S("12345678901234567890j"));
444 test(S("abcdefghij"), 0, 10, str, str+0, S(""));
445 test(S("abcdefghij"), 0, 10, str, str+0, S(""));
446 test(S("abcdefghij"), 0, 10, str, str+1, S("1"));
447 test(S("abcdefghij"), 0, 10, str, str+2, S("12"));
448 test(S("abcdefghij"), 0, 10, str, str+4, S("1234"));
449 test(S("abcdefghij"), 0, 10, str, str+5, S("12345"));
450 test(S("abcdefghij"), 0, 10, str, str+0, S(""));
451 test(S("abcdefghij"), 0, 10, str, str+1, S("1"));
452 test(S("abcdefghij"), 0, 10, str, str+5, S("12345"));
453 test(S("abcdefghij"), 0, 10, str, str+9, S("123456789"));
454 test(S("abcdefghij"), 0, 10, str, str+10, S("1234567890"));
455 test(S("abcdefghij"), 0, 10, str, str+0, S(""));
456 test(S("abcdefghij"), 0, 10, str, str+1, S("1"));
457 test(S("abcdefghij"), 0, 10, str, str+10, S("1234567890"));
458 test(S("abcdefghij"), 0, 10, str, str+19, S("1234567890123456789"));
459 test(S("abcdefghij"), 0, 10, str, str+20, S("12345678901234567890"));
460 test(S("abcdefghij"), 1, 0, str, str+0, S("abcdefghij"));
461 test(S("abcdefghij"), 1, 0, str, str+0, S("abcdefghij"));
462 test(S("abcdefghij"), 1, 0, str, str+1, S("a1bcdefghij"));
463 test(S("abcdefghij"), 1, 0, str, str+2, S("a12bcdefghij"));
464 test(S("abcdefghij"), 1, 0, str, str+4, S("a1234bcdefghij"));
465 test(S("abcdefghij"), 1, 0, str, str+5, S("a12345bcdefghij"));
466 test(S("abcdefghij"), 1, 0, str, str+0, S("abcdefghij"));
467 test(S("abcdefghij"), 1, 0, str, str+1, S("a1bcdefghij"));
468 test(S("abcdefghij"), 1, 0, str, str+5, S("a12345bcdefghij"));
469 test(S("abcdefghij"), 1, 0, str, str+9, S("a123456789bcdefghij"));
470 test(S("abcdefghij"), 1, 0, str, str+10, S("a1234567890bcdefghij"));
471 test(S("abcdefghij"), 1, 0, str, str+0, S("abcdefghij"));
472 test(S("abcdefghij"), 1, 0, str, str+1, S("a1bcdefghij"));
473 test(S("abcdefghij"), 1, 0, str, str+10, S("a1234567890bcdefghij"));
474 test(S("abcdefghij"), 1, 0, str, str+19, S("a1234567890123456789bcdefghij"));
475 test(S("abcdefghij"), 1, 0, str, str+20, S("a12345678901234567890bcdefghij"));
476 test(S("abcdefghij"), 1, 1, str, str+0, S("acdefghij"));
477 test(S("abcdefghij"), 1, 1, str, str+0, S("acdefghij"));
478 test(S("abcdefghij"), 1, 1, str, str+1, S("a1cdefghij"));
479 test(S("abcdefghij"), 1, 1, str, str+2, S("a12cdefghij"));
480 test(S("abcdefghij"), 1, 1, str, str+4, S("a1234cdefghij"));
481 test(S("abcdefghij"), 1, 1, str, str+5, S("a12345cdefghij"));
482 test(S("abcdefghij"), 1, 1, str, str+0, S("acdefghij"));
483 test(S("abcdefghij"), 1, 1, str, str+1, S("a1cdefghij"));
484 test(S("abcdefghij"), 1, 1, str, str+5, S("a12345cdefghij"));
485 test(S("abcdefghij"), 1, 1, str, str+9, S("a123456789cdefghij"));
486 test(S("abcdefghij"), 1, 1, str, str+10, S("a1234567890cdefghij"));
487 test(S("abcdefghij"), 1, 1, str, str+0, S("acdefghij"));
488 test(S("abcdefghij"), 1, 1, str, str+1, S("a1cdefghij"));
489 test(S("abcdefghij"), 1, 1, str, str+10, S("a1234567890cdefghij"));
490 test(S("abcdefghij"), 1, 1, str, str+19, S("a1234567890123456789cdefghij"));
491 test(S("abcdefghij"), 1, 1, str, str+20, S("a12345678901234567890cdefghij"));
492
493 return true;
494 }
495
496 template <class S>
test4()497 TEST_CONSTEXPR_CXX20 bool test4()
498 {
499 test(S("abcdefghij"), 1, 4, str, str+0, S("afghij"));
500 test(S("abcdefghij"), 1, 4, str, str+0, S("afghij"));
501 test(S("abcdefghij"), 1, 4, str, str+1, S("a1fghij"));
502 test(S("abcdefghij"), 1, 4, str, str+2, S("a12fghij"));
503 test(S("abcdefghij"), 1, 4, str, str+4, S("a1234fghij"));
504 test(S("abcdefghij"), 1, 4, str, str+5, S("a12345fghij"));
505 test(S("abcdefghij"), 1, 4, str, str+0, S("afghij"));
506 test(S("abcdefghij"), 1, 4, str, str+1, S("a1fghij"));
507 test(S("abcdefghij"), 1, 4, str, str+5, S("a12345fghij"));
508 test(S("abcdefghij"), 1, 4, str, str+9, S("a123456789fghij"));
509 test(S("abcdefghij"), 1, 4, str, str+10, S("a1234567890fghij"));
510 test(S("abcdefghij"), 1, 4, str, str+0, S("afghij"));
511 test(S("abcdefghij"), 1, 4, str, str+1, S("a1fghij"));
512 test(S("abcdefghij"), 1, 4, str, str+10, S("a1234567890fghij"));
513 test(S("abcdefghij"), 1, 4, str, str+19, S("a1234567890123456789fghij"));
514 test(S("abcdefghij"), 1, 4, str, str+20, S("a12345678901234567890fghij"));
515 test(S("abcdefghij"), 1, 8, str, str+0, S("aj"));
516 test(S("abcdefghij"), 1, 8, str, str+0, S("aj"));
517 test(S("abcdefghij"), 1, 8, str, str+1, S("a1j"));
518 test(S("abcdefghij"), 1, 8, str, str+2, S("a12j"));
519 test(S("abcdefghij"), 1, 8, str, str+4, S("a1234j"));
520 test(S("abcdefghij"), 1, 8, str, str+5, S("a12345j"));
521 test(S("abcdefghij"), 1, 8, str, str+0, S("aj"));
522 test(S("abcdefghij"), 1, 8, str, str+1, S("a1j"));
523 test(S("abcdefghij"), 1, 8, str, str+5, S("a12345j"));
524 test(S("abcdefghij"), 1, 8, str, str+9, S("a123456789j"));
525 test(S("abcdefghij"), 1, 8, str, str+10, S("a1234567890j"));
526 test(S("abcdefghij"), 1, 8, str, str+0, S("aj"));
527 test(S("abcdefghij"), 1, 8, str, str+1, S("a1j"));
528 test(S("abcdefghij"), 1, 8, str, str+10, S("a1234567890j"));
529 test(S("abcdefghij"), 1, 8, str, str+19, S("a1234567890123456789j"));
530 test(S("abcdefghij"), 1, 8, str, str+20, S("a12345678901234567890j"));
531 test(S("abcdefghij"), 1, 9, str, str+0, S("a"));
532 test(S("abcdefghij"), 1, 9, str, str+0, S("a"));
533 test(S("abcdefghij"), 1, 9, str, str+1, S("a1"));
534 test(S("abcdefghij"), 1, 9, str, str+2, S("a12"));
535 test(S("abcdefghij"), 1, 9, str, str+4, S("a1234"));
536 test(S("abcdefghij"), 1, 9, str, str+5, S("a12345"));
537 test(S("abcdefghij"), 1, 9, str, str+0, S("a"));
538 test(S("abcdefghij"), 1, 9, str, str+1, S("a1"));
539 test(S("abcdefghij"), 1, 9, str, str+5, S("a12345"));
540 test(S("abcdefghij"), 1, 9, str, str+9, S("a123456789"));
541 test(S("abcdefghij"), 1, 9, str, str+10, S("a1234567890"));
542 test(S("abcdefghij"), 1, 9, str, str+0, S("a"));
543 test(S("abcdefghij"), 1, 9, str, str+1, S("a1"));
544 test(S("abcdefghij"), 1, 9, str, str+10, S("a1234567890"));
545 test(S("abcdefghij"), 1, 9, str, str+19, S("a1234567890123456789"));
546 test(S("abcdefghij"), 1, 9, str, str+20, S("a12345678901234567890"));
547 test(S("abcdefghij"), 5, 0, str, str+0, S("abcdefghij"));
548 test(S("abcdefghij"), 5, 0, str, str+0, S("abcdefghij"));
549 test(S("abcdefghij"), 5, 0, str, str+1, S("abcde1fghij"));
550 test(S("abcdefghij"), 5, 0, str, str+2, S("abcde12fghij"));
551 test(S("abcdefghij"), 5, 0, str, str+4, S("abcde1234fghij"));
552 test(S("abcdefghij"), 5, 0, str, str+5, S("abcde12345fghij"));
553 test(S("abcdefghij"), 5, 0, str, str+0, S("abcdefghij"));
554 test(S("abcdefghij"), 5, 0, str, str+1, S("abcde1fghij"));
555 test(S("abcdefghij"), 5, 0, str, str+5, S("abcde12345fghij"));
556 test(S("abcdefghij"), 5, 0, str, str+9, S("abcde123456789fghij"));
557 test(S("abcdefghij"), 5, 0, str, str+10, S("abcde1234567890fghij"));
558 test(S("abcdefghij"), 5, 0, str, str+0, S("abcdefghij"));
559 test(S("abcdefghij"), 5, 0, str, str+1, S("abcde1fghij"));
560 test(S("abcdefghij"), 5, 0, str, str+10, S("abcde1234567890fghij"));
561 test(S("abcdefghij"), 5, 0, str, str+19, S("abcde1234567890123456789fghij"));
562 test(S("abcdefghij"), 5, 0, str, str+20, S("abcde12345678901234567890fghij"));
563 test(S("abcdefghij"), 5, 1, str, str+0, S("abcdeghij"));
564 test(S("abcdefghij"), 5, 1, str, str+0, S("abcdeghij"));
565 test(S("abcdefghij"), 5, 1, str, str+1, S("abcde1ghij"));
566 test(S("abcdefghij"), 5, 1, str, str+2, S("abcde12ghij"));
567 test(S("abcdefghij"), 5, 1, str, str+4, S("abcde1234ghij"));
568 test(S("abcdefghij"), 5, 1, str, str+5, S("abcde12345ghij"));
569 test(S("abcdefghij"), 5, 1, str, str+0, S("abcdeghij"));
570 test(S("abcdefghij"), 5, 1, str, str+1, S("abcde1ghij"));
571 test(S("abcdefghij"), 5, 1, str, str+5, S("abcde12345ghij"));
572 test(S("abcdefghij"), 5, 1, str, str+9, S("abcde123456789ghij"));
573 test(S("abcdefghij"), 5, 1, str, str+10, S("abcde1234567890ghij"));
574 test(S("abcdefghij"), 5, 1, str, str+0, S("abcdeghij"));
575 test(S("abcdefghij"), 5, 1, str, str+1, S("abcde1ghij"));
576 test(S("abcdefghij"), 5, 1, str, str+10, S("abcde1234567890ghij"));
577 test(S("abcdefghij"), 5, 1, str, str+19, S("abcde1234567890123456789ghij"));
578 test(S("abcdefghij"), 5, 1, str, str+20, S("abcde12345678901234567890ghij"));
579 test(S("abcdefghij"), 5, 2, str, str+0, S("abcdehij"));
580 test(S("abcdefghij"), 5, 2, str, str+0, S("abcdehij"));
581 test(S("abcdefghij"), 5, 2, str, str+1, S("abcde1hij"));
582 test(S("abcdefghij"), 5, 2, str, str+2, S("abcde12hij"));
583 test(S("abcdefghij"), 5, 2, str, str+4, S("abcde1234hij"));
584 test(S("abcdefghij"), 5, 2, str, str+5, S("abcde12345hij"));
585 test(S("abcdefghij"), 5, 2, str, str+0, S("abcdehij"));
586 test(S("abcdefghij"), 5, 2, str, str+1, S("abcde1hij"));
587 test(S("abcdefghij"), 5, 2, str, str+5, S("abcde12345hij"));
588 test(S("abcdefghij"), 5, 2, str, str+9, S("abcde123456789hij"));
589 test(S("abcdefghij"), 5, 2, str, str+10, S("abcde1234567890hij"));
590 test(S("abcdefghij"), 5, 2, str, str+0, S("abcdehij"));
591 test(S("abcdefghij"), 5, 2, str, str+1, S("abcde1hij"));
592 test(S("abcdefghij"), 5, 2, str, str+10, S("abcde1234567890hij"));
593 test(S("abcdefghij"), 5, 2, str, str+19, S("abcde1234567890123456789hij"));
594 test(S("abcdefghij"), 5, 2, str, str+20, S("abcde12345678901234567890hij"));
595 test(S("abcdefghij"), 5, 4, str, str+0, S("abcdej"));
596 test(S("abcdefghij"), 5, 4, str, str+0, S("abcdej"));
597 test(S("abcdefghij"), 5, 4, str, str+1, S("abcde1j"));
598 test(S("abcdefghij"), 5, 4, str, str+2, S("abcde12j"));
599
600 return true;
601 }
602
603 template <class S>
test5()604 TEST_CONSTEXPR_CXX20 bool test5()
605 {
606 test(S("abcdefghij"), 5, 4, str, str+4, S("abcde1234j"));
607 test(S("abcdefghij"), 5, 4, str, str+5, S("abcde12345j"));
608 test(S("abcdefghij"), 5, 4, str, str+0, S("abcdej"));
609 test(S("abcdefghij"), 5, 4, str, str+1, S("abcde1j"));
610 test(S("abcdefghij"), 5, 4, str, str+5, S("abcde12345j"));
611 test(S("abcdefghij"), 5, 4, str, str+9, S("abcde123456789j"));
612 test(S("abcdefghij"), 5, 4, str, str+10, S("abcde1234567890j"));
613 test(S("abcdefghij"), 5, 4, str, str+0, S("abcdej"));
614 test(S("abcdefghij"), 5, 4, str, str+1, S("abcde1j"));
615 test(S("abcdefghij"), 5, 4, str, str+10, S("abcde1234567890j"));
616 test(S("abcdefghij"), 5, 4, str, str+19, S("abcde1234567890123456789j"));
617 test(S("abcdefghij"), 5, 4, str, str+20, S("abcde12345678901234567890j"));
618 test(S("abcdefghij"), 5, 5, str, str+0, S("abcde"));
619 test(S("abcdefghij"), 5, 5, str, str+0, S("abcde"));
620 test(S("abcdefghij"), 5, 5, str, str+1, S("abcde1"));
621 test(S("abcdefghij"), 5, 5, str, str+2, S("abcde12"));
622 test(S("abcdefghij"), 5, 5, str, str+4, S("abcde1234"));
623 test(S("abcdefghij"), 5, 5, str, str+5, S("abcde12345"));
624 test(S("abcdefghij"), 5, 5, str, str+0, S("abcde"));
625 test(S("abcdefghij"), 5, 5, str, str+1, S("abcde1"));
626 test(S("abcdefghij"), 5, 5, str, str+5, S("abcde12345"));
627 test(S("abcdefghij"), 5, 5, str, str+9, S("abcde123456789"));
628 test(S("abcdefghij"), 5, 5, str, str+10, S("abcde1234567890"));
629 test(S("abcdefghij"), 5, 5, str, str+0, S("abcde"));
630 test(S("abcdefghij"), 5, 5, str, str+1, S("abcde1"));
631 test(S("abcdefghij"), 5, 5, str, str+10, S("abcde1234567890"));
632 test(S("abcdefghij"), 5, 5, str, str+19, S("abcde1234567890123456789"));
633 test(S("abcdefghij"), 5, 5, str, str+20, S("abcde12345678901234567890"));
634 test(S("abcdefghij"), 9, 0, str, str+0, S("abcdefghij"));
635 test(S("abcdefghij"), 9, 0, str, str+0, S("abcdefghij"));
636 test(S("abcdefghij"), 9, 0, str, str+1, S("abcdefghi1j"));
637 test(S("abcdefghij"), 9, 0, str, str+2, S("abcdefghi12j"));
638 test(S("abcdefghij"), 9, 0, str, str+4, S("abcdefghi1234j"));
639 test(S("abcdefghij"), 9, 0, str, str+5, S("abcdefghi12345j"));
640 test(S("abcdefghij"), 9, 0, str, str+0, S("abcdefghij"));
641 test(S("abcdefghij"), 9, 0, str, str+1, S("abcdefghi1j"));
642 test(S("abcdefghij"), 9, 0, str, str+5, S("abcdefghi12345j"));
643 test(S("abcdefghij"), 9, 0, str, str+9, S("abcdefghi123456789j"));
644 test(S("abcdefghij"), 9, 0, str, str+10, S("abcdefghi1234567890j"));
645 test(S("abcdefghij"), 9, 0, str, str+0, S("abcdefghij"));
646 test(S("abcdefghij"), 9, 0, str, str+1, S("abcdefghi1j"));
647 test(S("abcdefghij"), 9, 0, str, str+10, S("abcdefghi1234567890j"));
648 test(S("abcdefghij"), 9, 0, str, str+19, S("abcdefghi1234567890123456789j"));
649 test(S("abcdefghij"), 9, 0, str, str+20, S("abcdefghi12345678901234567890j"));
650 test(S("abcdefghij"), 9, 1, str, str+0, S("abcdefghi"));
651 test(S("abcdefghij"), 9, 1, str, str+0, S("abcdefghi"));
652 test(S("abcdefghij"), 9, 1, str, str+1, S("abcdefghi1"));
653 test(S("abcdefghij"), 9, 1, str, str+2, S("abcdefghi12"));
654 test(S("abcdefghij"), 9, 1, str, str+4, S("abcdefghi1234"));
655 test(S("abcdefghij"), 9, 1, str, str+5, S("abcdefghi12345"));
656 test(S("abcdefghij"), 9, 1, str, str+0, S("abcdefghi"));
657 test(S("abcdefghij"), 9, 1, str, str+1, S("abcdefghi1"));
658 test(S("abcdefghij"), 9, 1, str, str+5, S("abcdefghi12345"));
659 test(S("abcdefghij"), 9, 1, str, str+9, S("abcdefghi123456789"));
660 test(S("abcdefghij"), 9, 1, str, str+10, S("abcdefghi1234567890"));
661 test(S("abcdefghij"), 9, 1, str, str+0, S("abcdefghi"));
662 test(S("abcdefghij"), 9, 1, str, str+1, S("abcdefghi1"));
663 test(S("abcdefghij"), 9, 1, str, str+10, S("abcdefghi1234567890"));
664 test(S("abcdefghij"), 9, 1, str, str+19, S("abcdefghi1234567890123456789"));
665 test(S("abcdefghij"), 9, 1, str, str+20, S("abcdefghi12345678901234567890"));
666 test(S("abcdefghij"), 10, 0, str, str+0, S("abcdefghij"));
667 test(S("abcdefghij"), 10, 0, str, str+0, S("abcdefghij"));
668 test(S("abcdefghij"), 10, 0, str, str+1, S("abcdefghij1"));
669 test(S("abcdefghij"), 10, 0, str, str+2, S("abcdefghij12"));
670 test(S("abcdefghij"), 10, 0, str, str+4, S("abcdefghij1234"));
671 test(S("abcdefghij"), 10, 0, str, str+5, S("abcdefghij12345"));
672 test(S("abcdefghij"), 10, 0, str, str+0, S("abcdefghij"));
673 test(S("abcdefghij"), 10, 0, str, str+1, S("abcdefghij1"));
674 test(S("abcdefghij"), 10, 0, str, str+5, S("abcdefghij12345"));
675 test(S("abcdefghij"), 10, 0, str, str+9, S("abcdefghij123456789"));
676 test(S("abcdefghij"), 10, 0, str, str+10, S("abcdefghij1234567890"));
677 test(S("abcdefghij"), 10, 0, str, str+0, S("abcdefghij"));
678 test(S("abcdefghij"), 10, 0, str, str+1, S("abcdefghij1"));
679 test(S("abcdefghij"), 10, 0, str, str+10, S("abcdefghij1234567890"));
680 test(S("abcdefghij"), 10, 0, str, str+19, S("abcdefghij1234567890123456789"));
681 test(S("abcdefghij"), 10, 0, str, str+20, S("abcdefghij12345678901234567890"));
682 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+0, S("abcdefghijklmnopqrst"));
683 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+0, S("abcdefghijklmnopqrst"));
684 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+1, S("1abcdefghijklmnopqrst"));
685 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+2, S("12abcdefghijklmnopqrst"));
686 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+4, S("1234abcdefghijklmnopqrst"));
687 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+5, S("12345abcdefghijklmnopqrst"));
688 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+0, S("abcdefghijklmnopqrst"));
689 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+1, S("1abcdefghijklmnopqrst"));
690 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+5, S("12345abcdefghijklmnopqrst"));
691 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+9, S("123456789abcdefghijklmnopqrst"));
692 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+10, S("1234567890abcdefghijklmnopqrst"));
693 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+0, S("abcdefghijklmnopqrst"));
694 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+1, S("1abcdefghijklmnopqrst"));
695 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+10, S("1234567890abcdefghijklmnopqrst"));
696 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+19, S("1234567890123456789abcdefghijklmnopqrst"));
697 test(S("abcdefghijklmnopqrst"), 0, 0, str, str+20, S("12345678901234567890abcdefghijklmnopqrst"));
698 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+0, S("bcdefghijklmnopqrst"));
699 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+0, S("bcdefghijklmnopqrst"));
700 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+1, S("1bcdefghijklmnopqrst"));
701 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+2, S("12bcdefghijklmnopqrst"));
702 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+4, S("1234bcdefghijklmnopqrst"));
703 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+5, S("12345bcdefghijklmnopqrst"));
704 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+0, S("bcdefghijklmnopqrst"));
705 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+1, S("1bcdefghijklmnopqrst"));
706
707 return true;
708 }
709
710 template <class S>
test6()711 TEST_CONSTEXPR_CXX20 bool test6()
712 {
713 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+5, S("12345bcdefghijklmnopqrst"));
714 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+9, S("123456789bcdefghijklmnopqrst"));
715 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+10, S("1234567890bcdefghijklmnopqrst"));
716 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+0, S("bcdefghijklmnopqrst"));
717 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+1, S("1bcdefghijklmnopqrst"));
718 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+10, S("1234567890bcdefghijklmnopqrst"));
719 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+19, S("1234567890123456789bcdefghijklmnopqrst"));
720 test(S("abcdefghijklmnopqrst"), 0, 1, str, str+20, S("12345678901234567890bcdefghijklmnopqrst"));
721 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+0, S("klmnopqrst"));
722 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+0, S("klmnopqrst"));
723 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+1, S("1klmnopqrst"));
724 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+2, S("12klmnopqrst"));
725 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+4, S("1234klmnopqrst"));
726 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+5, S("12345klmnopqrst"));
727 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+0, S("klmnopqrst"));
728 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+1, S("1klmnopqrst"));
729 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+5, S("12345klmnopqrst"));
730 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+9, S("123456789klmnopqrst"));
731 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+10, S("1234567890klmnopqrst"));
732 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+0, S("klmnopqrst"));
733 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+1, S("1klmnopqrst"));
734 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+10, S("1234567890klmnopqrst"));
735 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+19, S("1234567890123456789klmnopqrst"));
736 test(S("abcdefghijklmnopqrst"), 0, 10, str, str+20, S("12345678901234567890klmnopqrst"));
737 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+0, S("t"));
738 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+0, S("t"));
739 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+1, S("1t"));
740 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+2, S("12t"));
741 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+4, S("1234t"));
742 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+5, S("12345t"));
743 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+0, S("t"));
744 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+1, S("1t"));
745 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+5, S("12345t"));
746 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+9, S("123456789t"));
747 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+10, S("1234567890t"));
748 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+0, S("t"));
749 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+1, S("1t"));
750 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+10, S("1234567890t"));
751 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+19, S("1234567890123456789t"));
752 test(S("abcdefghijklmnopqrst"), 0, 19, str, str+20, S("12345678901234567890t"));
753 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+0, S(""));
754 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+0, S(""));
755 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+1, S("1"));
756 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+2, S("12"));
757 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+4, S("1234"));
758 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+5, S("12345"));
759 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+0, S(""));
760 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+1, S("1"));
761 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+5, S("12345"));
762 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+9, S("123456789"));
763 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+10, S("1234567890"));
764 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+0, S(""));
765 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+1, S("1"));
766 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+10, S("1234567890"));
767 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+19, S("1234567890123456789"));
768 test(S("abcdefghijklmnopqrst"), 0, 20, str, str+20, S("12345678901234567890"));
769 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+0, S("abcdefghijklmnopqrst"));
770 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+0, S("abcdefghijklmnopqrst"));
771 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+1, S("a1bcdefghijklmnopqrst"));
772 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+2, S("a12bcdefghijklmnopqrst"));
773 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+4, S("a1234bcdefghijklmnopqrst"));
774 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+5, S("a12345bcdefghijklmnopqrst"));
775 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+0, S("abcdefghijklmnopqrst"));
776 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+1, S("a1bcdefghijklmnopqrst"));
777 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+5, S("a12345bcdefghijklmnopqrst"));
778 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+9, S("a123456789bcdefghijklmnopqrst"));
779 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+10, S("a1234567890bcdefghijklmnopqrst"));
780 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+0, S("abcdefghijklmnopqrst"));
781 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+1, S("a1bcdefghijklmnopqrst"));
782 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+10, S("a1234567890bcdefghijklmnopqrst"));
783 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+19, S("a1234567890123456789bcdefghijklmnopqrst"));
784 test(S("abcdefghijklmnopqrst"), 1, 0, str, str+20, S("a12345678901234567890bcdefghijklmnopqrst"));
785 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+0, S("acdefghijklmnopqrst"));
786 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+0, S("acdefghijklmnopqrst"));
787 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+1, S("a1cdefghijklmnopqrst"));
788 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+2, S("a12cdefghijklmnopqrst"));
789 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+4, S("a1234cdefghijklmnopqrst"));
790 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+5, S("a12345cdefghijklmnopqrst"));
791 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+0, S("acdefghijklmnopqrst"));
792 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+1, S("a1cdefghijklmnopqrst"));
793 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+5, S("a12345cdefghijklmnopqrst"));
794 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+9, S("a123456789cdefghijklmnopqrst"));
795 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+10, S("a1234567890cdefghijklmnopqrst"));
796 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+0, S("acdefghijklmnopqrst"));
797 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+1, S("a1cdefghijklmnopqrst"));
798 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+10, S("a1234567890cdefghijklmnopqrst"));
799 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+19, S("a1234567890123456789cdefghijklmnopqrst"));
800 test(S("abcdefghijklmnopqrst"), 1, 1, str, str+20, S("a12345678901234567890cdefghijklmnopqrst"));
801 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+0, S("aklmnopqrst"));
802 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+0, S("aklmnopqrst"));
803 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+1, S("a1klmnopqrst"));
804 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+2, S("a12klmnopqrst"));
805 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+4, S("a1234klmnopqrst"));
806 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+5, S("a12345klmnopqrst"));
807 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+0, S("aklmnopqrst"));
808 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+1, S("a1klmnopqrst"));
809 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+5, S("a12345klmnopqrst"));
810 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+9, S("a123456789klmnopqrst"));
811 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+10, S("a1234567890klmnopqrst"));
812 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+0, S("aklmnopqrst"));
813
814 return true;
815 }
816
817 template <class S>
test7()818 TEST_CONSTEXPR_CXX20 bool test7()
819 {
820 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+1, S("a1klmnopqrst"));
821 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+10, S("a1234567890klmnopqrst"));
822 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+19, S("a1234567890123456789klmnopqrst"));
823 test(S("abcdefghijklmnopqrst"), 1, 9, str, str+20, S("a12345678901234567890klmnopqrst"));
824 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+0, S("at"));
825 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+0, S("at"));
826 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+1, S("a1t"));
827 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+2, S("a12t"));
828 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+4, S("a1234t"));
829 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+5, S("a12345t"));
830 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+0, S("at"));
831 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+1, S("a1t"));
832 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+5, S("a12345t"));
833 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+9, S("a123456789t"));
834 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+10, S("a1234567890t"));
835 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+0, S("at"));
836 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+1, S("a1t"));
837 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+10, S("a1234567890t"));
838 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+19, S("a1234567890123456789t"));
839 test(S("abcdefghijklmnopqrst"), 1, 18, str, str+20, S("a12345678901234567890t"));
840 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+0, S("a"));
841 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+0, S("a"));
842 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+1, S("a1"));
843 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+2, S("a12"));
844 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+4, S("a1234"));
845 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+5, S("a12345"));
846 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+0, S("a"));
847 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+1, S("a1"));
848 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+5, S("a12345"));
849 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+9, S("a123456789"));
850 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+10, S("a1234567890"));
851 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+0, S("a"));
852 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+1, S("a1"));
853 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+10, S("a1234567890"));
854 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+19, S("a1234567890123456789"));
855 test(S("abcdefghijklmnopqrst"), 1, 19, str, str+20, S("a12345678901234567890"));
856 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+0, S("abcdefghijklmnopqrst"));
857 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+0, S("abcdefghijklmnopqrst"));
858 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+1, S("abcdefghij1klmnopqrst"));
859 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+2, S("abcdefghij12klmnopqrst"));
860 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+4, S("abcdefghij1234klmnopqrst"));
861 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+5, S("abcdefghij12345klmnopqrst"));
862 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+0, S("abcdefghijklmnopqrst"));
863 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+1, S("abcdefghij1klmnopqrst"));
864 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+5, S("abcdefghij12345klmnopqrst"));
865 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+9, S("abcdefghij123456789klmnopqrst"));
866 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+10, S("abcdefghij1234567890klmnopqrst"));
867 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+0, S("abcdefghijklmnopqrst"));
868 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+1, S("abcdefghij1klmnopqrst"));
869 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+10, S("abcdefghij1234567890klmnopqrst"));
870 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+19, S("abcdefghij1234567890123456789klmnopqrst"));
871 test(S("abcdefghijklmnopqrst"), 10, 0, str, str+20, S("abcdefghij12345678901234567890klmnopqrst"));
872 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+0, S("abcdefghijlmnopqrst"));
873 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+0, S("abcdefghijlmnopqrst"));
874 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+1, S("abcdefghij1lmnopqrst"));
875 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+2, S("abcdefghij12lmnopqrst"));
876 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+4, S("abcdefghij1234lmnopqrst"));
877 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+5, S("abcdefghij12345lmnopqrst"));
878 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+0, S("abcdefghijlmnopqrst"));
879 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+1, S("abcdefghij1lmnopqrst"));
880 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+5, S("abcdefghij12345lmnopqrst"));
881 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+9, S("abcdefghij123456789lmnopqrst"));
882 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+10, S("abcdefghij1234567890lmnopqrst"));
883 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+0, S("abcdefghijlmnopqrst"));
884 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+1, S("abcdefghij1lmnopqrst"));
885 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+10, S("abcdefghij1234567890lmnopqrst"));
886 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+19, S("abcdefghij1234567890123456789lmnopqrst"));
887 test(S("abcdefghijklmnopqrst"), 10, 1, str, str+20, S("abcdefghij12345678901234567890lmnopqrst"));
888 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+0, S("abcdefghijpqrst"));
889 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+0, S("abcdefghijpqrst"));
890 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+1, S("abcdefghij1pqrst"));
891 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+2, S("abcdefghij12pqrst"));
892 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+4, S("abcdefghij1234pqrst"));
893 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+5, S("abcdefghij12345pqrst"));
894 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+0, S("abcdefghijpqrst"));
895 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+1, S("abcdefghij1pqrst"));
896 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+5, S("abcdefghij12345pqrst"));
897 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+9, S("abcdefghij123456789pqrst"));
898 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+10, S("abcdefghij1234567890pqrst"));
899 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+0, S("abcdefghijpqrst"));
900 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+1, S("abcdefghij1pqrst"));
901 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+10, S("abcdefghij1234567890pqrst"));
902 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+19, S("abcdefghij1234567890123456789pqrst"));
903 test(S("abcdefghijklmnopqrst"), 10, 5, str, str+20, S("abcdefghij12345678901234567890pqrst"));
904 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+0, S("abcdefghijt"));
905 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+0, S("abcdefghijt"));
906 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+1, S("abcdefghij1t"));
907 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+2, S("abcdefghij12t"));
908 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+4, S("abcdefghij1234t"));
909 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+5, S("abcdefghij12345t"));
910 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+0, S("abcdefghijt"));
911 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+1, S("abcdefghij1t"));
912 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+5, S("abcdefghij12345t"));
913 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+9, S("abcdefghij123456789t"));
914 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+10, S("abcdefghij1234567890t"));
915 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+0, S("abcdefghijt"));
916 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+1, S("abcdefghij1t"));
917 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+10, S("abcdefghij1234567890t"));
918 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+19, S("abcdefghij1234567890123456789t"));
919 test(S("abcdefghijklmnopqrst"), 10, 9, str, str+20, S("abcdefghij12345678901234567890t"));
920
921 return true;
922 }
923
924 template <class S>
test8()925 TEST_CONSTEXPR_CXX20 bool test8()
926 {
927 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+0, S("abcdefghij"));
928 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+0, S("abcdefghij"));
929 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+1, S("abcdefghij1"));
930 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+2, S("abcdefghij12"));
931 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+4, S("abcdefghij1234"));
932 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+5, S("abcdefghij12345"));
933 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+0, S("abcdefghij"));
934 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+1, S("abcdefghij1"));
935 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+5, S("abcdefghij12345"));
936 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+9, S("abcdefghij123456789"));
937 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+10, S("abcdefghij1234567890"));
938 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+0, S("abcdefghij"));
939 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+1, S("abcdefghij1"));
940 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+10, S("abcdefghij1234567890"));
941 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+19, S("abcdefghij1234567890123456789"));
942 test(S("abcdefghijklmnopqrst"), 10, 10, str, str+20, S("abcdefghij12345678901234567890"));
943 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+0, S("abcdefghijklmnopqrst"));
944 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+0, S("abcdefghijklmnopqrst"));
945 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+1, S("abcdefghijklmnopqrs1t"));
946 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+2, S("abcdefghijklmnopqrs12t"));
947 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+4, S("abcdefghijklmnopqrs1234t"));
948 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+5, S("abcdefghijklmnopqrs12345t"));
949 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+0, S("abcdefghijklmnopqrst"));
950 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+1, S("abcdefghijklmnopqrs1t"));
951 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+5, S("abcdefghijklmnopqrs12345t"));
952 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+9, S("abcdefghijklmnopqrs123456789t"));
953 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+10, S("abcdefghijklmnopqrs1234567890t"));
954 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+0, S("abcdefghijklmnopqrst"));
955 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+1, S("abcdefghijklmnopqrs1t"));
956 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+10, S("abcdefghijklmnopqrs1234567890t"));
957 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+19, S("abcdefghijklmnopqrs1234567890123456789t"));
958 test(S("abcdefghijklmnopqrst"), 19, 0, str, str+20, S("abcdefghijklmnopqrs12345678901234567890t"));
959 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+0, S("abcdefghijklmnopqrs"));
960 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+0, S("abcdefghijklmnopqrs"));
961 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+1, S("abcdefghijklmnopqrs1"));
962 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+2, S("abcdefghijklmnopqrs12"));
963 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+4, S("abcdefghijklmnopqrs1234"));
964 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+5, S("abcdefghijklmnopqrs12345"));
965 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+0, S("abcdefghijklmnopqrs"));
966 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+1, S("abcdefghijklmnopqrs1"));
967 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+5, S("abcdefghijklmnopqrs12345"));
968 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+9, S("abcdefghijklmnopqrs123456789"));
969 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+10, S("abcdefghijklmnopqrs1234567890"));
970 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+0, S("abcdefghijklmnopqrs"));
971 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+1, S("abcdefghijklmnopqrs1"));
972 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+10, S("abcdefghijklmnopqrs1234567890"));
973 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+19, S("abcdefghijklmnopqrs1234567890123456789"));
974 test(S("abcdefghijklmnopqrst"), 19, 1, str, str+20, S("abcdefghijklmnopqrs12345678901234567890"));
975 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+0, S("abcdefghijklmnopqrst"));
976 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+0, S("abcdefghijklmnopqrst"));
977 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+1, S("abcdefghijklmnopqrst1"));
978 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+2, S("abcdefghijklmnopqrst12"));
979 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+4, S("abcdefghijklmnopqrst1234"));
980 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+5, S("abcdefghijklmnopqrst12345"));
981 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+0, S("abcdefghijklmnopqrst"));
982 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+1, S("abcdefghijklmnopqrst1"));
983 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+5, S("abcdefghijklmnopqrst12345"));
984 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+9, S("abcdefghijklmnopqrst123456789"));
985 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+10, S("abcdefghijklmnopqrst1234567890"));
986 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+0, S("abcdefghijklmnopqrst"));
987 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+1, S("abcdefghijklmnopqrst1"));
988 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+10, S("abcdefghijklmnopqrst1234567890"));
989 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+19, S("abcdefghijklmnopqrst1234567890123456789"));
990 test(S("abcdefghijklmnopqrst"), 20, 0, str, str+20, S("abcdefghijklmnopqrst12345678901234567890"));
991
992 return true;
993 }
994
995 template <class S>
test9()996 TEST_CONSTEXPR_CXX20 bool test9() {
997 #ifndef TEST_HAS_NO_EXCEPTIONS
998 if (!TEST_IS_CONSTANT_EVALUATED) { // test iterator operations that throw
999 typedef ThrowingIterator<char> TIter;
1000 typedef cpp17_input_iterator<TIter> IIter;
1001 const char* s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
1002 test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 4, TIter::TAIncrement)), IIter(TIter()));
1003 test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 5, TIter::TADereference)), IIter(TIter()));
1004 test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, IIter(TIter(s, s+10, 6, TIter::TAComparison)), IIter(TIter()));
1005
1006 test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, TIter(s, s+10, 4, TIter::TAIncrement), TIter());
1007 test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, TIter(s, s+10, 5, TIter::TADereference), TIter());
1008 test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, TIter(s, s+10, 6, TIter::TAComparison), TIter());
1009
1010 Widget w[100];
1011 test_exceptions(S("abcdefghijklmnopqrst"), 10, 5, w, w+100);
1012 }
1013 #endif
1014
1015 { // test replacing into self
1016 S s_short = "123/";
1017 S s_long = "Lorem ipsum dolor sit amet, consectetur/";
1018
1019 s_short.replace(s_short.begin(), s_short.begin(), s_short.begin(), s_short.end());
1020 assert(s_short == "123/123/");
1021 s_short.replace(s_short.begin(), s_short.begin(), s_short.begin(), s_short.end());
1022 assert(s_short == "123/123/123/123/");
1023 s_short.replace(s_short.begin(), s_short.begin(), s_short.begin(), s_short.end());
1024 assert(s_short == "123/123/123/123/123/123/123/123/");
1025
1026 s_long.replace(s_long.begin(), s_long.begin(), s_long.begin(), s_long.end());
1027 assert(s_long == "Lorem ipsum dolor sit amet, consectetur/Lorem ipsum dolor sit amet, consectetur/");
1028 }
1029
1030 { // test assigning a different type
1031 const uint8_t pc[] = "ABCD";
1032 uint8_t p[] = "EFGH";
1033
1034 S s;
1035 s.replace(s.begin(), s.end(), pc, pc + 4);
1036 assert(s == "ABCD");
1037
1038 s.clear();
1039 s.replace(s.begin(), s.end(), p, p + 4);
1040 assert(s == "EFGH");
1041 }
1042
1043 return true;
1044 }
1045
1046 template <class S>
test()1047 void test() {
1048 test0<S>();
1049 test1<S>();
1050 test2<S>();
1051 test3<S>();
1052 test4<S>();
1053 test5<S>();
1054 test6<S>();
1055 test7<S>();
1056 test8<S>();
1057 test9<S>();
1058
1059 #if TEST_STD_VER > 17
1060 static_assert(test0<S>());
1061 static_assert(test1<S>());
1062 static_assert(test2<S>());
1063 static_assert(test3<S>());
1064 static_assert(test4<S>());
1065 static_assert(test5<S>());
1066 static_assert(test6<S>());
1067 static_assert(test7<S>());
1068 static_assert(test8<S>());
1069 static_assert(test9<S>());
1070 #endif
1071 }
1072
main(int,char **)1073 int main(int, char**)
1074 {
1075 test<std::string>();
1076 #if TEST_STD_VER >= 11
1077 test<std::basic_string<char, std::char_traits<char>, min_allocator<char>>>();
1078 #endif
1079
1080 return 0;
1081 }
1082