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