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