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 // basic_string<charT,traits,Allocator>&
12 //   insert(size_type pos1, const basic_string<charT,traits,Allocator>& str,
13 //          size_type pos2, size_type n=npos);
14 // the "=npos" was added in C++14
15 
16 // When back-deploying to macosx10.7, the RTTI for exception classes
17 // incorrectly provided by libc++.dylib is mixed with the one in
18 // libc++abi.dylib and exceptions are not caught properly.
19 // XFAIL: with_system_cxx_lib=macosx10.7
20 
21 #include <string>
22 #include <stdexcept>
23 #include <cassert>
24 
25 #include "test_macros.h"
26 #include "min_allocator.h"
27 
28 template <class S>
29 void
test(S s,typename S::size_type pos1,S str,typename S::size_type pos2,typename S::size_type n,S expected)30 test(S s, typename S::size_type pos1, S str, typename S::size_type pos2,
31      typename S::size_type n, S expected)
32 {
33     const typename S::size_type old_size = s.size();
34     S s0 = s;
35     if (pos1 <= old_size && pos2 <= str.size())
36     {
37         s.insert(pos1, str, pos2, n);
38         LIBCPP_ASSERT(s.__invariants());
39         assert(s == expected);
40     }
41 #ifndef TEST_HAS_NO_EXCEPTIONS
42     else
43     {
44         try
45         {
46             s.insert(pos1, str, pos2, n);
47             assert(false);
48         }
49         catch (std::out_of_range&)
50         {
51             assert(pos1 > old_size || pos2 > str.size());
52             assert(s == s0);
53         }
54     }
55 #endif
56 }
57 
58 template <class S>
59 void
test_npos(S s,typename S::size_type pos1,S str,typename S::size_type pos2,S expected)60 test_npos(S s, typename S::size_type pos1, S str, typename S::size_type pos2, S expected)
61 {
62     const typename S::size_type old_size = s.size();
63     S s0 = s;
64     if (pos1 <= old_size && pos2 <= str.size())
65     {
66         s.insert(pos1, str, pos2);
67         LIBCPP_ASSERT(s.__invariants());
68         assert(s == expected);
69     }
70 #ifndef TEST_HAS_NO_EXCEPTIONS
71     else
72     {
73         try
74         {
75             s.insert(pos1, str, pos2);
76             assert(false);
77         }
78         catch (std::out_of_range&)
79         {
80             assert(pos1 > old_size || pos2 > str.size());
81             assert(s == s0);
82         }
83     }
84 #endif
85 }
86 
87 
88 template <class S>
test0()89 void test0()
90 {
91     test(S(""), 0, S(""), 0, 0, S(""));
92     test(S(""), 0, S(""), 0, 1, S(""));
93     test(S(""), 0, S(""), 1, 0, S("can't happen"));
94     test(S(""), 0, S("12345"), 0, 0, S(""));
95     test(S(""), 0, S("12345"), 0, 1, S("1"));
96     test(S(""), 0, S("12345"), 0, 2, S("12"));
97     test(S(""), 0, S("12345"), 0, 4, S("1234"));
98     test(S(""), 0, S("12345"), 0, 5, S("12345"));
99     test(S(""), 0, S("12345"), 0, 6, S("12345"));
100     test(S(""), 0, S("12345"), 1, 0, S(""));
101     test(S(""), 0, S("12345"), 1, 1, S("2"));
102     test(S(""), 0, S("12345"), 1, 2, S("23"));
103     test(S(""), 0, S("12345"), 1, 3, S("234"));
104     test(S(""), 0, S("12345"), 1, 4, S("2345"));
105     test(S(""), 0, S("12345"), 1, 5, S("2345"));
106     test(S(""), 0, S("12345"), 2, 0, S(""));
107     test(S(""), 0, S("12345"), 2, 1, S("3"));
108     test(S(""), 0, S("12345"), 2, 2, S("34"));
109     test(S(""), 0, S("12345"), 2, 3, S("345"));
110     test(S(""), 0, S("12345"), 2, 4, S("345"));
111     test(S(""), 0, S("12345"), 4, 0, S(""));
112     test(S(""), 0, S("12345"), 4, 1, S("5"));
113     test(S(""), 0, S("12345"), 4, 2, S("5"));
114     test(S(""), 0, S("12345"), 5, 0, S(""));
115     test(S(""), 0, S("12345"), 5, 1, S(""));
116     test(S(""), 0, S("12345"), 6, 0, S("can't happen"));
117     test(S(""), 0, S("1234567890"), 0, 0, S(""));
118     test(S(""), 0, S("1234567890"), 0, 1, S("1"));
119     test(S(""), 0, S("1234567890"), 0, 5, S("12345"));
120     test(S(""), 0, S("1234567890"), 0, 9, S("123456789"));
121     test(S(""), 0, S("1234567890"), 0, 10, S("1234567890"));
122     test(S(""), 0, S("1234567890"), 0, 11, S("1234567890"));
123     test(S(""), 0, S("1234567890"), 1, 0, S(""));
124     test(S(""), 0, S("1234567890"), 1, 1, S("2"));
125     test(S(""), 0, S("1234567890"), 1, 4, S("2345"));
126     test(S(""), 0, S("1234567890"), 1, 8, S("23456789"));
127     test(S(""), 0, S("1234567890"), 1, 9, S("234567890"));
128     test(S(""), 0, S("1234567890"), 1, 10, S("234567890"));
129     test(S(""), 0, S("1234567890"), 5, 0, S(""));
130     test(S(""), 0, S("1234567890"), 5, 1, S("6"));
131     test(S(""), 0, S("1234567890"), 5, 2, S("67"));
132     test(S(""), 0, S("1234567890"), 5, 4, S("6789"));
133     test(S(""), 0, S("1234567890"), 5, 5, S("67890"));
134     test(S(""), 0, S("1234567890"), 5, 6, S("67890"));
135     test(S(""), 0, S("1234567890"), 9, 0, S(""));
136     test(S(""), 0, S("1234567890"), 9, 1, S("0"));
137     test(S(""), 0, S("1234567890"), 9, 2, S("0"));
138     test(S(""), 0, S("1234567890"), 10, 0, S(""));
139     test(S(""), 0, S("1234567890"), 10, 1, S(""));
140     test(S(""), 0, S("1234567890"), 11, 0, S("can't happen"));
141 }
142 
143 template <class S>
test1()144 void test1()
145 {
146     test(S(""), 0, S("12345678901234567890"), 0, 0, S(""));
147     test(S(""), 0, S("12345678901234567890"), 0, 1, S("1"));
148     test(S(""), 0, S("12345678901234567890"), 0, 10, S("1234567890"));
149     test(S(""), 0, S("12345678901234567890"), 0, 19, S("1234567890123456789"));
150     test(S(""), 0, S("12345678901234567890"), 0, 20, S("12345678901234567890"));
151     test(S(""), 0, S("12345678901234567890"), 0, 21, S("12345678901234567890"));
152     test(S(""), 0, S("12345678901234567890"), 1, 0, S(""));
153     test(S(""), 0, S("12345678901234567890"), 1, 1, S("2"));
154     test(S(""), 0, S("12345678901234567890"), 1, 9, S("234567890"));
155     test(S(""), 0, S("12345678901234567890"), 1, 18, S("234567890123456789"));
156     test(S(""), 0, S("12345678901234567890"), 1, 19, S("2345678901234567890"));
157     test(S(""), 0, S("12345678901234567890"), 1, 20, S("2345678901234567890"));
158     test(S(""), 0, S("12345678901234567890"), 10, 0, S(""));
159     test(S(""), 0, S("12345678901234567890"), 10, 1, S("1"));
160     test(S(""), 0, S("12345678901234567890"), 10, 5, S("12345"));
161     test(S(""), 0, S("12345678901234567890"), 10, 9, S("123456789"));
162     test(S(""), 0, S("12345678901234567890"), 10, 10, S("1234567890"));
163     test(S(""), 0, S("12345678901234567890"), 10, 11, S("1234567890"));
164     test(S(""), 0, S("12345678901234567890"), 19, 0, S(""));
165     test(S(""), 0, S("12345678901234567890"), 19, 1, S("0"));
166     test(S(""), 0, S("12345678901234567890"), 19, 2, S("0"));
167     test(S(""), 0, S("12345678901234567890"), 20, 0, S(""));
168     test(S(""), 0, S("12345678901234567890"), 20, 1, S(""));
169     test(S(""), 0, S("12345678901234567890"), 21, 0, S("can't happen"));
170     test(S(""), 1, S(""), 0, 0, S("can't happen"));
171     test(S(""), 1, S(""), 0, 1, S("can't happen"));
172     test(S(""), 1, S(""), 1, 0, S("can't happen"));
173     test(S(""), 1, S("12345"), 0, 0, S("can't happen"));
174     test(S(""), 1, S("12345"), 0, 1, S("can't happen"));
175     test(S(""), 1, S("12345"), 0, 2, S("can't happen"));
176     test(S(""), 1, S("12345"), 0, 4, S("can't happen"));
177     test(S(""), 1, S("12345"), 0, 5, S("can't happen"));
178     test(S(""), 1, S("12345"), 0, 6, S("can't happen"));
179     test(S(""), 1, S("12345"), 1, 0, S("can't happen"));
180     test(S(""), 1, S("12345"), 1, 1, S("can't happen"));
181     test(S(""), 1, S("12345"), 1, 2, S("can't happen"));
182     test(S(""), 1, S("12345"), 1, 3, S("can't happen"));
183     test(S(""), 1, S("12345"), 1, 4, S("can't happen"));
184     test(S(""), 1, S("12345"), 1, 5, S("can't happen"));
185     test(S(""), 1, S("12345"), 2, 0, S("can't happen"));
186     test(S(""), 1, S("12345"), 2, 1, S("can't happen"));
187     test(S(""), 1, S("12345"), 2, 2, S("can't happen"));
188     test(S(""), 1, S("12345"), 2, 3, S("can't happen"));
189     test(S(""), 1, S("12345"), 2, 4, S("can't happen"));
190     test(S(""), 1, S("12345"), 4, 0, S("can't happen"));
191     test(S(""), 1, S("12345"), 4, 1, S("can't happen"));
192     test(S(""), 1, S("12345"), 4, 2, S("can't happen"));
193     test(S(""), 1, S("12345"), 5, 0, S("can't happen"));
194     test(S(""), 1, S("12345"), 5, 1, S("can't happen"));
195     test(S(""), 1, S("12345"), 6, 0, S("can't happen"));
196 }
197 
198 template <class S>
test2()199 void test2()
200 {
201     test(S(""), 1, S("1234567890"), 0, 0, S("can't happen"));
202     test(S(""), 1, S("1234567890"), 0, 1, S("can't happen"));
203     test(S(""), 1, S("1234567890"), 0, 5, S("can't happen"));
204     test(S(""), 1, S("1234567890"), 0, 9, S("can't happen"));
205     test(S(""), 1, S("1234567890"), 0, 10, S("can't happen"));
206     test(S(""), 1, S("1234567890"), 0, 11, S("can't happen"));
207     test(S(""), 1, S("1234567890"), 1, 0, S("can't happen"));
208     test(S(""), 1, S("1234567890"), 1, 1, S("can't happen"));
209     test(S(""), 1, S("1234567890"), 1, 4, S("can't happen"));
210     test(S(""), 1, S("1234567890"), 1, 8, S("can't happen"));
211     test(S(""), 1, S("1234567890"), 1, 9, S("can't happen"));
212     test(S(""), 1, S("1234567890"), 1, 10, S("can't happen"));
213     test(S(""), 1, S("1234567890"), 5, 0, S("can't happen"));
214     test(S(""), 1, S("1234567890"), 5, 1, S("can't happen"));
215     test(S(""), 1, S("1234567890"), 5, 2, S("can't happen"));
216     test(S(""), 1, S("1234567890"), 5, 4, S("can't happen"));
217     test(S(""), 1, S("1234567890"), 5, 5, S("can't happen"));
218     test(S(""), 1, S("1234567890"), 5, 6, S("can't happen"));
219     test(S(""), 1, S("1234567890"), 9, 0, S("can't happen"));
220     test(S(""), 1, S("1234567890"), 9, 1, S("can't happen"));
221     test(S(""), 1, S("1234567890"), 9, 2, S("can't happen"));
222     test(S(""), 1, S("1234567890"), 10, 0, S("can't happen"));
223     test(S(""), 1, S("1234567890"), 10, 1, S("can't happen"));
224     test(S(""), 1, S("1234567890"), 11, 0, S("can't happen"));
225     test(S(""), 1, S("12345678901234567890"), 0, 0, S("can't happen"));
226     test(S(""), 1, S("12345678901234567890"), 0, 1, S("can't happen"));
227     test(S(""), 1, S("12345678901234567890"), 0, 10, S("can't happen"));
228     test(S(""), 1, S("12345678901234567890"), 0, 19, S("can't happen"));
229     test(S(""), 1, S("12345678901234567890"), 0, 20, S("can't happen"));
230     test(S(""), 1, S("12345678901234567890"), 0, 21, S("can't happen"));
231     test(S(""), 1, S("12345678901234567890"), 1, 0, S("can't happen"));
232     test(S(""), 1, S("12345678901234567890"), 1, 1, S("can't happen"));
233     test(S(""), 1, S("12345678901234567890"), 1, 9, S("can't happen"));
234     test(S(""), 1, S("12345678901234567890"), 1, 18, S("can't happen"));
235     test(S(""), 1, S("12345678901234567890"), 1, 19, S("can't happen"));
236     test(S(""), 1, S("12345678901234567890"), 1, 20, S("can't happen"));
237     test(S(""), 1, S("12345678901234567890"), 10, 0, S("can't happen"));
238     test(S(""), 1, S("12345678901234567890"), 10, 1, S("can't happen"));
239     test(S(""), 1, S("12345678901234567890"), 10, 5, S("can't happen"));
240     test(S(""), 1, S("12345678901234567890"), 10, 9, S("can't happen"));
241     test(S(""), 1, S("12345678901234567890"), 10, 10, S("can't happen"));
242     test(S(""), 1, S("12345678901234567890"), 10, 11, S("can't happen"));
243     test(S(""), 1, S("12345678901234567890"), 19, 0, S("can't happen"));
244     test(S(""), 1, S("12345678901234567890"), 19, 1, S("can't happen"));
245     test(S(""), 1, S("12345678901234567890"), 19, 2, S("can't happen"));
246     test(S(""), 1, S("12345678901234567890"), 20, 0, S("can't happen"));
247     test(S(""), 1, S("12345678901234567890"), 20, 1, S("can't happen"));
248     test(S(""), 1, S("12345678901234567890"), 21, 0, S("can't happen"));
249     test(S("abcde"), 0, S(""), 0, 0, S("abcde"));
250     test(S("abcde"), 0, S(""), 0, 1, S("abcde"));
251 }
252 
253 template <class S>
test3()254 void test3()
255 {
256     test(S("abcde"), 0, S(""), 1, 0, S("can't happen"));
257     test(S("abcde"), 0, S("12345"), 0, 0, S("abcde"));
258     test(S("abcde"), 0, S("12345"), 0, 1, S("1abcde"));
259     test(S("abcde"), 0, S("12345"), 0, 2, S("12abcde"));
260     test(S("abcde"), 0, S("12345"), 0, 4, S("1234abcde"));
261     test(S("abcde"), 0, S("12345"), 0, 5, S("12345abcde"));
262     test(S("abcde"), 0, S("12345"), 0, 6, S("12345abcde"));
263     test(S("abcde"), 0, S("12345"), 1, 0, S("abcde"));
264     test(S("abcde"), 0, S("12345"), 1, 1, S("2abcde"));
265     test(S("abcde"), 0, S("12345"), 1, 2, S("23abcde"));
266     test(S("abcde"), 0, S("12345"), 1, 3, S("234abcde"));
267     test(S("abcde"), 0, S("12345"), 1, 4, S("2345abcde"));
268     test(S("abcde"), 0, S("12345"), 1, 5, S("2345abcde"));
269     test(S("abcde"), 0, S("12345"), 2, 0, S("abcde"));
270     test(S("abcde"), 0, S("12345"), 2, 1, S("3abcde"));
271     test(S("abcde"), 0, S("12345"), 2, 2, S("34abcde"));
272     test(S("abcde"), 0, S("12345"), 2, 3, S("345abcde"));
273     test(S("abcde"), 0, S("12345"), 2, 4, S("345abcde"));
274     test(S("abcde"), 0, S("12345"), 4, 0, S("abcde"));
275     test(S("abcde"), 0, S("12345"), 4, 1, S("5abcde"));
276     test(S("abcde"), 0, S("12345"), 4, 2, S("5abcde"));
277     test(S("abcde"), 0, S("12345"), 5, 0, S("abcde"));
278     test(S("abcde"), 0, S("12345"), 5, 1, S("abcde"));
279     test(S("abcde"), 0, S("12345"), 6, 0, S("can't happen"));
280     test(S("abcde"), 0, S("1234567890"), 0, 0, S("abcde"));
281     test(S("abcde"), 0, S("1234567890"), 0, 1, S("1abcde"));
282     test(S("abcde"), 0, S("1234567890"), 0, 5, S("12345abcde"));
283     test(S("abcde"), 0, S("1234567890"), 0, 9, S("123456789abcde"));
284     test(S("abcde"), 0, S("1234567890"), 0, 10, S("1234567890abcde"));
285     test(S("abcde"), 0, S("1234567890"), 0, 11, S("1234567890abcde"));
286     test(S("abcde"), 0, S("1234567890"), 1, 0, S("abcde"));
287     test(S("abcde"), 0, S("1234567890"), 1, 1, S("2abcde"));
288     test(S("abcde"), 0, S("1234567890"), 1, 4, S("2345abcde"));
289     test(S("abcde"), 0, S("1234567890"), 1, 8, S("23456789abcde"));
290     test(S("abcde"), 0, S("1234567890"), 1, 9, S("234567890abcde"));
291     test(S("abcde"), 0, S("1234567890"), 1, 10, S("234567890abcde"));
292     test(S("abcde"), 0, S("1234567890"), 5, 0, S("abcde"));
293     test(S("abcde"), 0, S("1234567890"), 5, 1, S("6abcde"));
294     test(S("abcde"), 0, S("1234567890"), 5, 2, S("67abcde"));
295     test(S("abcde"), 0, S("1234567890"), 5, 4, S("6789abcde"));
296     test(S("abcde"), 0, S("1234567890"), 5, 5, S("67890abcde"));
297     test(S("abcde"), 0, S("1234567890"), 5, 6, S("67890abcde"));
298     test(S("abcde"), 0, S("1234567890"), 9, 0, S("abcde"));
299     test(S("abcde"), 0, S("1234567890"), 9, 1, S("0abcde"));
300     test(S("abcde"), 0, S("1234567890"), 9, 2, S("0abcde"));
301     test(S("abcde"), 0, S("1234567890"), 10, 0, S("abcde"));
302     test(S("abcde"), 0, S("1234567890"), 10, 1, S("abcde"));
303     test(S("abcde"), 0, S("1234567890"), 11, 0, S("can't happen"));
304     test(S("abcde"), 0, S("12345678901234567890"), 0, 0, S("abcde"));
305     test(S("abcde"), 0, S("12345678901234567890"), 0, 1, S("1abcde"));
306 }
307 
308 template <class S>
test4()309 void test4()
310 {
311     test(S("abcde"), 0, S("12345678901234567890"), 0, 10, S("1234567890abcde"));
312     test(S("abcde"), 0, S("12345678901234567890"), 0, 19, S("1234567890123456789abcde"));
313     test(S("abcde"), 0, S("12345678901234567890"), 0, 20, S("12345678901234567890abcde"));
314     test(S("abcde"), 0, S("12345678901234567890"), 0, 21, S("12345678901234567890abcde"));
315     test(S("abcde"), 0, S("12345678901234567890"), 1, 0, S("abcde"));
316     test(S("abcde"), 0, S("12345678901234567890"), 1, 1, S("2abcde"));
317     test(S("abcde"), 0, S("12345678901234567890"), 1, 9, S("234567890abcde"));
318     test(S("abcde"), 0, S("12345678901234567890"), 1, 18, S("234567890123456789abcde"));
319     test(S("abcde"), 0, S("12345678901234567890"), 1, 19, S("2345678901234567890abcde"));
320     test(S("abcde"), 0, S("12345678901234567890"), 1, 20, S("2345678901234567890abcde"));
321     test(S("abcde"), 0, S("12345678901234567890"), 10, 0, S("abcde"));
322     test(S("abcde"), 0, S("12345678901234567890"), 10, 1, S("1abcde"));
323     test(S("abcde"), 0, S("12345678901234567890"), 10, 5, S("12345abcde"));
324     test(S("abcde"), 0, S("12345678901234567890"), 10, 9, S("123456789abcde"));
325     test(S("abcde"), 0, S("12345678901234567890"), 10, 10, S("1234567890abcde"));
326     test(S("abcde"), 0, S("12345678901234567890"), 10, 11, S("1234567890abcde"));
327     test(S("abcde"), 0, S("12345678901234567890"), 19, 0, S("abcde"));
328     test(S("abcde"), 0, S("12345678901234567890"), 19, 1, S("0abcde"));
329     test(S("abcde"), 0, S("12345678901234567890"), 19, 2, S("0abcde"));
330     test(S("abcde"), 0, S("12345678901234567890"), 20, 0, S("abcde"));
331     test(S("abcde"), 0, S("12345678901234567890"), 20, 1, S("abcde"));
332     test(S("abcde"), 0, S("12345678901234567890"), 21, 0, S("can't happen"));
333     test(S("abcde"), 1, S(""), 0, 0, S("abcde"));
334     test(S("abcde"), 1, S(""), 0, 1, S("abcde"));
335     test(S("abcde"), 1, S(""), 1, 0, S("can't happen"));
336     test(S("abcde"), 1, S("12345"), 0, 0, S("abcde"));
337     test(S("abcde"), 1, S("12345"), 0, 1, S("a1bcde"));
338     test(S("abcde"), 1, S("12345"), 0, 2, S("a12bcde"));
339     test(S("abcde"), 1, S("12345"), 0, 4, S("a1234bcde"));
340     test(S("abcde"), 1, S("12345"), 0, 5, S("a12345bcde"));
341     test(S("abcde"), 1, S("12345"), 0, 6, S("a12345bcde"));
342     test(S("abcde"), 1, S("12345"), 1, 0, S("abcde"));
343     test(S("abcde"), 1, S("12345"), 1, 1, S("a2bcde"));
344     test(S("abcde"), 1, S("12345"), 1, 2, S("a23bcde"));
345     test(S("abcde"), 1, S("12345"), 1, 3, S("a234bcde"));
346     test(S("abcde"), 1, S("12345"), 1, 4, S("a2345bcde"));
347     test(S("abcde"), 1, S("12345"), 1, 5, S("a2345bcde"));
348     test(S("abcde"), 1, S("12345"), 2, 0, S("abcde"));
349     test(S("abcde"), 1, S("12345"), 2, 1, S("a3bcde"));
350     test(S("abcde"), 1, S("12345"), 2, 2, S("a34bcde"));
351     test(S("abcde"), 1, S("12345"), 2, 3, S("a345bcde"));
352     test(S("abcde"), 1, S("12345"), 2, 4, S("a345bcde"));
353     test(S("abcde"), 1, S("12345"), 4, 0, S("abcde"));
354     test(S("abcde"), 1, S("12345"), 4, 1, S("a5bcde"));
355     test(S("abcde"), 1, S("12345"), 4, 2, S("a5bcde"));
356     test(S("abcde"), 1, S("12345"), 5, 0, S("abcde"));
357     test(S("abcde"), 1, S("12345"), 5, 1, S("abcde"));
358     test(S("abcde"), 1, S("12345"), 6, 0, S("can't happen"));
359     test(S("abcde"), 1, S("1234567890"), 0, 0, S("abcde"));
360     test(S("abcde"), 1, S("1234567890"), 0, 1, S("a1bcde"));
361 }
362 
363 template <class S>
test5()364 void test5()
365 {
366     test(S("abcde"), 1, S("1234567890"), 0, 5, S("a12345bcde"));
367     test(S("abcde"), 1, S("1234567890"), 0, 9, S("a123456789bcde"));
368     test(S("abcde"), 1, S("1234567890"), 0, 10, S("a1234567890bcde"));
369     test(S("abcde"), 1, S("1234567890"), 0, 11, S("a1234567890bcde"));
370     test(S("abcde"), 1, S("1234567890"), 1, 0, S("abcde"));
371     test(S("abcde"), 1, S("1234567890"), 1, 1, S("a2bcde"));
372     test(S("abcde"), 1, S("1234567890"), 1, 4, S("a2345bcde"));
373     test(S("abcde"), 1, S("1234567890"), 1, 8, S("a23456789bcde"));
374     test(S("abcde"), 1, S("1234567890"), 1, 9, S("a234567890bcde"));
375     test(S("abcde"), 1, S("1234567890"), 1, 10, S("a234567890bcde"));
376     test(S("abcde"), 1, S("1234567890"), 5, 0, S("abcde"));
377     test(S("abcde"), 1, S("1234567890"), 5, 1, S("a6bcde"));
378     test(S("abcde"), 1, S("1234567890"), 5, 2, S("a67bcde"));
379     test(S("abcde"), 1, S("1234567890"), 5, 4, S("a6789bcde"));
380     test(S("abcde"), 1, S("1234567890"), 5, 5, S("a67890bcde"));
381     test(S("abcde"), 1, S("1234567890"), 5, 6, S("a67890bcde"));
382     test(S("abcde"), 1, S("1234567890"), 9, 0, S("abcde"));
383     test(S("abcde"), 1, S("1234567890"), 9, 1, S("a0bcde"));
384     test(S("abcde"), 1, S("1234567890"), 9, 2, S("a0bcde"));
385     test(S("abcde"), 1, S("1234567890"), 10, 0, S("abcde"));
386     test(S("abcde"), 1, S("1234567890"), 10, 1, S("abcde"));
387     test(S("abcde"), 1, S("1234567890"), 11, 0, S("can't happen"));
388     test(S("abcde"), 1, S("12345678901234567890"), 0, 0, S("abcde"));
389     test(S("abcde"), 1, S("12345678901234567890"), 0, 1, S("a1bcde"));
390     test(S("abcde"), 1, S("12345678901234567890"), 0, 10, S("a1234567890bcde"));
391     test(S("abcde"), 1, S("12345678901234567890"), 0, 19, S("a1234567890123456789bcde"));
392     test(S("abcde"), 1, S("12345678901234567890"), 0, 20, S("a12345678901234567890bcde"));
393     test(S("abcde"), 1, S("12345678901234567890"), 0, 21, S("a12345678901234567890bcde"));
394     test(S("abcde"), 1, S("12345678901234567890"), 1, 0, S("abcde"));
395     test(S("abcde"), 1, S("12345678901234567890"), 1, 1, S("a2bcde"));
396     test(S("abcde"), 1, S("12345678901234567890"), 1, 9, S("a234567890bcde"));
397     test(S("abcde"), 1, S("12345678901234567890"), 1, 18, S("a234567890123456789bcde"));
398     test(S("abcde"), 1, S("12345678901234567890"), 1, 19, S("a2345678901234567890bcde"));
399     test(S("abcde"), 1, S("12345678901234567890"), 1, 20, S("a2345678901234567890bcde"));
400     test(S("abcde"), 1, S("12345678901234567890"), 10, 0, S("abcde"));
401     test(S("abcde"), 1, S("12345678901234567890"), 10, 1, S("a1bcde"));
402     test(S("abcde"), 1, S("12345678901234567890"), 10, 5, S("a12345bcde"));
403     test(S("abcde"), 1, S("12345678901234567890"), 10, 9, S("a123456789bcde"));
404     test(S("abcde"), 1, S("12345678901234567890"), 10, 10, S("a1234567890bcde"));
405     test(S("abcde"), 1, S("12345678901234567890"), 10, 11, S("a1234567890bcde"));
406     test(S("abcde"), 1, S("12345678901234567890"), 19, 0, S("abcde"));
407     test(S("abcde"), 1, S("12345678901234567890"), 19, 1, S("a0bcde"));
408     test(S("abcde"), 1, S("12345678901234567890"), 19, 2, S("a0bcde"));
409     test(S("abcde"), 1, S("12345678901234567890"), 20, 0, S("abcde"));
410     test(S("abcde"), 1, S("12345678901234567890"), 20, 1, S("abcde"));
411     test(S("abcde"), 1, S("12345678901234567890"), 21, 0, S("can't happen"));
412     test(S("abcde"), 2, S(""), 0, 0, S("abcde"));
413     test(S("abcde"), 2, S(""), 0, 1, S("abcde"));
414     test(S("abcde"), 2, S(""), 1, 0, S("can't happen"));
415     test(S("abcde"), 2, S("12345"), 0, 0, S("abcde"));
416 }
417 
418 template <class S>
test6()419 void test6()
420 {
421     test(S("abcde"), 2, S("12345"), 0, 1, S("ab1cde"));
422     test(S("abcde"), 2, S("12345"), 0, 2, S("ab12cde"));
423     test(S("abcde"), 2, S("12345"), 0, 4, S("ab1234cde"));
424     test(S("abcde"), 2, S("12345"), 0, 5, S("ab12345cde"));
425     test(S("abcde"), 2, S("12345"), 0, 6, S("ab12345cde"));
426     test(S("abcde"), 2, S("12345"), 1, 0, S("abcde"));
427     test(S("abcde"), 2, S("12345"), 1, 1, S("ab2cde"));
428     test(S("abcde"), 2, S("12345"), 1, 2, S("ab23cde"));
429     test(S("abcde"), 2, S("12345"), 1, 3, S("ab234cde"));
430     test(S("abcde"), 2, S("12345"), 1, 4, S("ab2345cde"));
431     test(S("abcde"), 2, S("12345"), 1, 5, S("ab2345cde"));
432     test(S("abcde"), 2, S("12345"), 2, 0, S("abcde"));
433     test(S("abcde"), 2, S("12345"), 2, 1, S("ab3cde"));
434     test(S("abcde"), 2, S("12345"), 2, 2, S("ab34cde"));
435     test(S("abcde"), 2, S("12345"), 2, 3, S("ab345cde"));
436     test(S("abcde"), 2, S("12345"), 2, 4, S("ab345cde"));
437     test(S("abcde"), 2, S("12345"), 4, 0, S("abcde"));
438     test(S("abcde"), 2, S("12345"), 4, 1, S("ab5cde"));
439     test(S("abcde"), 2, S("12345"), 4, 2, S("ab5cde"));
440     test(S("abcde"), 2, S("12345"), 5, 0, S("abcde"));
441     test(S("abcde"), 2, S("12345"), 5, 1, S("abcde"));
442     test(S("abcde"), 2, S("12345"), 6, 0, S("can't happen"));
443     test(S("abcde"), 2, S("1234567890"), 0, 0, S("abcde"));
444     test(S("abcde"), 2, S("1234567890"), 0, 1, S("ab1cde"));
445     test(S("abcde"), 2, S("1234567890"), 0, 5, S("ab12345cde"));
446     test(S("abcde"), 2, S("1234567890"), 0, 9, S("ab123456789cde"));
447     test(S("abcde"), 2, S("1234567890"), 0, 10, S("ab1234567890cde"));
448     test(S("abcde"), 2, S("1234567890"), 0, 11, S("ab1234567890cde"));
449     test(S("abcde"), 2, S("1234567890"), 1, 0, S("abcde"));
450     test(S("abcde"), 2, S("1234567890"), 1, 1, S("ab2cde"));
451     test(S("abcde"), 2, S("1234567890"), 1, 4, S("ab2345cde"));
452     test(S("abcde"), 2, S("1234567890"), 1, 8, S("ab23456789cde"));
453     test(S("abcde"), 2, S("1234567890"), 1, 9, S("ab234567890cde"));
454     test(S("abcde"), 2, S("1234567890"), 1, 10, S("ab234567890cde"));
455     test(S("abcde"), 2, S("1234567890"), 5, 0, S("abcde"));
456     test(S("abcde"), 2, S("1234567890"), 5, 1, S("ab6cde"));
457     test(S("abcde"), 2, S("1234567890"), 5, 2, S("ab67cde"));
458     test(S("abcde"), 2, S("1234567890"), 5, 4, S("ab6789cde"));
459     test(S("abcde"), 2, S("1234567890"), 5, 5, S("ab67890cde"));
460     test(S("abcde"), 2, S("1234567890"), 5, 6, S("ab67890cde"));
461     test(S("abcde"), 2, S("1234567890"), 9, 0, S("abcde"));
462     test(S("abcde"), 2, S("1234567890"), 9, 1, S("ab0cde"));
463     test(S("abcde"), 2, S("1234567890"), 9, 2, S("ab0cde"));
464     test(S("abcde"), 2, S("1234567890"), 10, 0, S("abcde"));
465     test(S("abcde"), 2, S("1234567890"), 10, 1, S("abcde"));
466     test(S("abcde"), 2, S("1234567890"), 11, 0, S("can't happen"));
467     test(S("abcde"), 2, S("12345678901234567890"), 0, 0, S("abcde"));
468     test(S("abcde"), 2, S("12345678901234567890"), 0, 1, S("ab1cde"));
469     test(S("abcde"), 2, S("12345678901234567890"), 0, 10, S("ab1234567890cde"));
470     test(S("abcde"), 2, S("12345678901234567890"), 0, 19, S("ab1234567890123456789cde"));
471 }
472 
473 template <class S>
test7()474 void test7()
475 {
476     test(S("abcde"), 2, S("12345678901234567890"), 0, 20, S("ab12345678901234567890cde"));
477     test(S("abcde"), 2, S("12345678901234567890"), 0, 21, S("ab12345678901234567890cde"));
478     test(S("abcde"), 2, S("12345678901234567890"), 1, 0, S("abcde"));
479     test(S("abcde"), 2, S("12345678901234567890"), 1, 1, S("ab2cde"));
480     test(S("abcde"), 2, S("12345678901234567890"), 1, 9, S("ab234567890cde"));
481     test(S("abcde"), 2, S("12345678901234567890"), 1, 18, S("ab234567890123456789cde"));
482     test(S("abcde"), 2, S("12345678901234567890"), 1, 19, S("ab2345678901234567890cde"));
483     test(S("abcde"), 2, S("12345678901234567890"), 1, 20, S("ab2345678901234567890cde"));
484     test(S("abcde"), 2, S("12345678901234567890"), 10, 0, S("abcde"));
485     test(S("abcde"), 2, S("12345678901234567890"), 10, 1, S("ab1cde"));
486     test(S("abcde"), 2, S("12345678901234567890"), 10, 5, S("ab12345cde"));
487     test(S("abcde"), 2, S("12345678901234567890"), 10, 9, S("ab123456789cde"));
488     test(S("abcde"), 2, S("12345678901234567890"), 10, 10, S("ab1234567890cde"));
489     test(S("abcde"), 2, S("12345678901234567890"), 10, 11, S("ab1234567890cde"));
490     test(S("abcde"), 2, S("12345678901234567890"), 19, 0, S("abcde"));
491     test(S("abcde"), 2, S("12345678901234567890"), 19, 1, S("ab0cde"));
492     test(S("abcde"), 2, S("12345678901234567890"), 19, 2, S("ab0cde"));
493     test(S("abcde"), 2, S("12345678901234567890"), 20, 0, S("abcde"));
494     test(S("abcde"), 2, S("12345678901234567890"), 20, 1, S("abcde"));
495     test(S("abcde"), 2, S("12345678901234567890"), 21, 0, S("can't happen"));
496     test(S("abcde"), 4, S(""), 0, 0, S("abcde"));
497     test(S("abcde"), 4, S(""), 0, 1, S("abcde"));
498     test(S("abcde"), 4, S(""), 1, 0, S("can't happen"));
499     test(S("abcde"), 4, S("12345"), 0, 0, S("abcde"));
500     test(S("abcde"), 4, S("12345"), 0, 1, S("abcd1e"));
501     test(S("abcde"), 4, S("12345"), 0, 2, S("abcd12e"));
502     test(S("abcde"), 4, S("12345"), 0, 4, S("abcd1234e"));
503     test(S("abcde"), 4, S("12345"), 0, 5, S("abcd12345e"));
504     test(S("abcde"), 4, S("12345"), 0, 6, S("abcd12345e"));
505     test(S("abcde"), 4, S("12345"), 1, 0, S("abcde"));
506     test(S("abcde"), 4, S("12345"), 1, 1, S("abcd2e"));
507     test(S("abcde"), 4, S("12345"), 1, 2, S("abcd23e"));
508     test(S("abcde"), 4, S("12345"), 1, 3, S("abcd234e"));
509     test(S("abcde"), 4, S("12345"), 1, 4, S("abcd2345e"));
510     test(S("abcde"), 4, S("12345"), 1, 5, S("abcd2345e"));
511     test(S("abcde"), 4, S("12345"), 2, 0, S("abcde"));
512     test(S("abcde"), 4, S("12345"), 2, 1, S("abcd3e"));
513     test(S("abcde"), 4, S("12345"), 2, 2, S("abcd34e"));
514     test(S("abcde"), 4, S("12345"), 2, 3, S("abcd345e"));
515     test(S("abcde"), 4, S("12345"), 2, 4, S("abcd345e"));
516     test(S("abcde"), 4, S("12345"), 4, 0, S("abcde"));
517     test(S("abcde"), 4, S("12345"), 4, 1, S("abcd5e"));
518     test(S("abcde"), 4, S("12345"), 4, 2, S("abcd5e"));
519     test(S("abcde"), 4, S("12345"), 5, 0, S("abcde"));
520     test(S("abcde"), 4, S("12345"), 5, 1, S("abcde"));
521     test(S("abcde"), 4, S("12345"), 6, 0, S("can't happen"));
522     test(S("abcde"), 4, S("1234567890"), 0, 0, S("abcde"));
523     test(S("abcde"), 4, S("1234567890"), 0, 1, S("abcd1e"));
524     test(S("abcde"), 4, S("1234567890"), 0, 5, S("abcd12345e"));
525     test(S("abcde"), 4, S("1234567890"), 0, 9, S("abcd123456789e"));
526 }
527 
528 template <class S>
test8()529 void test8()
530 {
531     test(S("abcde"), 4, S("1234567890"), 0, 10, S("abcd1234567890e"));
532     test(S("abcde"), 4, S("1234567890"), 0, 11, S("abcd1234567890e"));
533     test(S("abcde"), 4, S("1234567890"), 1, 0, S("abcde"));
534     test(S("abcde"), 4, S("1234567890"), 1, 1, S("abcd2e"));
535     test(S("abcde"), 4, S("1234567890"), 1, 4, S("abcd2345e"));
536     test(S("abcde"), 4, S("1234567890"), 1, 8, S("abcd23456789e"));
537     test(S("abcde"), 4, S("1234567890"), 1, 9, S("abcd234567890e"));
538     test(S("abcde"), 4, S("1234567890"), 1, 10, S("abcd234567890e"));
539     test(S("abcde"), 4, S("1234567890"), 5, 0, S("abcde"));
540     test(S("abcde"), 4, S("1234567890"), 5, 1, S("abcd6e"));
541     test(S("abcde"), 4, S("1234567890"), 5, 2, S("abcd67e"));
542     test(S("abcde"), 4, S("1234567890"), 5, 4, S("abcd6789e"));
543     test(S("abcde"), 4, S("1234567890"), 5, 5, S("abcd67890e"));
544     test(S("abcde"), 4, S("1234567890"), 5, 6, S("abcd67890e"));
545     test(S("abcde"), 4, S("1234567890"), 9, 0, S("abcde"));
546     test(S("abcde"), 4, S("1234567890"), 9, 1, S("abcd0e"));
547     test(S("abcde"), 4, S("1234567890"), 9, 2, S("abcd0e"));
548     test(S("abcde"), 4, S("1234567890"), 10, 0, S("abcde"));
549     test(S("abcde"), 4, S("1234567890"), 10, 1, S("abcde"));
550     test(S("abcde"), 4, S("1234567890"), 11, 0, S("can't happen"));
551     test(S("abcde"), 4, S("12345678901234567890"), 0, 0, S("abcde"));
552     test(S("abcde"), 4, S("12345678901234567890"), 0, 1, S("abcd1e"));
553     test(S("abcde"), 4, S("12345678901234567890"), 0, 10, S("abcd1234567890e"));
554     test(S("abcde"), 4, S("12345678901234567890"), 0, 19, S("abcd1234567890123456789e"));
555     test(S("abcde"), 4, S("12345678901234567890"), 0, 20, S("abcd12345678901234567890e"));
556     test(S("abcde"), 4, S("12345678901234567890"), 0, 21, S("abcd12345678901234567890e"));
557     test(S("abcde"), 4, S("12345678901234567890"), 1, 0, S("abcde"));
558     test(S("abcde"), 4, S("12345678901234567890"), 1, 1, S("abcd2e"));
559     test(S("abcde"), 4, S("12345678901234567890"), 1, 9, S("abcd234567890e"));
560     test(S("abcde"), 4, S("12345678901234567890"), 1, 18, S("abcd234567890123456789e"));
561     test(S("abcde"), 4, S("12345678901234567890"), 1, 19, S("abcd2345678901234567890e"));
562     test(S("abcde"), 4, S("12345678901234567890"), 1, 20, S("abcd2345678901234567890e"));
563     test(S("abcde"), 4, S("12345678901234567890"), 10, 0, S("abcde"));
564     test(S("abcde"), 4, S("12345678901234567890"), 10, 1, S("abcd1e"));
565     test(S("abcde"), 4, S("12345678901234567890"), 10, 5, S("abcd12345e"));
566     test(S("abcde"), 4, S("12345678901234567890"), 10, 9, S("abcd123456789e"));
567     test(S("abcde"), 4, S("12345678901234567890"), 10, 10, S("abcd1234567890e"));
568     test(S("abcde"), 4, S("12345678901234567890"), 10, 11, S("abcd1234567890e"));
569     test(S("abcde"), 4, S("12345678901234567890"), 19, 0, S("abcde"));
570     test(S("abcde"), 4, S("12345678901234567890"), 19, 1, S("abcd0e"));
571     test(S("abcde"), 4, S("12345678901234567890"), 19, 2, S("abcd0e"));
572     test(S("abcde"), 4, S("12345678901234567890"), 20, 0, S("abcde"));
573     test(S("abcde"), 4, S("12345678901234567890"), 20, 1, S("abcde"));
574     test(S("abcde"), 4, S("12345678901234567890"), 21, 0, S("can't happen"));
575     test(S("abcde"), 5, S(""), 0, 0, S("abcde"));
576     test(S("abcde"), 5, S(""), 0, 1, S("abcde"));
577     test(S("abcde"), 5, S(""), 1, 0, S("can't happen"));
578     test(S("abcde"), 5, S("12345"), 0, 0, S("abcde"));
579     test(S("abcde"), 5, S("12345"), 0, 1, S("abcde1"));
580     test(S("abcde"), 5, S("12345"), 0, 2, S("abcde12"));
581 }
582 
583 template <class S>
test9()584 void test9()
585 {
586     test(S("abcde"), 5, S("12345"), 0, 4, S("abcde1234"));
587     test(S("abcde"), 5, S("12345"), 0, 5, S("abcde12345"));
588     test(S("abcde"), 5, S("12345"), 0, 6, S("abcde12345"));
589     test(S("abcde"), 5, S("12345"), 1, 0, S("abcde"));
590     test(S("abcde"), 5, S("12345"), 1, 1, S("abcde2"));
591     test(S("abcde"), 5, S("12345"), 1, 2, S("abcde23"));
592     test(S("abcde"), 5, S("12345"), 1, 3, S("abcde234"));
593     test(S("abcde"), 5, S("12345"), 1, 4, S("abcde2345"));
594     test(S("abcde"), 5, S("12345"), 1, 5, S("abcde2345"));
595     test(S("abcde"), 5, S("12345"), 2, 0, S("abcde"));
596     test(S("abcde"), 5, S("12345"), 2, 1, S("abcde3"));
597     test(S("abcde"), 5, S("12345"), 2, 2, S("abcde34"));
598     test(S("abcde"), 5, S("12345"), 2, 3, S("abcde345"));
599     test(S("abcde"), 5, S("12345"), 2, 4, S("abcde345"));
600     test(S("abcde"), 5, S("12345"), 4, 0, S("abcde"));
601     test(S("abcde"), 5, S("12345"), 4, 1, S("abcde5"));
602     test(S("abcde"), 5, S("12345"), 4, 2, S("abcde5"));
603     test(S("abcde"), 5, S("12345"), 5, 0, S("abcde"));
604     test(S("abcde"), 5, S("12345"), 5, 1, S("abcde"));
605     test(S("abcde"), 5, S("12345"), 6, 0, S("can't happen"));
606     test(S("abcde"), 5, S("1234567890"), 0, 0, S("abcde"));
607     test(S("abcde"), 5, S("1234567890"), 0, 1, S("abcde1"));
608     test(S("abcde"), 5, S("1234567890"), 0, 5, S("abcde12345"));
609     test(S("abcde"), 5, S("1234567890"), 0, 9, S("abcde123456789"));
610     test(S("abcde"), 5, S("1234567890"), 0, 10, S("abcde1234567890"));
611     test(S("abcde"), 5, S("1234567890"), 0, 11, S("abcde1234567890"));
612     test(S("abcde"), 5, S("1234567890"), 1, 0, S("abcde"));
613     test(S("abcde"), 5, S("1234567890"), 1, 1, S("abcde2"));
614     test(S("abcde"), 5, S("1234567890"), 1, 4, S("abcde2345"));
615     test(S("abcde"), 5, S("1234567890"), 1, 8, S("abcde23456789"));
616     test(S("abcde"), 5, S("1234567890"), 1, 9, S("abcde234567890"));
617     test(S("abcde"), 5, S("1234567890"), 1, 10, S("abcde234567890"));
618     test(S("abcde"), 5, S("1234567890"), 5, 0, S("abcde"));
619     test(S("abcde"), 5, S("1234567890"), 5, 1, S("abcde6"));
620     test(S("abcde"), 5, S("1234567890"), 5, 2, S("abcde67"));
621     test(S("abcde"), 5, S("1234567890"), 5, 4, S("abcde6789"));
622     test(S("abcde"), 5, S("1234567890"), 5, 5, S("abcde67890"));
623     test(S("abcde"), 5, S("1234567890"), 5, 6, S("abcde67890"));
624     test(S("abcde"), 5, S("1234567890"), 9, 0, S("abcde"));
625     test(S("abcde"), 5, S("1234567890"), 9, 1, S("abcde0"));
626     test(S("abcde"), 5, S("1234567890"), 9, 2, S("abcde0"));
627     test(S("abcde"), 5, S("1234567890"), 10, 0, S("abcde"));
628     test(S("abcde"), 5, S("1234567890"), 10, 1, S("abcde"));
629     test(S("abcde"), 5, S("1234567890"), 11, 0, S("can't happen"));
630     test(S("abcde"), 5, S("12345678901234567890"), 0, 0, S("abcde"));
631     test(S("abcde"), 5, S("12345678901234567890"), 0, 1, S("abcde1"));
632     test(S("abcde"), 5, S("12345678901234567890"), 0, 10, S("abcde1234567890"));
633     test(S("abcde"), 5, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789"));
634     test(S("abcde"), 5, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890"));
635     test(S("abcde"), 5, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890"));
636 }
637 
638 template <class S>
test10()639 void test10()
640 {
641     test(S("abcde"), 5, S("12345678901234567890"), 1, 0, S("abcde"));
642     test(S("abcde"), 5, S("12345678901234567890"), 1, 1, S("abcde2"));
643     test(S("abcde"), 5, S("12345678901234567890"), 1, 9, S("abcde234567890"));
644     test(S("abcde"), 5, S("12345678901234567890"), 1, 18, S("abcde234567890123456789"));
645     test(S("abcde"), 5, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890"));
646     test(S("abcde"), 5, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890"));
647     test(S("abcde"), 5, S("12345678901234567890"), 10, 0, S("abcde"));
648     test(S("abcde"), 5, S("12345678901234567890"), 10, 1, S("abcde1"));
649     test(S("abcde"), 5, S("12345678901234567890"), 10, 5, S("abcde12345"));
650     test(S("abcde"), 5, S("12345678901234567890"), 10, 9, S("abcde123456789"));
651     test(S("abcde"), 5, S("12345678901234567890"), 10, 10, S("abcde1234567890"));
652     test(S("abcde"), 5, S("12345678901234567890"), 10, 11, S("abcde1234567890"));
653     test(S("abcde"), 5, S("12345678901234567890"), 19, 0, S("abcde"));
654     test(S("abcde"), 5, S("12345678901234567890"), 19, 1, S("abcde0"));
655     test(S("abcde"), 5, S("12345678901234567890"), 19, 2, S("abcde0"));
656     test(S("abcde"), 5, S("12345678901234567890"), 20, 0, S("abcde"));
657     test(S("abcde"), 5, S("12345678901234567890"), 20, 1, S("abcde"));
658     test(S("abcde"), 5, S("12345678901234567890"), 21, 0, S("can't happen"));
659     test(S("abcde"), 6, S(""), 0, 0, S("can't happen"));
660     test(S("abcde"), 6, S(""), 0, 1, S("can't happen"));
661     test(S("abcde"), 6, S(""), 1, 0, S("can't happen"));
662     test(S("abcde"), 6, S("12345"), 0, 0, S("can't happen"));
663     test(S("abcde"), 6, S("12345"), 0, 1, S("can't happen"));
664     test(S("abcde"), 6, S("12345"), 0, 2, S("can't happen"));
665     test(S("abcde"), 6, S("12345"), 0, 4, S("can't happen"));
666     test(S("abcde"), 6, S("12345"), 0, 5, S("can't happen"));
667     test(S("abcde"), 6, S("12345"), 0, 6, S("can't happen"));
668     test(S("abcde"), 6, S("12345"), 1, 0, S("can't happen"));
669     test(S("abcde"), 6, S("12345"), 1, 1, S("can't happen"));
670     test(S("abcde"), 6, S("12345"), 1, 2, S("can't happen"));
671     test(S("abcde"), 6, S("12345"), 1, 3, S("can't happen"));
672     test(S("abcde"), 6, S("12345"), 1, 4, S("can't happen"));
673     test(S("abcde"), 6, S("12345"), 1, 5, S("can't happen"));
674     test(S("abcde"), 6, S("12345"), 2, 0, S("can't happen"));
675     test(S("abcde"), 6, S("12345"), 2, 1, S("can't happen"));
676     test(S("abcde"), 6, S("12345"), 2, 2, S("can't happen"));
677     test(S("abcde"), 6, S("12345"), 2, 3, S("can't happen"));
678     test(S("abcde"), 6, S("12345"), 2, 4, S("can't happen"));
679     test(S("abcde"), 6, S("12345"), 4, 0, S("can't happen"));
680     test(S("abcde"), 6, S("12345"), 4, 1, S("can't happen"));
681     test(S("abcde"), 6, S("12345"), 4, 2, S("can't happen"));
682     test(S("abcde"), 6, S("12345"), 5, 0, S("can't happen"));
683     test(S("abcde"), 6, S("12345"), 5, 1, S("can't happen"));
684     test(S("abcde"), 6, S("12345"), 6, 0, S("can't happen"));
685     test(S("abcde"), 6, S("1234567890"), 0, 0, S("can't happen"));
686     test(S("abcde"), 6, S("1234567890"), 0, 1, S("can't happen"));
687     test(S("abcde"), 6, S("1234567890"), 0, 5, S("can't happen"));
688     test(S("abcde"), 6, S("1234567890"), 0, 9, S("can't happen"));
689     test(S("abcde"), 6, S("1234567890"), 0, 10, S("can't happen"));
690     test(S("abcde"), 6, S("1234567890"), 0, 11, S("can't happen"));
691 }
692 
693 template <class S>
test11()694 void test11()
695 {
696     test(S("abcde"), 6, S("1234567890"), 1, 0, S("can't happen"));
697     test(S("abcde"), 6, S("1234567890"), 1, 1, S("can't happen"));
698     test(S("abcde"), 6, S("1234567890"), 1, 4, S("can't happen"));
699     test(S("abcde"), 6, S("1234567890"), 1, 8, S("can't happen"));
700     test(S("abcde"), 6, S("1234567890"), 1, 9, S("can't happen"));
701     test(S("abcde"), 6, S("1234567890"), 1, 10, S("can't happen"));
702     test(S("abcde"), 6, S("1234567890"), 5, 0, S("can't happen"));
703     test(S("abcde"), 6, S("1234567890"), 5, 1, S("can't happen"));
704     test(S("abcde"), 6, S("1234567890"), 5, 2, S("can't happen"));
705     test(S("abcde"), 6, S("1234567890"), 5, 4, S("can't happen"));
706     test(S("abcde"), 6, S("1234567890"), 5, 5, S("can't happen"));
707     test(S("abcde"), 6, S("1234567890"), 5, 6, S("can't happen"));
708     test(S("abcde"), 6, S("1234567890"), 9, 0, S("can't happen"));
709     test(S("abcde"), 6, S("1234567890"), 9, 1, S("can't happen"));
710     test(S("abcde"), 6, S("1234567890"), 9, 2, S("can't happen"));
711     test(S("abcde"), 6, S("1234567890"), 10, 0, S("can't happen"));
712     test(S("abcde"), 6, S("1234567890"), 10, 1, S("can't happen"));
713     test(S("abcde"), 6, S("1234567890"), 11, 0, S("can't happen"));
714     test(S("abcde"), 6, S("12345678901234567890"), 0, 0, S("can't happen"));
715     test(S("abcde"), 6, S("12345678901234567890"), 0, 1, S("can't happen"));
716     test(S("abcde"), 6, S("12345678901234567890"), 0, 10, S("can't happen"));
717     test(S("abcde"), 6, S("12345678901234567890"), 0, 19, S("can't happen"));
718     test(S("abcde"), 6, S("12345678901234567890"), 0, 20, S("can't happen"));
719     test(S("abcde"), 6, S("12345678901234567890"), 0, 21, S("can't happen"));
720     test(S("abcde"), 6, S("12345678901234567890"), 1, 0, S("can't happen"));
721     test(S("abcde"), 6, S("12345678901234567890"), 1, 1, S("can't happen"));
722     test(S("abcde"), 6, S("12345678901234567890"), 1, 9, S("can't happen"));
723     test(S("abcde"), 6, S("12345678901234567890"), 1, 18, S("can't happen"));
724     test(S("abcde"), 6, S("12345678901234567890"), 1, 19, S("can't happen"));
725     test(S("abcde"), 6, S("12345678901234567890"), 1, 20, S("can't happen"));
726     test(S("abcde"), 6, S("12345678901234567890"), 10, 0, S("can't happen"));
727     test(S("abcde"), 6, S("12345678901234567890"), 10, 1, S("can't happen"));
728     test(S("abcde"), 6, S("12345678901234567890"), 10, 5, S("can't happen"));
729     test(S("abcde"), 6, S("12345678901234567890"), 10, 9, S("can't happen"));
730     test(S("abcde"), 6, S("12345678901234567890"), 10, 10, S("can't happen"));
731     test(S("abcde"), 6, S("12345678901234567890"), 10, 11, S("can't happen"));
732     test(S("abcde"), 6, S("12345678901234567890"), 19, 0, S("can't happen"));
733     test(S("abcde"), 6, S("12345678901234567890"), 19, 1, S("can't happen"));
734     test(S("abcde"), 6, S("12345678901234567890"), 19, 2, S("can't happen"));
735     test(S("abcde"), 6, S("12345678901234567890"), 20, 0, S("can't happen"));
736     test(S("abcde"), 6, S("12345678901234567890"), 20, 1, S("can't happen"));
737     test(S("abcde"), 6, S("12345678901234567890"), 21, 0, S("can't happen"));
738     test(S("abcdefghij"), 0, S(""), 0, 0, S("abcdefghij"));
739     test(S("abcdefghij"), 0, S(""), 0, 1, S("abcdefghij"));
740     test(S("abcdefghij"), 0, S(""), 1, 0, S("can't happen"));
741     test(S("abcdefghij"), 0, S("12345"), 0, 0, S("abcdefghij"));
742     test(S("abcdefghij"), 0, S("12345"), 0, 1, S("1abcdefghij"));
743     test(S("abcdefghij"), 0, S("12345"), 0, 2, S("12abcdefghij"));
744     test(S("abcdefghij"), 0, S("12345"), 0, 4, S("1234abcdefghij"));
745     test(S("abcdefghij"), 0, S("12345"), 0, 5, S("12345abcdefghij"));
746 }
747 
748 template <class S>
test12()749 void test12()
750 {
751     test(S("abcdefghij"), 0, S("12345"), 0, 6, S("12345abcdefghij"));
752     test(S("abcdefghij"), 0, S("12345"), 1, 0, S("abcdefghij"));
753     test(S("abcdefghij"), 0, S("12345"), 1, 1, S("2abcdefghij"));
754     test(S("abcdefghij"), 0, S("12345"), 1, 2, S("23abcdefghij"));
755     test(S("abcdefghij"), 0, S("12345"), 1, 3, S("234abcdefghij"));
756     test(S("abcdefghij"), 0, S("12345"), 1, 4, S("2345abcdefghij"));
757     test(S("abcdefghij"), 0, S("12345"), 1, 5, S("2345abcdefghij"));
758     test(S("abcdefghij"), 0, S("12345"), 2, 0, S("abcdefghij"));
759     test(S("abcdefghij"), 0, S("12345"), 2, 1, S("3abcdefghij"));
760     test(S("abcdefghij"), 0, S("12345"), 2, 2, S("34abcdefghij"));
761     test(S("abcdefghij"), 0, S("12345"), 2, 3, S("345abcdefghij"));
762     test(S("abcdefghij"), 0, S("12345"), 2, 4, S("345abcdefghij"));
763     test(S("abcdefghij"), 0, S("12345"), 4, 0, S("abcdefghij"));
764     test(S("abcdefghij"), 0, S("12345"), 4, 1, S("5abcdefghij"));
765     test(S("abcdefghij"), 0, S("12345"), 4, 2, S("5abcdefghij"));
766     test(S("abcdefghij"), 0, S("12345"), 5, 0, S("abcdefghij"));
767     test(S("abcdefghij"), 0, S("12345"), 5, 1, S("abcdefghij"));
768     test(S("abcdefghij"), 0, S("12345"), 6, 0, S("can't happen"));
769     test(S("abcdefghij"), 0, S("1234567890"), 0, 0, S("abcdefghij"));
770     test(S("abcdefghij"), 0, S("1234567890"), 0, 1, S("1abcdefghij"));
771     test(S("abcdefghij"), 0, S("1234567890"), 0, 5, S("12345abcdefghij"));
772     test(S("abcdefghij"), 0, S("1234567890"), 0, 9, S("123456789abcdefghij"));
773     test(S("abcdefghij"), 0, S("1234567890"), 0, 10, S("1234567890abcdefghij"));
774     test(S("abcdefghij"), 0, S("1234567890"), 0, 11, S("1234567890abcdefghij"));
775     test(S("abcdefghij"), 0, S("1234567890"), 1, 0, S("abcdefghij"));
776     test(S("abcdefghij"), 0, S("1234567890"), 1, 1, S("2abcdefghij"));
777     test(S("abcdefghij"), 0, S("1234567890"), 1, 4, S("2345abcdefghij"));
778     test(S("abcdefghij"), 0, S("1234567890"), 1, 8, S("23456789abcdefghij"));
779     test(S("abcdefghij"), 0, S("1234567890"), 1, 9, S("234567890abcdefghij"));
780     test(S("abcdefghij"), 0, S("1234567890"), 1, 10, S("234567890abcdefghij"));
781     test(S("abcdefghij"), 0, S("1234567890"), 5, 0, S("abcdefghij"));
782     test(S("abcdefghij"), 0, S("1234567890"), 5, 1, S("6abcdefghij"));
783     test(S("abcdefghij"), 0, S("1234567890"), 5, 2, S("67abcdefghij"));
784     test(S("abcdefghij"), 0, S("1234567890"), 5, 4, S("6789abcdefghij"));
785     test(S("abcdefghij"), 0, S("1234567890"), 5, 5, S("67890abcdefghij"));
786     test(S("abcdefghij"), 0, S("1234567890"), 5, 6, S("67890abcdefghij"));
787     test(S("abcdefghij"), 0, S("1234567890"), 9, 0, S("abcdefghij"));
788     test(S("abcdefghij"), 0, S("1234567890"), 9, 1, S("0abcdefghij"));
789     test(S("abcdefghij"), 0, S("1234567890"), 9, 2, S("0abcdefghij"));
790     test(S("abcdefghij"), 0, S("1234567890"), 10, 0, S("abcdefghij"));
791     test(S("abcdefghij"), 0, S("1234567890"), 10, 1, S("abcdefghij"));
792     test(S("abcdefghij"), 0, S("1234567890"), 11, 0, S("can't happen"));
793     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 0, S("abcdefghij"));
794     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 1, S("1abcdefghij"));
795     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 10, S("1234567890abcdefghij"));
796     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 19, S("1234567890123456789abcdefghij"));
797     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 20, S("12345678901234567890abcdefghij"));
798     test(S("abcdefghij"), 0, S("12345678901234567890"), 0, 21, S("12345678901234567890abcdefghij"));
799     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 0, S("abcdefghij"));
800     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 1, S("2abcdefghij"));
801 }
802 
803 template <class S>
test13()804 void test13()
805 {
806     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 9, S("234567890abcdefghij"));
807     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 18, S("234567890123456789abcdefghij"));
808     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 19, S("2345678901234567890abcdefghij"));
809     test(S("abcdefghij"), 0, S("12345678901234567890"), 1, 20, S("2345678901234567890abcdefghij"));
810     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 0, S("abcdefghij"));
811     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 1, S("1abcdefghij"));
812     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 5, S("12345abcdefghij"));
813     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 9, S("123456789abcdefghij"));
814     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 10, S("1234567890abcdefghij"));
815     test(S("abcdefghij"), 0, S("12345678901234567890"), 10, 11, S("1234567890abcdefghij"));
816     test(S("abcdefghij"), 0, S("12345678901234567890"), 19, 0, S("abcdefghij"));
817     test(S("abcdefghij"), 0, S("12345678901234567890"), 19, 1, S("0abcdefghij"));
818     test(S("abcdefghij"), 0, S("12345678901234567890"), 19, 2, S("0abcdefghij"));
819     test(S("abcdefghij"), 0, S("12345678901234567890"), 20, 0, S("abcdefghij"));
820     test(S("abcdefghij"), 0, S("12345678901234567890"), 20, 1, S("abcdefghij"));
821     test(S("abcdefghij"), 0, S("12345678901234567890"), 21, 0, S("can't happen"));
822     test(S("abcdefghij"), 1, S(""), 0, 0, S("abcdefghij"));
823     test(S("abcdefghij"), 1, S(""), 0, 1, S("abcdefghij"));
824     test(S("abcdefghij"), 1, S(""), 1, 0, S("can't happen"));
825     test(S("abcdefghij"), 1, S("12345"), 0, 0, S("abcdefghij"));
826     test(S("abcdefghij"), 1, S("12345"), 0, 1, S("a1bcdefghij"));
827     test(S("abcdefghij"), 1, S("12345"), 0, 2, S("a12bcdefghij"));
828     test(S("abcdefghij"), 1, S("12345"), 0, 4, S("a1234bcdefghij"));
829     test(S("abcdefghij"), 1, S("12345"), 0, 5, S("a12345bcdefghij"));
830     test(S("abcdefghij"), 1, S("12345"), 0, 6, S("a12345bcdefghij"));
831     test(S("abcdefghij"), 1, S("12345"), 1, 0, S("abcdefghij"));
832     test(S("abcdefghij"), 1, S("12345"), 1, 1, S("a2bcdefghij"));
833     test(S("abcdefghij"), 1, S("12345"), 1, 2, S("a23bcdefghij"));
834     test(S("abcdefghij"), 1, S("12345"), 1, 3, S("a234bcdefghij"));
835     test(S("abcdefghij"), 1, S("12345"), 1, 4, S("a2345bcdefghij"));
836     test(S("abcdefghij"), 1, S("12345"), 1, 5, S("a2345bcdefghij"));
837     test(S("abcdefghij"), 1, S("12345"), 2, 0, S("abcdefghij"));
838     test(S("abcdefghij"), 1, S("12345"), 2, 1, S("a3bcdefghij"));
839     test(S("abcdefghij"), 1, S("12345"), 2, 2, S("a34bcdefghij"));
840     test(S("abcdefghij"), 1, S("12345"), 2, 3, S("a345bcdefghij"));
841     test(S("abcdefghij"), 1, S("12345"), 2, 4, S("a345bcdefghij"));
842     test(S("abcdefghij"), 1, S("12345"), 4, 0, S("abcdefghij"));
843     test(S("abcdefghij"), 1, S("12345"), 4, 1, S("a5bcdefghij"));
844     test(S("abcdefghij"), 1, S("12345"), 4, 2, S("a5bcdefghij"));
845     test(S("abcdefghij"), 1, S("12345"), 5, 0, S("abcdefghij"));
846     test(S("abcdefghij"), 1, S("12345"), 5, 1, S("abcdefghij"));
847     test(S("abcdefghij"), 1, S("12345"), 6, 0, S("can't happen"));
848     test(S("abcdefghij"), 1, S("1234567890"), 0, 0, S("abcdefghij"));
849     test(S("abcdefghij"), 1, S("1234567890"), 0, 1, S("a1bcdefghij"));
850     test(S("abcdefghij"), 1, S("1234567890"), 0, 5, S("a12345bcdefghij"));
851     test(S("abcdefghij"), 1, S("1234567890"), 0, 9, S("a123456789bcdefghij"));
852     test(S("abcdefghij"), 1, S("1234567890"), 0, 10, S("a1234567890bcdefghij"));
853     test(S("abcdefghij"), 1, S("1234567890"), 0, 11, S("a1234567890bcdefghij"));
854     test(S("abcdefghij"), 1, S("1234567890"), 1, 0, S("abcdefghij"));
855     test(S("abcdefghij"), 1, S("1234567890"), 1, 1, S("a2bcdefghij"));
856 }
857 
858 template <class S>
test14()859 void test14()
860 {
861     test(S("abcdefghij"), 1, S("1234567890"), 1, 4, S("a2345bcdefghij"));
862     test(S("abcdefghij"), 1, S("1234567890"), 1, 8, S("a23456789bcdefghij"));
863     test(S("abcdefghij"), 1, S("1234567890"), 1, 9, S("a234567890bcdefghij"));
864     test(S("abcdefghij"), 1, S("1234567890"), 1, 10, S("a234567890bcdefghij"));
865     test(S("abcdefghij"), 1, S("1234567890"), 5, 0, S("abcdefghij"));
866     test(S("abcdefghij"), 1, S("1234567890"), 5, 1, S("a6bcdefghij"));
867     test(S("abcdefghij"), 1, S("1234567890"), 5, 2, S("a67bcdefghij"));
868     test(S("abcdefghij"), 1, S("1234567890"), 5, 4, S("a6789bcdefghij"));
869     test(S("abcdefghij"), 1, S("1234567890"), 5, 5, S("a67890bcdefghij"));
870     test(S("abcdefghij"), 1, S("1234567890"), 5, 6, S("a67890bcdefghij"));
871     test(S("abcdefghij"), 1, S("1234567890"), 9, 0, S("abcdefghij"));
872     test(S("abcdefghij"), 1, S("1234567890"), 9, 1, S("a0bcdefghij"));
873     test(S("abcdefghij"), 1, S("1234567890"), 9, 2, S("a0bcdefghij"));
874     test(S("abcdefghij"), 1, S("1234567890"), 10, 0, S("abcdefghij"));
875     test(S("abcdefghij"), 1, S("1234567890"), 10, 1, S("abcdefghij"));
876     test(S("abcdefghij"), 1, S("1234567890"), 11, 0, S("can't happen"));
877     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 0, S("abcdefghij"));
878     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 1, S("a1bcdefghij"));
879     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 10, S("a1234567890bcdefghij"));
880     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 19, S("a1234567890123456789bcdefghij"));
881     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 20, S("a12345678901234567890bcdefghij"));
882     test(S("abcdefghij"), 1, S("12345678901234567890"), 0, 21, S("a12345678901234567890bcdefghij"));
883     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 0, S("abcdefghij"));
884     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 1, S("a2bcdefghij"));
885     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 9, S("a234567890bcdefghij"));
886     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 18, S("a234567890123456789bcdefghij"));
887     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 19, S("a2345678901234567890bcdefghij"));
888     test(S("abcdefghij"), 1, S("12345678901234567890"), 1, 20, S("a2345678901234567890bcdefghij"));
889     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 0, S("abcdefghij"));
890     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 1, S("a1bcdefghij"));
891     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 5, S("a12345bcdefghij"));
892     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 9, S("a123456789bcdefghij"));
893     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 10, S("a1234567890bcdefghij"));
894     test(S("abcdefghij"), 1, S("12345678901234567890"), 10, 11, S("a1234567890bcdefghij"));
895     test(S("abcdefghij"), 1, S("12345678901234567890"), 19, 0, S("abcdefghij"));
896     test(S("abcdefghij"), 1, S("12345678901234567890"), 19, 1, S("a0bcdefghij"));
897     test(S("abcdefghij"), 1, S("12345678901234567890"), 19, 2, S("a0bcdefghij"));
898     test(S("abcdefghij"), 1, S("12345678901234567890"), 20, 0, S("abcdefghij"));
899     test(S("abcdefghij"), 1, S("12345678901234567890"), 20, 1, S("abcdefghij"));
900     test(S("abcdefghij"), 1, S("12345678901234567890"), 21, 0, S("can't happen"));
901     test(S("abcdefghij"), 5, S(""), 0, 0, S("abcdefghij"));
902     test(S("abcdefghij"), 5, S(""), 0, 1, S("abcdefghij"));
903     test(S("abcdefghij"), 5, S(""), 1, 0, S("can't happen"));
904     test(S("abcdefghij"), 5, S("12345"), 0, 0, S("abcdefghij"));
905     test(S("abcdefghij"), 5, S("12345"), 0, 1, S("abcde1fghij"));
906     test(S("abcdefghij"), 5, S("12345"), 0, 2, S("abcde12fghij"));
907     test(S("abcdefghij"), 5, S("12345"), 0, 4, S("abcde1234fghij"));
908     test(S("abcdefghij"), 5, S("12345"), 0, 5, S("abcde12345fghij"));
909     test(S("abcdefghij"), 5, S("12345"), 0, 6, S("abcde12345fghij"));
910     test(S("abcdefghij"), 5, S("12345"), 1, 0, S("abcdefghij"));
911 }
912 
913 template <class S>
test15()914 void test15()
915 {
916     test(S("abcdefghij"), 5, S("12345"), 1, 1, S("abcde2fghij"));
917     test(S("abcdefghij"), 5, S("12345"), 1, 2, S("abcde23fghij"));
918     test(S("abcdefghij"), 5, S("12345"), 1, 3, S("abcde234fghij"));
919     test(S("abcdefghij"), 5, S("12345"), 1, 4, S("abcde2345fghij"));
920     test(S("abcdefghij"), 5, S("12345"), 1, 5, S("abcde2345fghij"));
921     test(S("abcdefghij"), 5, S("12345"), 2, 0, S("abcdefghij"));
922     test(S("abcdefghij"), 5, S("12345"), 2, 1, S("abcde3fghij"));
923     test(S("abcdefghij"), 5, S("12345"), 2, 2, S("abcde34fghij"));
924     test(S("abcdefghij"), 5, S("12345"), 2, 3, S("abcde345fghij"));
925     test(S("abcdefghij"), 5, S("12345"), 2, 4, S("abcde345fghij"));
926     test(S("abcdefghij"), 5, S("12345"), 4, 0, S("abcdefghij"));
927     test(S("abcdefghij"), 5, S("12345"), 4, 1, S("abcde5fghij"));
928     test(S("abcdefghij"), 5, S("12345"), 4, 2, S("abcde5fghij"));
929     test(S("abcdefghij"), 5, S("12345"), 5, 0, S("abcdefghij"));
930     test(S("abcdefghij"), 5, S("12345"), 5, 1, S("abcdefghij"));
931     test(S("abcdefghij"), 5, S("12345"), 6, 0, S("can't happen"));
932     test(S("abcdefghij"), 5, S("1234567890"), 0, 0, S("abcdefghij"));
933     test(S("abcdefghij"), 5, S("1234567890"), 0, 1, S("abcde1fghij"));
934     test(S("abcdefghij"), 5, S("1234567890"), 0, 5, S("abcde12345fghij"));
935     test(S("abcdefghij"), 5, S("1234567890"), 0, 9, S("abcde123456789fghij"));
936     test(S("abcdefghij"), 5, S("1234567890"), 0, 10, S("abcde1234567890fghij"));
937     test(S("abcdefghij"), 5, S("1234567890"), 0, 11, S("abcde1234567890fghij"));
938     test(S("abcdefghij"), 5, S("1234567890"), 1, 0, S("abcdefghij"));
939     test(S("abcdefghij"), 5, S("1234567890"), 1, 1, S("abcde2fghij"));
940     test(S("abcdefghij"), 5, S("1234567890"), 1, 4, S("abcde2345fghij"));
941     test(S("abcdefghij"), 5, S("1234567890"), 1, 8, S("abcde23456789fghij"));
942     test(S("abcdefghij"), 5, S("1234567890"), 1, 9, S("abcde234567890fghij"));
943     test(S("abcdefghij"), 5, S("1234567890"), 1, 10, S("abcde234567890fghij"));
944     test(S("abcdefghij"), 5, S("1234567890"), 5, 0, S("abcdefghij"));
945     test(S("abcdefghij"), 5, S("1234567890"), 5, 1, S("abcde6fghij"));
946     test(S("abcdefghij"), 5, S("1234567890"), 5, 2, S("abcde67fghij"));
947     test(S("abcdefghij"), 5, S("1234567890"), 5, 4, S("abcde6789fghij"));
948     test(S("abcdefghij"), 5, S("1234567890"), 5, 5, S("abcde67890fghij"));
949     test(S("abcdefghij"), 5, S("1234567890"), 5, 6, S("abcde67890fghij"));
950     test(S("abcdefghij"), 5, S("1234567890"), 9, 0, S("abcdefghij"));
951     test(S("abcdefghij"), 5, S("1234567890"), 9, 1, S("abcde0fghij"));
952     test(S("abcdefghij"), 5, S("1234567890"), 9, 2, S("abcde0fghij"));
953     test(S("abcdefghij"), 5, S("1234567890"), 10, 0, S("abcdefghij"));
954     test(S("abcdefghij"), 5, S("1234567890"), 10, 1, S("abcdefghij"));
955     test(S("abcdefghij"), 5, S("1234567890"), 11, 0, S("can't happen"));
956     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 0, S("abcdefghij"));
957     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 1, S("abcde1fghij"));
958     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 10, S("abcde1234567890fghij"));
959     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 19, S("abcde1234567890123456789fghij"));
960     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 20, S("abcde12345678901234567890fghij"));
961     test(S("abcdefghij"), 5, S("12345678901234567890"), 0, 21, S("abcde12345678901234567890fghij"));
962     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 0, S("abcdefghij"));
963     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 1, S("abcde2fghij"));
964     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 9, S("abcde234567890fghij"));
965     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 18, S("abcde234567890123456789fghij"));
966 }
967 
968 template <class S>
test16()969 void test16()
970 {
971     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 19, S("abcde2345678901234567890fghij"));
972     test(S("abcdefghij"), 5, S("12345678901234567890"), 1, 20, S("abcde2345678901234567890fghij"));
973     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 0, S("abcdefghij"));
974     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 1, S("abcde1fghij"));
975     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 5, S("abcde12345fghij"));
976     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 9, S("abcde123456789fghij"));
977     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 10, S("abcde1234567890fghij"));
978     test(S("abcdefghij"), 5, S("12345678901234567890"), 10, 11, S("abcde1234567890fghij"));
979     test(S("abcdefghij"), 5, S("12345678901234567890"), 19, 0, S("abcdefghij"));
980     test(S("abcdefghij"), 5, S("12345678901234567890"), 19, 1, S("abcde0fghij"));
981     test(S("abcdefghij"), 5, S("12345678901234567890"), 19, 2, S("abcde0fghij"));
982     test(S("abcdefghij"), 5, S("12345678901234567890"), 20, 0, S("abcdefghij"));
983     test(S("abcdefghij"), 5, S("12345678901234567890"), 20, 1, S("abcdefghij"));
984     test(S("abcdefghij"), 5, S("12345678901234567890"), 21, 0, S("can't happen"));
985     test(S("abcdefghij"), 9, S(""), 0, 0, S("abcdefghij"));
986     test(S("abcdefghij"), 9, S(""), 0, 1, S("abcdefghij"));
987     test(S("abcdefghij"), 9, S(""), 1, 0, S("can't happen"));
988     test(S("abcdefghij"), 9, S("12345"), 0, 0, S("abcdefghij"));
989     test(S("abcdefghij"), 9, S("12345"), 0, 1, S("abcdefghi1j"));
990     test(S("abcdefghij"), 9, S("12345"), 0, 2, S("abcdefghi12j"));
991     test(S("abcdefghij"), 9, S("12345"), 0, 4, S("abcdefghi1234j"));
992     test(S("abcdefghij"), 9, S("12345"), 0, 5, S("abcdefghi12345j"));
993     test(S("abcdefghij"), 9, S("12345"), 0, 6, S("abcdefghi12345j"));
994     test(S("abcdefghij"), 9, S("12345"), 1, 0, S("abcdefghij"));
995     test(S("abcdefghij"), 9, S("12345"), 1, 1, S("abcdefghi2j"));
996     test(S("abcdefghij"), 9, S("12345"), 1, 2, S("abcdefghi23j"));
997     test(S("abcdefghij"), 9, S("12345"), 1, 3, S("abcdefghi234j"));
998     test(S("abcdefghij"), 9, S("12345"), 1, 4, S("abcdefghi2345j"));
999     test(S("abcdefghij"), 9, S("12345"), 1, 5, S("abcdefghi2345j"));
1000     test(S("abcdefghij"), 9, S("12345"), 2, 0, S("abcdefghij"));
1001     test(S("abcdefghij"), 9, S("12345"), 2, 1, S("abcdefghi3j"));
1002     test(S("abcdefghij"), 9, S("12345"), 2, 2, S("abcdefghi34j"));
1003     test(S("abcdefghij"), 9, S("12345"), 2, 3, S("abcdefghi345j"));
1004     test(S("abcdefghij"), 9, S("12345"), 2, 4, S("abcdefghi345j"));
1005     test(S("abcdefghij"), 9, S("12345"), 4, 0, S("abcdefghij"));
1006     test(S("abcdefghij"), 9, S("12345"), 4, 1, S("abcdefghi5j"));
1007     test(S("abcdefghij"), 9, S("12345"), 4, 2, S("abcdefghi5j"));
1008     test(S("abcdefghij"), 9, S("12345"), 5, 0, S("abcdefghij"));
1009     test(S("abcdefghij"), 9, S("12345"), 5, 1, S("abcdefghij"));
1010     test(S("abcdefghij"), 9, S("12345"), 6, 0, S("can't happen"));
1011     test(S("abcdefghij"), 9, S("1234567890"), 0, 0, S("abcdefghij"));
1012     test(S("abcdefghij"), 9, S("1234567890"), 0, 1, S("abcdefghi1j"));
1013     test(S("abcdefghij"), 9, S("1234567890"), 0, 5, S("abcdefghi12345j"));
1014     test(S("abcdefghij"), 9, S("1234567890"), 0, 9, S("abcdefghi123456789j"));
1015     test(S("abcdefghij"), 9, S("1234567890"), 0, 10, S("abcdefghi1234567890j"));
1016     test(S("abcdefghij"), 9, S("1234567890"), 0, 11, S("abcdefghi1234567890j"));
1017     test(S("abcdefghij"), 9, S("1234567890"), 1, 0, S("abcdefghij"));
1018     test(S("abcdefghij"), 9, S("1234567890"), 1, 1, S("abcdefghi2j"));
1019     test(S("abcdefghij"), 9, S("1234567890"), 1, 4, S("abcdefghi2345j"));
1020     test(S("abcdefghij"), 9, S("1234567890"), 1, 8, S("abcdefghi23456789j"));
1021 }
1022 
1023 template <class S>
test17()1024 void test17()
1025 {
1026     test(S("abcdefghij"), 9, S("1234567890"), 1, 9, S("abcdefghi234567890j"));
1027     test(S("abcdefghij"), 9, S("1234567890"), 1, 10, S("abcdefghi234567890j"));
1028     test(S("abcdefghij"), 9, S("1234567890"), 5, 0, S("abcdefghij"));
1029     test(S("abcdefghij"), 9, S("1234567890"), 5, 1, S("abcdefghi6j"));
1030     test(S("abcdefghij"), 9, S("1234567890"), 5, 2, S("abcdefghi67j"));
1031     test(S("abcdefghij"), 9, S("1234567890"), 5, 4, S("abcdefghi6789j"));
1032     test(S("abcdefghij"), 9, S("1234567890"), 5, 5, S("abcdefghi67890j"));
1033     test(S("abcdefghij"), 9, S("1234567890"), 5, 6, S("abcdefghi67890j"));
1034     test(S("abcdefghij"), 9, S("1234567890"), 9, 0, S("abcdefghij"));
1035     test(S("abcdefghij"), 9, S("1234567890"), 9, 1, S("abcdefghi0j"));
1036     test(S("abcdefghij"), 9, S("1234567890"), 9, 2, S("abcdefghi0j"));
1037     test(S("abcdefghij"), 9, S("1234567890"), 10, 0, S("abcdefghij"));
1038     test(S("abcdefghij"), 9, S("1234567890"), 10, 1, S("abcdefghij"));
1039     test(S("abcdefghij"), 9, S("1234567890"), 11, 0, S("can't happen"));
1040     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 0, S("abcdefghij"));
1041     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 1, S("abcdefghi1j"));
1042     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 10, S("abcdefghi1234567890j"));
1043     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 19, S("abcdefghi1234567890123456789j"));
1044     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 20, S("abcdefghi12345678901234567890j"));
1045     test(S("abcdefghij"), 9, S("12345678901234567890"), 0, 21, S("abcdefghi12345678901234567890j"));
1046     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 0, S("abcdefghij"));
1047     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 1, S("abcdefghi2j"));
1048     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 9, S("abcdefghi234567890j"));
1049     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 18, S("abcdefghi234567890123456789j"));
1050     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 19, S("abcdefghi2345678901234567890j"));
1051     test(S("abcdefghij"), 9, S("12345678901234567890"), 1, 20, S("abcdefghi2345678901234567890j"));
1052     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 0, S("abcdefghij"));
1053     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 1, S("abcdefghi1j"));
1054     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 5, S("abcdefghi12345j"));
1055     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 9, S("abcdefghi123456789j"));
1056     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 10, S("abcdefghi1234567890j"));
1057     test(S("abcdefghij"), 9, S("12345678901234567890"), 10, 11, S("abcdefghi1234567890j"));
1058     test(S("abcdefghij"), 9, S("12345678901234567890"), 19, 0, S("abcdefghij"));
1059     test(S("abcdefghij"), 9, S("12345678901234567890"), 19, 1, S("abcdefghi0j"));
1060     test(S("abcdefghij"), 9, S("12345678901234567890"), 19, 2, S("abcdefghi0j"));
1061     test(S("abcdefghij"), 9, S("12345678901234567890"), 20, 0, S("abcdefghij"));
1062     test(S("abcdefghij"), 9, S("12345678901234567890"), 20, 1, S("abcdefghij"));
1063     test(S("abcdefghij"), 9, S("12345678901234567890"), 21, 0, S("can't happen"));
1064     test(S("abcdefghij"), 10, S(""), 0, 0, S("abcdefghij"));
1065     test(S("abcdefghij"), 10, S(""), 0, 1, S("abcdefghij"));
1066     test(S("abcdefghij"), 10, S(""), 1, 0, S("can't happen"));
1067     test(S("abcdefghij"), 10, S("12345"), 0, 0, S("abcdefghij"));
1068     test(S("abcdefghij"), 10, S("12345"), 0, 1, S("abcdefghij1"));
1069     test(S("abcdefghij"), 10, S("12345"), 0, 2, S("abcdefghij12"));
1070     test(S("abcdefghij"), 10, S("12345"), 0, 4, S("abcdefghij1234"));
1071     test(S("abcdefghij"), 10, S("12345"), 0, 5, S("abcdefghij12345"));
1072     test(S("abcdefghij"), 10, S("12345"), 0, 6, S("abcdefghij12345"));
1073     test(S("abcdefghij"), 10, S("12345"), 1, 0, S("abcdefghij"));
1074     test(S("abcdefghij"), 10, S("12345"), 1, 1, S("abcdefghij2"));
1075     test(S("abcdefghij"), 10, S("12345"), 1, 2, S("abcdefghij23"));
1076 }
1077 
1078 template <class S>
test18()1079 void test18()
1080 {
1081     test(S("abcdefghij"), 10, S("12345"), 1, 3, S("abcdefghij234"));
1082     test(S("abcdefghij"), 10, S("12345"), 1, 4, S("abcdefghij2345"));
1083     test(S("abcdefghij"), 10, S("12345"), 1, 5, S("abcdefghij2345"));
1084     test(S("abcdefghij"), 10, S("12345"), 2, 0, S("abcdefghij"));
1085     test(S("abcdefghij"), 10, S("12345"), 2, 1, S("abcdefghij3"));
1086     test(S("abcdefghij"), 10, S("12345"), 2, 2, S("abcdefghij34"));
1087     test(S("abcdefghij"), 10, S("12345"), 2, 3, S("abcdefghij345"));
1088     test(S("abcdefghij"), 10, S("12345"), 2, 4, S("abcdefghij345"));
1089     test(S("abcdefghij"), 10, S("12345"), 4, 0, S("abcdefghij"));
1090     test(S("abcdefghij"), 10, S("12345"), 4, 1, S("abcdefghij5"));
1091     test(S("abcdefghij"), 10, S("12345"), 4, 2, S("abcdefghij5"));
1092     test(S("abcdefghij"), 10, S("12345"), 5, 0, S("abcdefghij"));
1093     test(S("abcdefghij"), 10, S("12345"), 5, 1, S("abcdefghij"));
1094     test(S("abcdefghij"), 10, S("12345"), 6, 0, S("can't happen"));
1095     test(S("abcdefghij"), 10, S("1234567890"), 0, 0, S("abcdefghij"));
1096     test(S("abcdefghij"), 10, S("1234567890"), 0, 1, S("abcdefghij1"));
1097     test(S("abcdefghij"), 10, S("1234567890"), 0, 5, S("abcdefghij12345"));
1098     test(S("abcdefghij"), 10, S("1234567890"), 0, 9, S("abcdefghij123456789"));
1099     test(S("abcdefghij"), 10, S("1234567890"), 0, 10, S("abcdefghij1234567890"));
1100     test(S("abcdefghij"), 10, S("1234567890"), 0, 11, S("abcdefghij1234567890"));
1101     test(S("abcdefghij"), 10, S("1234567890"), 1, 0, S("abcdefghij"));
1102     test(S("abcdefghij"), 10, S("1234567890"), 1, 1, S("abcdefghij2"));
1103     test(S("abcdefghij"), 10, S("1234567890"), 1, 4, S("abcdefghij2345"));
1104     test(S("abcdefghij"), 10, S("1234567890"), 1, 8, S("abcdefghij23456789"));
1105     test(S("abcdefghij"), 10, S("1234567890"), 1, 9, S("abcdefghij234567890"));
1106     test(S("abcdefghij"), 10, S("1234567890"), 1, 10, S("abcdefghij234567890"));
1107     test(S("abcdefghij"), 10, S("1234567890"), 5, 0, S("abcdefghij"));
1108     test(S("abcdefghij"), 10, S("1234567890"), 5, 1, S("abcdefghij6"));
1109     test(S("abcdefghij"), 10, S("1234567890"), 5, 2, S("abcdefghij67"));
1110     test(S("abcdefghij"), 10, S("1234567890"), 5, 4, S("abcdefghij6789"));
1111     test(S("abcdefghij"), 10, S("1234567890"), 5, 5, S("abcdefghij67890"));
1112     test(S("abcdefghij"), 10, S("1234567890"), 5, 6, S("abcdefghij67890"));
1113     test(S("abcdefghij"), 10, S("1234567890"), 9, 0, S("abcdefghij"));
1114     test(S("abcdefghij"), 10, S("1234567890"), 9, 1, S("abcdefghij0"));
1115     test(S("abcdefghij"), 10, S("1234567890"), 9, 2, S("abcdefghij0"));
1116     test(S("abcdefghij"), 10, S("1234567890"), 10, 0, S("abcdefghij"));
1117     test(S("abcdefghij"), 10, S("1234567890"), 10, 1, S("abcdefghij"));
1118     test(S("abcdefghij"), 10, S("1234567890"), 11, 0, S("can't happen"));
1119     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 0, S("abcdefghij"));
1120     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 1, S("abcdefghij1"));
1121     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890"));
1122     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789"));
1123     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890"));
1124     test(S("abcdefghij"), 10, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890"));
1125     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 0, S("abcdefghij"));
1126     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 1, S("abcdefghij2"));
1127     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 9, S("abcdefghij234567890"));
1128     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789"));
1129     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890"));
1130     test(S("abcdefghij"), 10, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890"));
1131 }
1132 
1133 template <class S>
test19()1134 void test19()
1135 {
1136     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 0, S("abcdefghij"));
1137     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 1, S("abcdefghij1"));
1138     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 5, S("abcdefghij12345"));
1139     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 9, S("abcdefghij123456789"));
1140     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890"));
1141     test(S("abcdefghij"), 10, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890"));
1142     test(S("abcdefghij"), 10, S("12345678901234567890"), 19, 0, S("abcdefghij"));
1143     test(S("abcdefghij"), 10, S("12345678901234567890"), 19, 1, S("abcdefghij0"));
1144     test(S("abcdefghij"), 10, S("12345678901234567890"), 19, 2, S("abcdefghij0"));
1145     test(S("abcdefghij"), 10, S("12345678901234567890"), 20, 0, S("abcdefghij"));
1146     test(S("abcdefghij"), 10, S("12345678901234567890"), 20, 1, S("abcdefghij"));
1147     test(S("abcdefghij"), 10, S("12345678901234567890"), 21, 0, S("can't happen"));
1148     test(S("abcdefghij"), 11, S(""), 0, 0, S("can't happen"));
1149     test(S("abcdefghij"), 11, S(""), 0, 1, S("can't happen"));
1150     test(S("abcdefghij"), 11, S(""), 1, 0, S("can't happen"));
1151     test(S("abcdefghij"), 11, S("12345"), 0, 0, S("can't happen"));
1152     test(S("abcdefghij"), 11, S("12345"), 0, 1, S("can't happen"));
1153     test(S("abcdefghij"), 11, S("12345"), 0, 2, S("can't happen"));
1154     test(S("abcdefghij"), 11, S("12345"), 0, 4, S("can't happen"));
1155     test(S("abcdefghij"), 11, S("12345"), 0, 5, S("can't happen"));
1156     test(S("abcdefghij"), 11, S("12345"), 0, 6, S("can't happen"));
1157     test(S("abcdefghij"), 11, S("12345"), 1, 0, S("can't happen"));
1158     test(S("abcdefghij"), 11, S("12345"), 1, 1, S("can't happen"));
1159     test(S("abcdefghij"), 11, S("12345"), 1, 2, S("can't happen"));
1160     test(S("abcdefghij"), 11, S("12345"), 1, 3, S("can't happen"));
1161     test(S("abcdefghij"), 11, S("12345"), 1, 4, S("can't happen"));
1162     test(S("abcdefghij"), 11, S("12345"), 1, 5, S("can't happen"));
1163     test(S("abcdefghij"), 11, S("12345"), 2, 0, S("can't happen"));
1164     test(S("abcdefghij"), 11, S("12345"), 2, 1, S("can't happen"));
1165     test(S("abcdefghij"), 11, S("12345"), 2, 2, S("can't happen"));
1166     test(S("abcdefghij"), 11, S("12345"), 2, 3, S("can't happen"));
1167     test(S("abcdefghij"), 11, S("12345"), 2, 4, S("can't happen"));
1168     test(S("abcdefghij"), 11, S("12345"), 4, 0, S("can't happen"));
1169     test(S("abcdefghij"), 11, S("12345"), 4, 1, S("can't happen"));
1170     test(S("abcdefghij"), 11, S("12345"), 4, 2, S("can't happen"));
1171     test(S("abcdefghij"), 11, S("12345"), 5, 0, S("can't happen"));
1172     test(S("abcdefghij"), 11, S("12345"), 5, 1, S("can't happen"));
1173     test(S("abcdefghij"), 11, S("12345"), 6, 0, S("can't happen"));
1174     test(S("abcdefghij"), 11, S("1234567890"), 0, 0, S("can't happen"));
1175     test(S("abcdefghij"), 11, S("1234567890"), 0, 1, S("can't happen"));
1176     test(S("abcdefghij"), 11, S("1234567890"), 0, 5, S("can't happen"));
1177     test(S("abcdefghij"), 11, S("1234567890"), 0, 9, S("can't happen"));
1178     test(S("abcdefghij"), 11, S("1234567890"), 0, 10, S("can't happen"));
1179     test(S("abcdefghij"), 11, S("1234567890"), 0, 11, S("can't happen"));
1180     test(S("abcdefghij"), 11, S("1234567890"), 1, 0, S("can't happen"));
1181     test(S("abcdefghij"), 11, S("1234567890"), 1, 1, S("can't happen"));
1182     test(S("abcdefghij"), 11, S("1234567890"), 1, 4, S("can't happen"));
1183     test(S("abcdefghij"), 11, S("1234567890"), 1, 8, S("can't happen"));
1184     test(S("abcdefghij"), 11, S("1234567890"), 1, 9, S("can't happen"));
1185     test(S("abcdefghij"), 11, S("1234567890"), 1, 10, S("can't happen"));
1186 }
1187 
1188 template <class S>
test20()1189 void test20()
1190 {
1191     test(S("abcdefghij"), 11, S("1234567890"), 5, 0, S("can't happen"));
1192     test(S("abcdefghij"), 11, S("1234567890"), 5, 1, S("can't happen"));
1193     test(S("abcdefghij"), 11, S("1234567890"), 5, 2, S("can't happen"));
1194     test(S("abcdefghij"), 11, S("1234567890"), 5, 4, S("can't happen"));
1195     test(S("abcdefghij"), 11, S("1234567890"), 5, 5, S("can't happen"));
1196     test(S("abcdefghij"), 11, S("1234567890"), 5, 6, S("can't happen"));
1197     test(S("abcdefghij"), 11, S("1234567890"), 9, 0, S("can't happen"));
1198     test(S("abcdefghij"), 11, S("1234567890"), 9, 1, S("can't happen"));
1199     test(S("abcdefghij"), 11, S("1234567890"), 9, 2, S("can't happen"));
1200     test(S("abcdefghij"), 11, S("1234567890"), 10, 0, S("can't happen"));
1201     test(S("abcdefghij"), 11, S("1234567890"), 10, 1, S("can't happen"));
1202     test(S("abcdefghij"), 11, S("1234567890"), 11, 0, S("can't happen"));
1203     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 0, S("can't happen"));
1204     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 1, S("can't happen"));
1205     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 10, S("can't happen"));
1206     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 19, S("can't happen"));
1207     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 20, S("can't happen"));
1208     test(S("abcdefghij"), 11, S("12345678901234567890"), 0, 21, S("can't happen"));
1209     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 0, S("can't happen"));
1210     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 1, S("can't happen"));
1211     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 9, S("can't happen"));
1212     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 18, S("can't happen"));
1213     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 19, S("can't happen"));
1214     test(S("abcdefghij"), 11, S("12345678901234567890"), 1, 20, S("can't happen"));
1215     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 0, S("can't happen"));
1216     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 1, S("can't happen"));
1217     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 5, S("can't happen"));
1218     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 9, S("can't happen"));
1219     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 10, S("can't happen"));
1220     test(S("abcdefghij"), 11, S("12345678901234567890"), 10, 11, S("can't happen"));
1221     test(S("abcdefghij"), 11, S("12345678901234567890"), 19, 0, S("can't happen"));
1222     test(S("abcdefghij"), 11, S("12345678901234567890"), 19, 1, S("can't happen"));
1223     test(S("abcdefghij"), 11, S("12345678901234567890"), 19, 2, S("can't happen"));
1224     test(S("abcdefghij"), 11, S("12345678901234567890"), 20, 0, S("can't happen"));
1225     test(S("abcdefghij"), 11, S("12345678901234567890"), 20, 1, S("can't happen"));
1226     test(S("abcdefghij"), 11, S("12345678901234567890"), 21, 0, S("can't happen"));
1227     test(S("abcdefghijklmnopqrst"), 0, S(""), 0, 0, S("abcdefghijklmnopqrst"));
1228     test(S("abcdefghijklmnopqrst"), 0, S(""), 0, 1, S("abcdefghijklmnopqrst"));
1229     test(S("abcdefghijklmnopqrst"), 0, S(""), 1, 0, S("can't happen"));
1230     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
1231     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 1, S("1abcdefghijklmnopqrst"));
1232     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 2, S("12abcdefghijklmnopqrst"));
1233     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 4, S("1234abcdefghijklmnopqrst"));
1234     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 5, S("12345abcdefghijklmnopqrst"));
1235     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 0, 6, S("12345abcdefghijklmnopqrst"));
1236     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
1237     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 1, S("2abcdefghijklmnopqrst"));
1238     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 2, S("23abcdefghijklmnopqrst"));
1239     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 3, S("234abcdefghijklmnopqrst"));
1240     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 4, S("2345abcdefghijklmnopqrst"));
1241 }
1242 
1243 template <class S>
test21()1244 void test21()
1245 {
1246     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 1, 5, S("2345abcdefghijklmnopqrst"));
1247     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
1248     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 1, S("3abcdefghijklmnopqrst"));
1249     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 2, S("34abcdefghijklmnopqrst"));
1250     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 3, S("345abcdefghijklmnopqrst"));
1251     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 2, 4, S("345abcdefghijklmnopqrst"));
1252     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
1253     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 4, 1, S("5abcdefghijklmnopqrst"));
1254     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 4, 2, S("5abcdefghijklmnopqrst"));
1255     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
1256     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
1257     test(S("abcdefghijklmnopqrst"), 0, S("12345"), 6, 0, S("can't happen"));
1258     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1259     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 1, S("1abcdefghijklmnopqrst"));
1260     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 5, S("12345abcdefghijklmnopqrst"));
1261     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 9, S("123456789abcdefghijklmnopqrst"));
1262     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 10, S("1234567890abcdefghijklmnopqrst"));
1263     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 0, 11, S("1234567890abcdefghijklmnopqrst"));
1264     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1265     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 1, S("2abcdefghijklmnopqrst"));
1266     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 4, S("2345abcdefghijklmnopqrst"));
1267     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 8, S("23456789abcdefghijklmnopqrst"));
1268     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 9, S("234567890abcdefghijklmnopqrst"));
1269     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 1, 10, S("234567890abcdefghijklmnopqrst"));
1270     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
1271     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 1, S("6abcdefghijklmnopqrst"));
1272     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 2, S("67abcdefghijklmnopqrst"));
1273     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 4, S("6789abcdefghijklmnopqrst"));
1274     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 5, S("67890abcdefghijklmnopqrst"));
1275     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 5, 6, S("67890abcdefghijklmnopqrst"));
1276     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
1277     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 9, 1, S("0abcdefghijklmnopqrst"));
1278     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 9, 2, S("0abcdefghijklmnopqrst"));
1279     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1280     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
1281     test(S("abcdefghijklmnopqrst"), 0, S("1234567890"), 11, 0, S("can't happen"));
1282     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1283     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 1, S("1abcdefghijklmnopqrst"));
1284     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 10, S("1234567890abcdefghijklmnopqrst"));
1285     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 19, S("1234567890123456789abcdefghijklmnopqrst"));
1286     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 20, S("12345678901234567890abcdefghijklmnopqrst"));
1287     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 0, 21, S("12345678901234567890abcdefghijklmnopqrst"));
1288     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1289     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 1, S("2abcdefghijklmnopqrst"));
1290     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 9, S("234567890abcdefghijklmnopqrst"));
1291     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 18, S("234567890123456789abcdefghijklmnopqrst"));
1292     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 19, S("2345678901234567890abcdefghijklmnopqrst"));
1293     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 1, 20, S("2345678901234567890abcdefghijklmnopqrst"));
1294     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1295     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 1, S("1abcdefghijklmnopqrst"));
1296 }
1297 
1298 template <class S>
test22()1299 void test22()
1300 {
1301     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 5, S("12345abcdefghijklmnopqrst"));
1302     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 9, S("123456789abcdefghijklmnopqrst"));
1303     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 10, S("1234567890abcdefghijklmnopqrst"));
1304     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 10, 11, S("1234567890abcdefghijklmnopqrst"));
1305     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
1306     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 19, 1, S("0abcdefghijklmnopqrst"));
1307     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 19, 2, S("0abcdefghijklmnopqrst"));
1308     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
1309     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
1310     test(S("abcdefghijklmnopqrst"), 0, S("12345678901234567890"), 21, 0, S("can't happen"));
1311     test(S("abcdefghijklmnopqrst"), 1, S(""), 0, 0, S("abcdefghijklmnopqrst"));
1312     test(S("abcdefghijklmnopqrst"), 1, S(""), 0, 1, S("abcdefghijklmnopqrst"));
1313     test(S("abcdefghijklmnopqrst"), 1, S(""), 1, 0, S("can't happen"));
1314     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
1315     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 1, S("a1bcdefghijklmnopqrst"));
1316     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 2, S("a12bcdefghijklmnopqrst"));
1317     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 4, S("a1234bcdefghijklmnopqrst"));
1318     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 5, S("a12345bcdefghijklmnopqrst"));
1319     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 0, 6, S("a12345bcdefghijklmnopqrst"));
1320     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
1321     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 1, S("a2bcdefghijklmnopqrst"));
1322     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 2, S("a23bcdefghijklmnopqrst"));
1323     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 3, S("a234bcdefghijklmnopqrst"));
1324     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 4, S("a2345bcdefghijklmnopqrst"));
1325     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 1, 5, S("a2345bcdefghijklmnopqrst"));
1326     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
1327     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 1, S("a3bcdefghijklmnopqrst"));
1328     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 2, S("a34bcdefghijklmnopqrst"));
1329     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 3, S("a345bcdefghijklmnopqrst"));
1330     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 2, 4, S("a345bcdefghijklmnopqrst"));
1331     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
1332     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 4, 1, S("a5bcdefghijklmnopqrst"));
1333     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 4, 2, S("a5bcdefghijklmnopqrst"));
1334     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
1335     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
1336     test(S("abcdefghijklmnopqrst"), 1, S("12345"), 6, 0, S("can't happen"));
1337     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1338     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 1, S("a1bcdefghijklmnopqrst"));
1339     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 5, S("a12345bcdefghijklmnopqrst"));
1340     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 9, S("a123456789bcdefghijklmnopqrst"));
1341     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 10, S("a1234567890bcdefghijklmnopqrst"));
1342     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 0, 11, S("a1234567890bcdefghijklmnopqrst"));
1343     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1344     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 1, S("a2bcdefghijklmnopqrst"));
1345     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 4, S("a2345bcdefghijklmnopqrst"));
1346     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 8, S("a23456789bcdefghijklmnopqrst"));
1347     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 9, S("a234567890bcdefghijklmnopqrst"));
1348     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 1, 10, S("a234567890bcdefghijklmnopqrst"));
1349     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
1350     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 1, S("a6bcdefghijklmnopqrst"));
1351 }
1352 
1353 template <class S>
test23()1354 void test23()
1355 {
1356     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 2, S("a67bcdefghijklmnopqrst"));
1357     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 4, S("a6789bcdefghijklmnopqrst"));
1358     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 5, S("a67890bcdefghijklmnopqrst"));
1359     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 5, 6, S("a67890bcdefghijklmnopqrst"));
1360     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
1361     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 9, 1, S("a0bcdefghijklmnopqrst"));
1362     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 9, 2, S("a0bcdefghijklmnopqrst"));
1363     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1364     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
1365     test(S("abcdefghijklmnopqrst"), 1, S("1234567890"), 11, 0, S("can't happen"));
1366     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1367     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 1, S("a1bcdefghijklmnopqrst"));
1368     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 10, S("a1234567890bcdefghijklmnopqrst"));
1369     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 19, S("a1234567890123456789bcdefghijklmnopqrst"));
1370     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 20, S("a12345678901234567890bcdefghijklmnopqrst"));
1371     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 0, 21, S("a12345678901234567890bcdefghijklmnopqrst"));
1372     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1373     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 1, S("a2bcdefghijklmnopqrst"));
1374     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 9, S("a234567890bcdefghijklmnopqrst"));
1375     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 18, S("a234567890123456789bcdefghijklmnopqrst"));
1376     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 19, S("a2345678901234567890bcdefghijklmnopqrst"));
1377     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 1, 20, S("a2345678901234567890bcdefghijklmnopqrst"));
1378     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1379     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 1, S("a1bcdefghijklmnopqrst"));
1380     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 5, S("a12345bcdefghijklmnopqrst"));
1381     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 9, S("a123456789bcdefghijklmnopqrst"));
1382     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 10, S("a1234567890bcdefghijklmnopqrst"));
1383     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 10, 11, S("a1234567890bcdefghijklmnopqrst"));
1384     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
1385     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 19, 1, S("a0bcdefghijklmnopqrst"));
1386     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 19, 2, S("a0bcdefghijklmnopqrst"));
1387     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
1388     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
1389     test(S("abcdefghijklmnopqrst"), 1, S("12345678901234567890"), 21, 0, S("can't happen"));
1390     test(S("abcdefghijklmnopqrst"), 10, S(""), 0, 0, S("abcdefghijklmnopqrst"));
1391     test(S("abcdefghijklmnopqrst"), 10, S(""), 0, 1, S("abcdefghijklmnopqrst"));
1392     test(S("abcdefghijklmnopqrst"), 10, S(""), 1, 0, S("can't happen"));
1393     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
1394     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 1, S("abcdefghij1klmnopqrst"));
1395     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 2, S("abcdefghij12klmnopqrst"));
1396     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 4, S("abcdefghij1234klmnopqrst"));
1397     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 5, S("abcdefghij12345klmnopqrst"));
1398     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, 6, S("abcdefghij12345klmnopqrst"));
1399     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
1400     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 1, S("abcdefghij2klmnopqrst"));
1401     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 2, S("abcdefghij23klmnopqrst"));
1402     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 3, S("abcdefghij234klmnopqrst"));
1403     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 4, S("abcdefghij2345klmnopqrst"));
1404     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, 5, S("abcdefghij2345klmnopqrst"));
1405     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
1406 }
1407 
1408 template <class S>
test24()1409 void test24()
1410 {
1411     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 1, S("abcdefghij3klmnopqrst"));
1412     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 2, S("abcdefghij34klmnopqrst"));
1413     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 3, S("abcdefghij345klmnopqrst"));
1414     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 2, 4, S("abcdefghij345klmnopqrst"));
1415     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
1416     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 4, 1, S("abcdefghij5klmnopqrst"));
1417     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 4, 2, S("abcdefghij5klmnopqrst"));
1418     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
1419     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
1420     test(S("abcdefghijklmnopqrst"), 10, S("12345"), 6, 0, S("can't happen"));
1421     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1422     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 1, S("abcdefghij1klmnopqrst"));
1423     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 5, S("abcdefghij12345klmnopqrst"));
1424     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 9, S("abcdefghij123456789klmnopqrst"));
1425     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 10, S("abcdefghij1234567890klmnopqrst"));
1426     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 0, 11, S("abcdefghij1234567890klmnopqrst"));
1427     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1428     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 1, S("abcdefghij2klmnopqrst"));
1429     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 4, S("abcdefghij2345klmnopqrst"));
1430     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 8, S("abcdefghij23456789klmnopqrst"));
1431     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 9, S("abcdefghij234567890klmnopqrst"));
1432     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 1, 10, S("abcdefghij234567890klmnopqrst"));
1433     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
1434     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 1, S("abcdefghij6klmnopqrst"));
1435     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 2, S("abcdefghij67klmnopqrst"));
1436     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 4, S("abcdefghij6789klmnopqrst"));
1437     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 5, S("abcdefghij67890klmnopqrst"));
1438     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 5, 6, S("abcdefghij67890klmnopqrst"));
1439     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
1440     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 9, 1, S("abcdefghij0klmnopqrst"));
1441     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 9, 2, S("abcdefghij0klmnopqrst"));
1442     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1443     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
1444     test(S("abcdefghijklmnopqrst"), 10, S("1234567890"), 11, 0, S("can't happen"));
1445     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1446     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 1, S("abcdefghij1klmnopqrst"));
1447     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 10, S("abcdefghij1234567890klmnopqrst"));
1448     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 19, S("abcdefghij1234567890123456789klmnopqrst"));
1449     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 20, S("abcdefghij12345678901234567890klmnopqrst"));
1450     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 0, 21, S("abcdefghij12345678901234567890klmnopqrst"));
1451     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1452     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 1, S("abcdefghij2klmnopqrst"));
1453     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 9, S("abcdefghij234567890klmnopqrst"));
1454     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 18, S("abcdefghij234567890123456789klmnopqrst"));
1455     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 19, S("abcdefghij2345678901234567890klmnopqrst"));
1456     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 1, 20, S("abcdefghij2345678901234567890klmnopqrst"));
1457     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1458     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 1, S("abcdefghij1klmnopqrst"));
1459     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 5, S("abcdefghij12345klmnopqrst"));
1460     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 9, S("abcdefghij123456789klmnopqrst"));
1461 }
1462 
1463 template <class S>
test25()1464 void test25()
1465 {
1466     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 10, S("abcdefghij1234567890klmnopqrst"));
1467     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 10, 11, S("abcdefghij1234567890klmnopqrst"));
1468     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
1469     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 19, 1, S("abcdefghij0klmnopqrst"));
1470     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 19, 2, S("abcdefghij0klmnopqrst"));
1471     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
1472     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
1473     test(S("abcdefghijklmnopqrst"), 10, S("12345678901234567890"), 21, 0, S("can't happen"));
1474     test(S("abcdefghijklmnopqrst"), 19, S(""), 0, 0, S("abcdefghijklmnopqrst"));
1475     test(S("abcdefghijklmnopqrst"), 19, S(""), 0, 1, S("abcdefghijklmnopqrst"));
1476     test(S("abcdefghijklmnopqrst"), 19, S(""), 1, 0, S("can't happen"));
1477     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
1478     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 1, S("abcdefghijklmnopqrs1t"));
1479     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 2, S("abcdefghijklmnopqrs12t"));
1480     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 4, S("abcdefghijklmnopqrs1234t"));
1481     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 5, S("abcdefghijklmnopqrs12345t"));
1482     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 0, 6, S("abcdefghijklmnopqrs12345t"));
1483     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
1484     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 1, S("abcdefghijklmnopqrs2t"));
1485     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 2, S("abcdefghijklmnopqrs23t"));
1486     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 3, S("abcdefghijklmnopqrs234t"));
1487     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 4, S("abcdefghijklmnopqrs2345t"));
1488     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 1, 5, S("abcdefghijklmnopqrs2345t"));
1489     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
1490     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 1, S("abcdefghijklmnopqrs3t"));
1491     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 2, S("abcdefghijklmnopqrs34t"));
1492     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 3, S("abcdefghijklmnopqrs345t"));
1493     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 2, 4, S("abcdefghijklmnopqrs345t"));
1494     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
1495     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 4, 1, S("abcdefghijklmnopqrs5t"));
1496     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 4, 2, S("abcdefghijklmnopqrs5t"));
1497     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
1498     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
1499     test(S("abcdefghijklmnopqrst"), 19, S("12345"), 6, 0, S("can't happen"));
1500     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1501     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 1, S("abcdefghijklmnopqrs1t"));
1502     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 5, S("abcdefghijklmnopqrs12345t"));
1503     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 9, S("abcdefghijklmnopqrs123456789t"));
1504     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890t"));
1505     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 0, 11, S("abcdefghijklmnopqrs1234567890t"));
1506     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1507     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 1, S("abcdefghijklmnopqrs2t"));
1508     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 4, S("abcdefghijklmnopqrs2345t"));
1509     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 8, S("abcdefghijklmnopqrs23456789t"));
1510     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 9, S("abcdefghijklmnopqrs234567890t"));
1511     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 1, 10, S("abcdefghijklmnopqrs234567890t"));
1512     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
1513     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 1, S("abcdefghijklmnopqrs6t"));
1514     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 2, S("abcdefghijklmnopqrs67t"));
1515     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 4, S("abcdefghijklmnopqrs6789t"));
1516 }
1517 
1518 template <class S>
test26()1519 void test26()
1520 {
1521     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 5, S("abcdefghijklmnopqrs67890t"));
1522     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 5, 6, S("abcdefghijklmnopqrs67890t"));
1523     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
1524     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 9, 1, S("abcdefghijklmnopqrs0t"));
1525     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 9, 2, S("abcdefghijklmnopqrs0t"));
1526     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1527     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
1528     test(S("abcdefghijklmnopqrst"), 19, S("1234567890"), 11, 0, S("can't happen"));
1529     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1530     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 1, S("abcdefghijklmnopqrs1t"));
1531     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 10, S("abcdefghijklmnopqrs1234567890t"));
1532     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 19, S("abcdefghijklmnopqrs1234567890123456789t"));
1533     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 20, S("abcdefghijklmnopqrs12345678901234567890t"));
1534     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 0, 21, S("abcdefghijklmnopqrs12345678901234567890t"));
1535     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1536     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 1, S("abcdefghijklmnopqrs2t"));
1537     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 9, S("abcdefghijklmnopqrs234567890t"));
1538     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 18, S("abcdefghijklmnopqrs234567890123456789t"));
1539     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 19, S("abcdefghijklmnopqrs2345678901234567890t"));
1540     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 1, 20, S("abcdefghijklmnopqrs2345678901234567890t"));
1541     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1542     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 1, S("abcdefghijklmnopqrs1t"));
1543     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 5, S("abcdefghijklmnopqrs12345t"));
1544     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 9, S("abcdefghijklmnopqrs123456789t"));
1545     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 10, S("abcdefghijklmnopqrs1234567890t"));
1546     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 10, 11, S("abcdefghijklmnopqrs1234567890t"));
1547     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
1548     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 19, 1, S("abcdefghijklmnopqrs0t"));
1549     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 19, 2, S("abcdefghijklmnopqrs0t"));
1550     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
1551     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
1552     test(S("abcdefghijklmnopqrst"), 19, S("12345678901234567890"), 21, 0, S("can't happen"));
1553     test(S("abcdefghijklmnopqrst"), 20, S(""), 0, 0, S("abcdefghijklmnopqrst"));
1554     test(S("abcdefghijklmnopqrst"), 20, S(""), 0, 1, S("abcdefghijklmnopqrst"));
1555     test(S("abcdefghijklmnopqrst"), 20, S(""), 1, 0, S("can't happen"));
1556     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 0, S("abcdefghijklmnopqrst"));
1557     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 1, S("abcdefghijklmnopqrst1"));
1558     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 2, S("abcdefghijklmnopqrst12"));
1559     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 4, S("abcdefghijklmnopqrst1234"));
1560     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 5, S("abcdefghijklmnopqrst12345"));
1561     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 0, 6, S("abcdefghijklmnopqrst12345"));
1562     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 0, S("abcdefghijklmnopqrst"));
1563     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 1, S("abcdefghijklmnopqrst2"));
1564     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 2, S("abcdefghijklmnopqrst23"));
1565     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 3, S("abcdefghijklmnopqrst234"));
1566     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 4, S("abcdefghijklmnopqrst2345"));
1567     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 1, 5, S("abcdefghijklmnopqrst2345"));
1568     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 0, S("abcdefghijklmnopqrst"));
1569     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 1, S("abcdefghijklmnopqrst3"));
1570     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 2, S("abcdefghijklmnopqrst34"));
1571 }
1572 
1573 template <class S>
test27()1574 void test27()
1575 {
1576     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 3, S("abcdefghijklmnopqrst345"));
1577     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 2, 4, S("abcdefghijklmnopqrst345"));
1578     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 4, 0, S("abcdefghijklmnopqrst"));
1579     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 4, 1, S("abcdefghijklmnopqrst5"));
1580     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 4, 2, S("abcdefghijklmnopqrst5"));
1581     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 5, 0, S("abcdefghijklmnopqrst"));
1582     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 5, 1, S("abcdefghijklmnopqrst"));
1583     test(S("abcdefghijklmnopqrst"), 20, S("12345"), 6, 0, S("can't happen"));
1584     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1585     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 1, S("abcdefghijklmnopqrst1"));
1586     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 5, S("abcdefghijklmnopqrst12345"));
1587     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 9, S("abcdefghijklmnopqrst123456789"));
1588     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 10, S("abcdefghijklmnopqrst1234567890"));
1589     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 0, 11, S("abcdefghijklmnopqrst1234567890"));
1590     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1591     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 1, S("abcdefghijklmnopqrst2"));
1592     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 4, S("abcdefghijklmnopqrst2345"));
1593     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 8, S("abcdefghijklmnopqrst23456789"));
1594     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 9, S("abcdefghijklmnopqrst234567890"));
1595     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 1, 10, S("abcdefghijklmnopqrst234567890"));
1596     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 0, S("abcdefghijklmnopqrst"));
1597     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 1, S("abcdefghijklmnopqrst6"));
1598     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 2, S("abcdefghijklmnopqrst67"));
1599     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 4, S("abcdefghijklmnopqrst6789"));
1600     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 5, S("abcdefghijklmnopqrst67890"));
1601     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 5, 6, S("abcdefghijklmnopqrst67890"));
1602     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 9, 0, S("abcdefghijklmnopqrst"));
1603     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 9, 1, S("abcdefghijklmnopqrst0"));
1604     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 9, 2, S("abcdefghijklmnopqrst0"));
1605     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1606     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 10, 1, S("abcdefghijklmnopqrst"));
1607     test(S("abcdefghijklmnopqrst"), 20, S("1234567890"), 11, 0, S("can't happen"));
1608     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 0, S("abcdefghijklmnopqrst"));
1609     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 1, S("abcdefghijklmnopqrst1"));
1610     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 10, S("abcdefghijklmnopqrst1234567890"));
1611     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 19, S("abcdefghijklmnopqrst1234567890123456789"));
1612     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 20, S("abcdefghijklmnopqrst12345678901234567890"));
1613     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 0, 21, S("abcdefghijklmnopqrst12345678901234567890"));
1614     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 0, S("abcdefghijklmnopqrst"));
1615     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 1, S("abcdefghijklmnopqrst2"));
1616     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 9, S("abcdefghijklmnopqrst234567890"));
1617     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 18, S("abcdefghijklmnopqrst234567890123456789"));
1618     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 19, S("abcdefghijklmnopqrst2345678901234567890"));
1619     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 1, 20, S("abcdefghijklmnopqrst2345678901234567890"));
1620     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 0, S("abcdefghijklmnopqrst"));
1621     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 1, S("abcdefghijklmnopqrst1"));
1622     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 5, S("abcdefghijklmnopqrst12345"));
1623     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 9, S("abcdefghijklmnopqrst123456789"));
1624     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 10, S("abcdefghijklmnopqrst1234567890"));
1625     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 10, 11, S("abcdefghijklmnopqrst1234567890"));
1626 }
1627 
1628 template <class S>
test28()1629 void test28()
1630 {
1631     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 19, 0, S("abcdefghijklmnopqrst"));
1632     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 19, 1, S("abcdefghijklmnopqrst0"));
1633     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 19, 2, S("abcdefghijklmnopqrst0"));
1634     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 20, 0, S("abcdefghijklmnopqrst"));
1635     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 20, 1, S("abcdefghijklmnopqrst"));
1636     test(S("abcdefghijklmnopqrst"), 20, S("12345678901234567890"), 21, 0, S("can't happen"));
1637     test(S("abcdefghijklmnopqrst"), 21, S(""), 0, 0, S("can't happen"));
1638     test(S("abcdefghijklmnopqrst"), 21, S(""), 0, 1, S("can't happen"));
1639     test(S("abcdefghijklmnopqrst"), 21, S(""), 1, 0, S("can't happen"));
1640     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 0, S("can't happen"));
1641     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 1, S("can't happen"));
1642     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 2, S("can't happen"));
1643     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 4, S("can't happen"));
1644     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 5, S("can't happen"));
1645     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 0, 6, S("can't happen"));
1646     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 0, S("can't happen"));
1647     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 1, S("can't happen"));
1648     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 2, S("can't happen"));
1649     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 3, S("can't happen"));
1650     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 4, S("can't happen"));
1651     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 1, 5, S("can't happen"));
1652     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 0, S("can't happen"));
1653     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 1, S("can't happen"));
1654     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 2, S("can't happen"));
1655     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 3, S("can't happen"));
1656     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 2, 4, S("can't happen"));
1657     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 4, 0, S("can't happen"));
1658     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 4, 1, S("can't happen"));
1659     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 4, 2, S("can't happen"));
1660     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 5, 0, S("can't happen"));
1661     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 5, 1, S("can't happen"));
1662     test(S("abcdefghijklmnopqrst"), 21, S("12345"), 6, 0, S("can't happen"));
1663     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 0, S("can't happen"));
1664     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 1, S("can't happen"));
1665     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 5, S("can't happen"));
1666     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 9, S("can't happen"));
1667     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 10, S("can't happen"));
1668     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 0, 11, S("can't happen"));
1669     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 0, S("can't happen"));
1670     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 1, S("can't happen"));
1671     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 4, S("can't happen"));
1672     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 8, S("can't happen"));
1673     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 9, S("can't happen"));
1674     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 1, 10, S("can't happen"));
1675     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 0, S("can't happen"));
1676     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 1, S("can't happen"));
1677     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 2, S("can't happen"));
1678     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 4, S("can't happen"));
1679     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 5, S("can't happen"));
1680     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 5, 6, S("can't happen"));
1681 }
1682 
1683 template <class S>
test29()1684 void test29()
1685 {
1686     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 9, 0, S("can't happen"));
1687     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 9, 1, S("can't happen"));
1688     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 9, 2, S("can't happen"));
1689     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 10, 0, S("can't happen"));
1690     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 10, 1, S("can't happen"));
1691     test(S("abcdefghijklmnopqrst"), 21, S("1234567890"), 11, 0, S("can't happen"));
1692     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 0, S("can't happen"));
1693     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 1, S("can't happen"));
1694     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 10, S("can't happen"));
1695     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 19, S("can't happen"));
1696     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 20, S("can't happen"));
1697     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 0, 21, S("can't happen"));
1698     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 0, S("can't happen"));
1699     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 1, S("can't happen"));
1700     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 9, S("can't happen"));
1701     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 18, S("can't happen"));
1702     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 19, S("can't happen"));
1703     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 1, 20, S("can't happen"));
1704     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 0, S("can't happen"));
1705     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 1, S("can't happen"));
1706     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 5, S("can't happen"));
1707     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 9, S("can't happen"));
1708     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 10, S("can't happen"));
1709     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 10, 11, S("can't happen"));
1710     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 19, 0, S("can't happen"));
1711     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 19, 1, S("can't happen"));
1712     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 19, 2, S("can't happen"));
1713     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 20, 0, S("can't happen"));
1714     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 20, 1, S("can't happen"));
1715     test(S("abcdefghijklmnopqrst"), 21, S("12345678901234567890"), 21, 0, S("can't happen"));
1716 }
1717 
1718 template <class S>
test30()1719 void test30()
1720 {
1721     test_npos(S(""), 0, S("12345678901234567890"),  0, S("12345678901234567890"));
1722     test_npos(S(""), 0, S("12345678901234567890"),  1, S( "2345678901234567890"));
1723     test_npos(S(""), 0, S("12345678901234567890"),  2, S(  "345678901234567890"));
1724     test_npos(S(""), 0, S("12345678901234567890"),  3, S(   "45678901234567890"));
1725     test_npos(S(""), 0, S("12345678901234567890"),  5, S(     "678901234567890"));
1726     test_npos(S(""), 0, S("12345678901234567890"), 10, S(          "1234567890"));
1727     test_npos(S(""), 0, S("12345678901234567890"), 21, S("can't happen"));
1728     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 0, S("abcdefghij12345klmnopqrst"));
1729     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 1, S("abcdefghij2345klmnopqrst"));
1730     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 3, S("abcdefghij45klmnopqrst"));
1731     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 5, S("abcdefghijklmnopqrst"));
1732     test_npos(S("abcdefghijklmnopqrst"), 10, S("12345"), 6, S("can't happen"));
1733 }
1734 
main(int,char **)1735 int main(int, char**)
1736 {
1737     {
1738     typedef std::string S;
1739     test0<S>();
1740     test1<S>();
1741     test2<S>();
1742     test3<S>();
1743     test4<S>();
1744     test5<S>();
1745     test6<S>();
1746     test7<S>();
1747     test8<S>();
1748     test9<S>();
1749     test10<S>();
1750     test11<S>();
1751     test12<S>();
1752     test13<S>();
1753     test14<S>();
1754     test15<S>();
1755     test16<S>();
1756     test17<S>();
1757     test18<S>();
1758     test19<S>();
1759     test20<S>();
1760     test21<S>();
1761     test22<S>();
1762     test23<S>();
1763     test24<S>();
1764     test25<S>();
1765     test26<S>();
1766     test27<S>();
1767     test28<S>();
1768     test29<S>();
1769     test30<S>();
1770     }
1771 #if TEST_STD_VER >= 11
1772     {
1773     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
1774     test0<S>();
1775     test1<S>();
1776     test2<S>();
1777     test3<S>();
1778     test4<S>();
1779     test5<S>();
1780     test6<S>();
1781     test7<S>();
1782     test8<S>();
1783     test9<S>();
1784     test10<S>();
1785     test11<S>();
1786     test12<S>();
1787     test13<S>();
1788     test14<S>();
1789     test15<S>();
1790     test16<S>();
1791     test17<S>();
1792     test18<S>();
1793     test19<S>();
1794     test20<S>();
1795     test21<S>();
1796     test22<S>();
1797     test23<S>();
1798     test24<S>();
1799     test25<S>();
1800     test26<S>();
1801     test27<S>();
1802     test28<S>();
1803     test29<S>();
1804     test30<S>();
1805     }
1806 #endif
1807 
1808   return 0;
1809 }
1810