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_view>
11
12// constexpr int compare(size_type pos1, size_type n1,
13//             const charT* s, size_type n2) const;
14
15#include <string_view>
16#include <cassert>
17
18#include "test_macros.h"
19#include "constexpr_char_traits.hpp"
20
21int sign ( int x ) { return x > 0 ? 1 : ( x < 0 ? -1 : 0 ); }
22
23template<typename CharT>
24void test1 ( std::basic_string_view<CharT> sv1, size_t pos1, size_t n1,
25             const CharT *s2, size_t n2, int expected ) {
26#ifdef TEST_HAS_NO_EXCEPTIONS
27    if (pos1 <= sv1.size())
28        assert(sign(sv1.compare(pos1, n1, s2, n2)) == sign(expected));
29#else
30    try {
31        assert(sign(sv1.compare(pos1, n1, s2, n2)) == sign(expected));
32        assert(pos1 <= sv1.size());
33        }
34    catch (const std::out_of_range&) {
35        assert(pos1 > sv1.size());
36        }
37#endif
38}
39
40
41template<typename CharT>
42void test ( const CharT *s1, size_t pos1, size_t n1,
43            const CharT *s2, size_t n2,
44            int expected ) {
45    typedef std::basic_string_view<CharT> string_view_t;
46    string_view_t sv1 ( s1 );
47    test1 (sv1, pos1, n1, s2, n2, expected);
48}
49
50
51void test0()
52{
53    test("", 0, 0, "", 0, 0);
54    test("", 0, 0, "abcde", 0, 0);
55    test("", 0, 0, "abcde", 1, -1);
56    test("", 0, 0, "abcde", 2, -2);
57    test("", 0, 0, "abcde", 4, -4);
58    test("", 0, 0, "abcde", 5, -5);
59    test("", 0, 0, "abcdefghij", 0, 0);
60    test("", 0, 0, "abcdefghij", 1, -1);
61    test("", 0, 0, "abcdefghij", 5, -5);
62    test("", 0, 0, "abcdefghij", 9, -9);
63    test("", 0, 0, "abcdefghij", 10, -10);
64    test("", 0, 0, "abcdefghijklmnopqrst", 0, 0);
65    test("", 0, 0, "abcdefghijklmnopqrst", 1, -1);
66    test("", 0, 0, "abcdefghijklmnopqrst", 10, -10);
67    test("", 0, 0, "abcdefghijklmnopqrst", 19, -19);
68    test("", 0, 0, "abcdefghijklmnopqrst", 20, -20);
69    test("", 0, 1, "", 0, 0);
70    test("", 0, 1, "abcde", 0, 0);
71    test("", 0, 1, "abcde", 1, -1);
72    test("", 0, 1, "abcde", 2, -2);
73    test("", 0, 1, "abcde", 4, -4);
74    test("", 0, 1, "abcde", 5, -5);
75    test("", 0, 1, "abcdefghij", 0, 0);
76    test("", 0, 1, "abcdefghij", 1, -1);
77    test("", 0, 1, "abcdefghij", 5, -5);
78    test("", 0, 1, "abcdefghij", 9, -9);
79    test("", 0, 1, "abcdefghij", 10, -10);
80    test("", 0, 1, "abcdefghijklmnopqrst", 0, 0);
81    test("", 0, 1, "abcdefghijklmnopqrst", 1, -1);
82    test("", 0, 1, "abcdefghijklmnopqrst", 10, -10);
83    test("", 0, 1, "abcdefghijklmnopqrst", 19, -19);
84    test("", 0, 1, "abcdefghijklmnopqrst", 20, -20);
85    test("", 1, 0, "", 0, 0);
86    test("", 1, 0, "abcde", 0, 0);
87    test("", 1, 0, "abcde", 1, 0);
88    test("", 1, 0, "abcde", 2, 0);
89    test("", 1, 0, "abcde", 4, 0);
90    test("", 1, 0, "abcde", 5, 0);
91    test("", 1, 0, "abcdefghij", 0, 0);
92    test("", 1, 0, "abcdefghij", 1, 0);
93    test("", 1, 0, "abcdefghij", 5, 0);
94    test("", 1, 0, "abcdefghij", 9, 0);
95    test("", 1, 0, "abcdefghij", 10, 0);
96    test("", 1, 0, "abcdefghijklmnopqrst", 0, 0);
97    test("", 1, 0, "abcdefghijklmnopqrst", 1, 0);
98    test("", 1, 0, "abcdefghijklmnopqrst", 10, 0);
99    test("", 1, 0, "abcdefghijklmnopqrst", 19, 0);
100    test("", 1, 0, "abcdefghijklmnopqrst", 20, 0);
101    test("abcde", 0, 0, "", 0, 0);
102    test("abcde", 0, 0, "abcde", 0, 0);
103    test("abcde", 0, 0, "abcde", 1, -1);
104    test("abcde", 0, 0, "abcde", 2, -2);
105    test("abcde", 0, 0, "abcde", 4, -4);
106    test("abcde", 0, 0, "abcde", 5, -5);
107    test("abcde", 0, 0, "abcdefghij", 0, 0);
108    test("abcde", 0, 0, "abcdefghij", 1, -1);
109    test("abcde", 0, 0, "abcdefghij", 5, -5);
110    test("abcde", 0, 0, "abcdefghij", 9, -9);
111    test("abcde", 0, 0, "abcdefghij", 10, -10);
112    test("abcde", 0, 0, "abcdefghijklmnopqrst", 0, 0);
113    test("abcde", 0, 0, "abcdefghijklmnopqrst", 1, -1);
114    test("abcde", 0, 0, "abcdefghijklmnopqrst", 10, -10);
115    test("abcde", 0, 0, "abcdefghijklmnopqrst", 19, -19);
116    test("abcde", 0, 0, "abcdefghijklmnopqrst", 20, -20);
117    test("abcde", 0, 1, "", 0, 1);
118    test("abcde", 0, 1, "abcde", 0, 1);
119    test("abcde", 0, 1, "abcde", 1, 0);
120    test("abcde", 0, 1, "abcde", 2, -1);
121    test("abcde", 0, 1, "abcde", 4, -3);
122    test("abcde", 0, 1, "abcde", 5, -4);
123    test("abcde", 0, 1, "abcdefghij", 0, 1);
124    test("abcde", 0, 1, "abcdefghij", 1, 0);
125    test("abcde", 0, 1, "abcdefghij", 5, -4);
126    test("abcde", 0, 1, "abcdefghij", 9, -8);
127    test("abcde", 0, 1, "abcdefghij", 10, -9);
128    test("abcde", 0, 1, "abcdefghijklmnopqrst", 0, 1);
129    test("abcde", 0, 1, "abcdefghijklmnopqrst", 1, 0);
130    test("abcde", 0, 1, "abcdefghijklmnopqrst", 10, -9);
131    test("abcde", 0, 1, "abcdefghijklmnopqrst", 19, -18);
132    test("abcde", 0, 1, "abcdefghijklmnopqrst", 20, -19);
133    test("abcde", 0, 2, "", 0, 2);
134    test("abcde", 0, 2, "abcde", 0, 2);
135    test("abcde", 0, 2, "abcde", 1, 1);
136    test("abcde", 0, 2, "abcde", 2, 0);
137    test("abcde", 0, 2, "abcde", 4, -2);
138    test("abcde", 0, 2, "abcde", 5, -3);
139    test("abcde", 0, 2, "abcdefghij", 0, 2);
140    test("abcde", 0, 2, "abcdefghij", 1, 1);
141    test("abcde", 0, 2, "abcdefghij", 5, -3);
142    test("abcde", 0, 2, "abcdefghij", 9, -7);
143    test("abcde", 0, 2, "abcdefghij", 10, -8);
144    test("abcde", 0, 2, "abcdefghijklmnopqrst", 0, 2);
145    test("abcde", 0, 2, "abcdefghijklmnopqrst", 1, 1);
146    test("abcde", 0, 2, "abcdefghijklmnopqrst", 10, -8);
147    test("abcde", 0, 2, "abcdefghijklmnopqrst", 19, -17);
148    test("abcde", 0, 2, "abcdefghijklmnopqrst", 20, -18);
149    test("abcde", 0, 4, "", 0, 4);
150    test("abcde", 0, 4, "abcde", 0, 4);
151    test("abcde", 0, 4, "abcde", 1, 3);
152    test("abcde", 0, 4, "abcde", 2, 2);
153}
154
155
156void test1()
157{
158    test("abcde", 0, 4, "abcde", 4, 0);
159    test("abcde", 0, 4, "abcde", 5, -1);
160    test("abcde", 0, 4, "abcdefghij", 0, 4);
161    test("abcde", 0, 4, "abcdefghij", 1, 3);
162    test("abcde", 0, 4, "abcdefghij", 5, -1);
163    test("abcde", 0, 4, "abcdefghij", 9, -5);
164    test("abcde", 0, 4, "abcdefghij", 10, -6);
165    test("abcde", 0, 4, "abcdefghijklmnopqrst", 0, 4);
166    test("abcde", 0, 4, "abcdefghijklmnopqrst", 1, 3);
167    test("abcde", 0, 4, "abcdefghijklmnopqrst", 10, -6);
168    test("abcde", 0, 4, "abcdefghijklmnopqrst", 19, -15);
169    test("abcde", 0, 4, "abcdefghijklmnopqrst", 20, -16);
170    test("abcde", 0, 5, "", 0, 5);
171    test("abcde", 0, 5, "abcde", 0, 5);
172    test("abcde", 0, 5, "abcde", 1, 4);
173    test("abcde", 0, 5, "abcde", 2, 3);
174    test("abcde", 0, 5, "abcde", 4, 1);
175    test("abcde", 0, 5, "abcde", 5, 0);
176    test("abcde", 0, 5, "abcdefghij", 0, 5);
177    test("abcde", 0, 5, "abcdefghij", 1, 4);
178    test("abcde", 0, 5, "abcdefghij", 5, 0);
179    test("abcde", 0, 5, "abcdefghij", 9, -4);
180    test("abcde", 0, 5, "abcdefghij", 10, -5);
181    test("abcde", 0, 5, "abcdefghijklmnopqrst", 0, 5);
182    test("abcde", 0, 5, "abcdefghijklmnopqrst", 1, 4);
183    test("abcde", 0, 5, "abcdefghijklmnopqrst", 10, -5);
184    test("abcde", 0, 5, "abcdefghijklmnopqrst", 19, -14);
185    test("abcde", 0, 5, "abcdefghijklmnopqrst", 20, -15);
186    test("abcde", 0, 6, "", 0, 5);
187    test("abcde", 0, 6, "abcde", 0, 5);
188    test("abcde", 0, 6, "abcde", 1, 4);
189    test("abcde", 0, 6, "abcde", 2, 3);
190    test("abcde", 0, 6, "abcde", 4, 1);
191    test("abcde", 0, 6, "abcde", 5, 0);
192    test("abcde", 0, 6, "abcdefghij", 0, 5);
193    test("abcde", 0, 6, "abcdefghij", 1, 4);
194    test("abcde", 0, 6, "abcdefghij", 5, 0);
195    test("abcde", 0, 6, "abcdefghij", 9, -4);
196    test("abcde", 0, 6, "abcdefghij", 10, -5);
197    test("abcde", 0, 6, "abcdefghijklmnopqrst", 0, 5);
198    test("abcde", 0, 6, "abcdefghijklmnopqrst", 1, 4);
199    test("abcde", 0, 6, "abcdefghijklmnopqrst", 10, -5);
200    test("abcde", 0, 6, "abcdefghijklmnopqrst", 19, -14);
201    test("abcde", 0, 6, "abcdefghijklmnopqrst", 20, -15);
202    test("abcde", 1, 0, "", 0, 0);
203    test("abcde", 1, 0, "abcde", 0, 0);
204    test("abcde", 1, 0, "abcde", 1, -1);
205    test("abcde", 1, 0, "abcde", 2, -2);
206    test("abcde", 1, 0, "abcde", 4, -4);
207    test("abcde", 1, 0, "abcde", 5, -5);
208    test("abcde", 1, 0, "abcdefghij", 0, 0);
209    test("abcde", 1, 0, "abcdefghij", 1, -1);
210    test("abcde", 1, 0, "abcdefghij", 5, -5);
211    test("abcde", 1, 0, "abcdefghij", 9, -9);
212    test("abcde", 1, 0, "abcdefghij", 10, -10);
213    test("abcde", 1, 0, "abcdefghijklmnopqrst", 0, 0);
214    test("abcde", 1, 0, "abcdefghijklmnopqrst", 1, -1);
215    test("abcde", 1, 0, "abcdefghijklmnopqrst", 10, -10);
216    test("abcde", 1, 0, "abcdefghijklmnopqrst", 19, -19);
217    test("abcde", 1, 0, "abcdefghijklmnopqrst", 20, -20);
218    test("abcde", 1, 1, "", 0, 1);
219    test("abcde", 1, 1, "abcde", 0, 1);
220    test("abcde", 1, 1, "abcde", 1, 1);
221    test("abcde", 1, 1, "abcde", 2, 1);
222    test("abcde", 1, 1, "abcde", 4, 1);
223    test("abcde", 1, 1, "abcde", 5, 1);
224    test("abcde", 1, 1, "abcdefghij", 0, 1);
225    test("abcde", 1, 1, "abcdefghij", 1, 1);
226    test("abcde", 1, 1, "abcdefghij", 5, 1);
227    test("abcde", 1, 1, "abcdefghij", 9, 1);
228    test("abcde", 1, 1, "abcdefghij", 10, 1);
229    test("abcde", 1, 1, "abcdefghijklmnopqrst", 0, 1);
230    test("abcde", 1, 1, "abcdefghijklmnopqrst", 1, 1);
231    test("abcde", 1, 1, "abcdefghijklmnopqrst", 10, 1);
232    test("abcde", 1, 1, "abcdefghijklmnopqrst", 19, 1);
233    test("abcde", 1, 1, "abcdefghijklmnopqrst", 20, 1);
234    test("abcde", 1, 2, "", 0, 2);
235    test("abcde", 1, 2, "abcde", 0, 2);
236    test("abcde", 1, 2, "abcde", 1, 1);
237    test("abcde", 1, 2, "abcde", 2, 1);
238    test("abcde", 1, 2, "abcde", 4, 1);
239    test("abcde", 1, 2, "abcde", 5, 1);
240    test("abcde", 1, 2, "abcdefghij", 0, 2);
241    test("abcde", 1, 2, "abcdefghij", 1, 1);
242    test("abcde", 1, 2, "abcdefghij", 5, 1);
243    test("abcde", 1, 2, "abcdefghij", 9, 1);
244    test("abcde", 1, 2, "abcdefghij", 10, 1);
245    test("abcde", 1, 2, "abcdefghijklmnopqrst", 0, 2);
246    test("abcde", 1, 2, "abcdefghijklmnopqrst", 1, 1);
247    test("abcde", 1, 2, "abcdefghijklmnopqrst", 10, 1);
248    test("abcde", 1, 2, "abcdefghijklmnopqrst", 19, 1);
249    test("abcde", 1, 2, "abcdefghijklmnopqrst", 20, 1);
250    test("abcde", 1, 3, "", 0, 3);
251    test("abcde", 1, 3, "abcde", 0, 3);
252    test("abcde", 1, 3, "abcde", 1, 1);
253    test("abcde", 1, 3, "abcde", 2, 1);
254    test("abcde", 1, 3, "abcde", 4, 1);
255    test("abcde", 1, 3, "abcde", 5, 1);
256    test("abcde", 1, 3, "abcdefghij", 0, 3);
257    test("abcde", 1, 3, "abcdefghij", 1, 1);
258}
259
260
261void test2()
262{
263    test("abcde", 1, 3, "abcdefghij", 5, 1);
264    test("abcde", 1, 3, "abcdefghij", 9, 1);
265    test("abcde", 1, 3, "abcdefghij", 10, 1);
266    test("abcde", 1, 3, "abcdefghijklmnopqrst", 0, 3);
267    test("abcde", 1, 3, "abcdefghijklmnopqrst", 1, 1);
268    test("abcde", 1, 3, "abcdefghijklmnopqrst", 10, 1);
269    test("abcde", 1, 3, "abcdefghijklmnopqrst", 19, 1);
270    test("abcde", 1, 3, "abcdefghijklmnopqrst", 20, 1);
271    test("abcde", 1, 4, "", 0, 4);
272    test("abcde", 1, 4, "abcde", 0, 4);
273    test("abcde", 1, 4, "abcde", 1, 1);
274    test("abcde", 1, 4, "abcde", 2, 1);
275    test("abcde", 1, 4, "abcde", 4, 1);
276    test("abcde", 1, 4, "abcde", 5, 1);
277    test("abcde", 1, 4, "abcdefghij", 0, 4);
278    test("abcde", 1, 4, "abcdefghij", 1, 1);
279    test("abcde", 1, 4, "abcdefghij", 5, 1);
280    test("abcde", 1, 4, "abcdefghij", 9, 1);
281    test("abcde", 1, 4, "abcdefghij", 10, 1);
282    test("abcde", 1, 4, "abcdefghijklmnopqrst", 0, 4);
283    test("abcde", 1, 4, "abcdefghijklmnopqrst", 1, 1);
284    test("abcde", 1, 4, "abcdefghijklmnopqrst", 10, 1);
285    test("abcde", 1, 4, "abcdefghijklmnopqrst", 19, 1);
286    test("abcde", 1, 4, "abcdefghijklmnopqrst", 20, 1);
287    test("abcde", 1, 5, "", 0, 4);
288    test("abcde", 1, 5, "abcde", 0, 4);
289    test("abcde", 1, 5, "abcde", 1, 1);
290    test("abcde", 1, 5, "abcde", 2, 1);
291    test("abcde", 1, 5, "abcde", 4, 1);
292    test("abcde", 1, 5, "abcde", 5, 1);
293    test("abcde", 1, 5, "abcdefghij", 0, 4);
294    test("abcde", 1, 5, "abcdefghij", 1, 1);
295    test("abcde", 1, 5, "abcdefghij", 5, 1);
296    test("abcde", 1, 5, "abcdefghij", 9, 1);
297    test("abcde", 1, 5, "abcdefghij", 10, 1);
298    test("abcde", 1, 5, "abcdefghijklmnopqrst", 0, 4);
299    test("abcde", 1, 5, "abcdefghijklmnopqrst", 1, 1);
300    test("abcde", 1, 5, "abcdefghijklmnopqrst", 10, 1);
301    test("abcde", 1, 5, "abcdefghijklmnopqrst", 19, 1);
302    test("abcde", 1, 5, "abcdefghijklmnopqrst", 20, 1);
303    test("abcde", 2, 0, "", 0, 0);
304    test("abcde", 2, 0, "abcde", 0, 0);
305    test("abcde", 2, 0, "abcde", 1, -1);
306    test("abcde", 2, 0, "abcde", 2, -2);
307    test("abcde", 2, 0, "abcde", 4, -4);
308    test("abcde", 2, 0, "abcde", 5, -5);
309    test("abcde", 2, 0, "abcdefghij", 0, 0);
310    test("abcde", 2, 0, "abcdefghij", 1, -1);
311    test("abcde", 2, 0, "abcdefghij", 5, -5);
312    test("abcde", 2, 0, "abcdefghij", 9, -9);
313    test("abcde", 2, 0, "abcdefghij", 10, -10);
314    test("abcde", 2, 0, "abcdefghijklmnopqrst", 0, 0);
315    test("abcde", 2, 0, "abcdefghijklmnopqrst", 1, -1);
316    test("abcde", 2, 0, "abcdefghijklmnopqrst", 10, -10);
317    test("abcde", 2, 0, "abcdefghijklmnopqrst", 19, -19);
318    test("abcde", 2, 0, "abcdefghijklmnopqrst", 20, -20);
319    test("abcde", 2, 1, "", 0, 1);
320    test("abcde", 2, 1, "abcde", 0, 1);
321    test("abcde", 2, 1, "abcde", 1, 2);
322    test("abcde", 2, 1, "abcde", 2, 2);
323    test("abcde", 2, 1, "abcde", 4, 2);
324    test("abcde", 2, 1, "abcde", 5, 2);
325    test("abcde", 2, 1, "abcdefghij", 0, 1);
326    test("abcde", 2, 1, "abcdefghij", 1, 2);
327    test("abcde", 2, 1, "abcdefghij", 5, 2);
328    test("abcde", 2, 1, "abcdefghij", 9, 2);
329    test("abcde", 2, 1, "abcdefghij", 10, 2);
330    test("abcde", 2, 1, "abcdefghijklmnopqrst", 0, 1);
331    test("abcde", 2, 1, "abcdefghijklmnopqrst", 1, 2);
332    test("abcde", 2, 1, "abcdefghijklmnopqrst", 10, 2);
333    test("abcde", 2, 1, "abcdefghijklmnopqrst", 19, 2);
334    test("abcde", 2, 1, "abcdefghijklmnopqrst", 20, 2);
335    test("abcde", 2, 2, "", 0, 2);
336    test("abcde", 2, 2, "abcde", 0, 2);
337    test("abcde", 2, 2, "abcde", 1, 2);
338    test("abcde", 2, 2, "abcde", 2, 2);
339    test("abcde", 2, 2, "abcde", 4, 2);
340    test("abcde", 2, 2, "abcde", 5, 2);
341    test("abcde", 2, 2, "abcdefghij", 0, 2);
342    test("abcde", 2, 2, "abcdefghij", 1, 2);
343    test("abcde", 2, 2, "abcdefghij", 5, 2);
344    test("abcde", 2, 2, "abcdefghij", 9, 2);
345    test("abcde", 2, 2, "abcdefghij", 10, 2);
346    test("abcde", 2, 2, "abcdefghijklmnopqrst", 0, 2);
347    test("abcde", 2, 2, "abcdefghijklmnopqrst", 1, 2);
348    test("abcde", 2, 2, "abcdefghijklmnopqrst", 10, 2);
349    test("abcde", 2, 2, "abcdefghijklmnopqrst", 19, 2);
350    test("abcde", 2, 2, "abcdefghijklmnopqrst", 20, 2);
351    test("abcde", 2, 3, "", 0, 3);
352    test("abcde", 2, 3, "abcde", 0, 3);
353    test("abcde", 2, 3, "abcde", 1, 2);
354    test("abcde", 2, 3, "abcde", 2, 2);
355    test("abcde", 2, 3, "abcde", 4, 2);
356    test("abcde", 2, 3, "abcde", 5, 2);
357    test("abcde", 2, 3, "abcdefghij", 0, 3);
358    test("abcde", 2, 3, "abcdefghij", 1, 2);
359    test("abcde", 2, 3, "abcdefghij", 5, 2);
360    test("abcde", 2, 3, "abcdefghij", 9, 2);
361    test("abcde", 2, 3, "abcdefghij", 10, 2);
362    test("abcde", 2, 3, "abcdefghijklmnopqrst", 0, 3);
363}
364
365
366void test3()
367{
368    test("abcde", 2, 3, "abcdefghijklmnopqrst", 1, 2);
369    test("abcde", 2, 3, "abcdefghijklmnopqrst", 10, 2);
370    test("abcde", 2, 3, "abcdefghijklmnopqrst", 19, 2);
371    test("abcde", 2, 3, "abcdefghijklmnopqrst", 20, 2);
372    test("abcde", 2, 4, "", 0, 3);
373    test("abcde", 2, 4, "abcde", 0, 3);
374    test("abcde", 2, 4, "abcde", 1, 2);
375    test("abcde", 2, 4, "abcde", 2, 2);
376    test("abcde", 2, 4, "abcde", 4, 2);
377    test("abcde", 2, 4, "abcde", 5, 2);
378    test("abcde", 2, 4, "abcdefghij", 0, 3);
379    test("abcde", 2, 4, "abcdefghij", 1, 2);
380    test("abcde", 2, 4, "abcdefghij", 5, 2);
381    test("abcde", 2, 4, "abcdefghij", 9, 2);
382    test("abcde", 2, 4, "abcdefghij", 10, 2);
383    test("abcde", 2, 4, "abcdefghijklmnopqrst", 0, 3);
384    test("abcde", 2, 4, "abcdefghijklmnopqrst", 1, 2);
385    test("abcde", 2, 4, "abcdefghijklmnopqrst", 10, 2);
386    test("abcde", 2, 4, "abcdefghijklmnopqrst", 19, 2);
387    test("abcde", 2, 4, "abcdefghijklmnopqrst", 20, 2);
388    test("abcde", 4, 0, "", 0, 0);
389    test("abcde", 4, 0, "abcde", 0, 0);
390    test("abcde", 4, 0, "abcde", 1, -1);
391    test("abcde", 4, 0, "abcde", 2, -2);
392    test("abcde", 4, 0, "abcde", 4, -4);
393    test("abcde", 4, 0, "abcde", 5, -5);
394    test("abcde", 4, 0, "abcdefghij", 0, 0);
395    test("abcde", 4, 0, "abcdefghij", 1, -1);
396    test("abcde", 4, 0, "abcdefghij", 5, -5);
397    test("abcde", 4, 0, "abcdefghij", 9, -9);
398    test("abcde", 4, 0, "abcdefghij", 10, -10);
399    test("abcde", 4, 0, "abcdefghijklmnopqrst", 0, 0);
400    test("abcde", 4, 0, "abcdefghijklmnopqrst", 1, -1);
401    test("abcde", 4, 0, "abcdefghijklmnopqrst", 10, -10);
402    test("abcde", 4, 0, "abcdefghijklmnopqrst", 19, -19);
403    test("abcde", 4, 0, "abcdefghijklmnopqrst", 20, -20);
404    test("abcde", 4, 1, "", 0, 1);
405    test("abcde", 4, 1, "abcde", 0, 1);
406    test("abcde", 4, 1, "abcde", 1, 4);
407    test("abcde", 4, 1, "abcde", 2, 4);
408    test("abcde", 4, 1, "abcde", 4, 4);
409    test("abcde", 4, 1, "abcde", 5, 4);
410    test("abcde", 4, 1, "abcdefghij", 0, 1);
411    test("abcde", 4, 1, "abcdefghij", 1, 4);
412    test("abcde", 4, 1, "abcdefghij", 5, 4);
413    test("abcde", 4, 1, "abcdefghij", 9, 4);
414    test("abcde", 4, 1, "abcdefghij", 10, 4);
415    test("abcde", 4, 1, "abcdefghijklmnopqrst", 0, 1);
416    test("abcde", 4, 1, "abcdefghijklmnopqrst", 1, 4);
417    test("abcde", 4, 1, "abcdefghijklmnopqrst", 10, 4);
418    test("abcde", 4, 1, "abcdefghijklmnopqrst", 19, 4);
419    test("abcde", 4, 1, "abcdefghijklmnopqrst", 20, 4);
420    test("abcde", 4, 2, "", 0, 1);
421    test("abcde", 4, 2, "abcde", 0, 1);
422    test("abcde", 4, 2, "abcde", 1, 4);
423    test("abcde", 4, 2, "abcde", 2, 4);
424    test("abcde", 4, 2, "abcde", 4, 4);
425    test("abcde", 4, 2, "abcde", 5, 4);
426    test("abcde", 4, 2, "abcdefghij", 0, 1);
427    test("abcde", 4, 2, "abcdefghij", 1, 4);
428    test("abcde", 4, 2, "abcdefghij", 5, 4);
429    test("abcde", 4, 2, "abcdefghij", 9, 4);
430    test("abcde", 4, 2, "abcdefghij", 10, 4);
431    test("abcde", 4, 2, "abcdefghijklmnopqrst", 0, 1);
432    test("abcde", 4, 2, "abcdefghijklmnopqrst", 1, 4);
433    test("abcde", 4, 2, "abcdefghijklmnopqrst", 10, 4);
434    test("abcde", 4, 2, "abcdefghijklmnopqrst", 19, 4);
435    test("abcde", 4, 2, "abcdefghijklmnopqrst", 20, 4);
436    test("abcde", 5, 0, "", 0, 0);
437    test("abcde", 5, 0, "abcde", 0, 0);
438    test("abcde", 5, 0, "abcde", 1, -1);
439    test("abcde", 5, 0, "abcde", 2, -2);
440    test("abcde", 5, 0, "abcde", 4, -4);
441    test("abcde", 5, 0, "abcde", 5, -5);
442    test("abcde", 5, 0, "abcdefghij", 0, 0);
443    test("abcde", 5, 0, "abcdefghij", 1, -1);
444    test("abcde", 5, 0, "abcdefghij", 5, -5);
445    test("abcde", 5, 0, "abcdefghij", 9, -9);
446    test("abcde", 5, 0, "abcdefghij", 10, -10);
447    test("abcde", 5, 0, "abcdefghijklmnopqrst", 0, 0);
448    test("abcde", 5, 0, "abcdefghijklmnopqrst", 1, -1);
449    test("abcde", 5, 0, "abcdefghijklmnopqrst", 10, -10);
450    test("abcde", 5, 0, "abcdefghijklmnopqrst", 19, -19);
451    test("abcde", 5, 0, "abcdefghijklmnopqrst", 20, -20);
452    test("abcde", 5, 1, "", 0, 0);
453    test("abcde", 5, 1, "abcde", 0, 0);
454    test("abcde", 5, 1, "abcde", 1, -1);
455    test("abcde", 5, 1, "abcde", 2, -2);
456    test("abcde", 5, 1, "abcde", 4, -4);
457    test("abcde", 5, 1, "abcde", 5, -5);
458    test("abcde", 5, 1, "abcdefghij", 0, 0);
459    test("abcde", 5, 1, "abcdefghij", 1, -1);
460    test("abcde", 5, 1, "abcdefghij", 5, -5);
461    test("abcde", 5, 1, "abcdefghij", 9, -9);
462    test("abcde", 5, 1, "abcdefghij", 10, -10);
463    test("abcde", 5, 1, "abcdefghijklmnopqrst", 0, 0);
464    test("abcde", 5, 1, "abcdefghijklmnopqrst", 1, -1);
465    test("abcde", 5, 1, "abcdefghijklmnopqrst", 10, -10);
466    test("abcde", 5, 1, "abcdefghijklmnopqrst", 19, -19);
467    test("abcde", 5, 1, "abcdefghijklmnopqrst", 20, -20);
468}
469
470
471void test4()
472{
473    test("abcde", 6, 0, "", 0, 0);
474    test("abcde", 6, 0, "abcde", 0, 0);
475    test("abcde", 6, 0, "abcde", 1, 0);
476    test("abcde", 6, 0, "abcde", 2, 0);
477    test("abcde", 6, 0, "abcde", 4, 0);
478    test("abcde", 6, 0, "abcde", 5, 0);
479    test("abcde", 6, 0, "abcdefghij", 0, 0);
480    test("abcde", 6, 0, "abcdefghij", 1, 0);
481    test("abcde", 6, 0, "abcdefghij", 5, 0);
482    test("abcde", 6, 0, "abcdefghij", 9, 0);
483    test("abcde", 6, 0, "abcdefghij", 10, 0);
484    test("abcde", 6, 0, "abcdefghijklmnopqrst", 0, 0);
485    test("abcde", 6, 0, "abcdefghijklmnopqrst", 1, 0);
486    test("abcde", 6, 0, "abcdefghijklmnopqrst", 10, 0);
487    test("abcde", 6, 0, "abcdefghijklmnopqrst", 19, 0);
488    test("abcde", 6, 0, "abcdefghijklmnopqrst", 20, 0);
489    test("abcdefghij", 0, 0, "", 0, 0);
490    test("abcdefghij", 0, 0, "abcde", 0, 0);
491    test("abcdefghij", 0, 0, "abcde", 1, -1);
492    test("abcdefghij", 0, 0, "abcde", 2, -2);
493    test("abcdefghij", 0, 0, "abcde", 4, -4);
494    test("abcdefghij", 0, 0, "abcde", 5, -5);
495    test("abcdefghij", 0, 0, "abcdefghij", 0, 0);
496    test("abcdefghij", 0, 0, "abcdefghij", 1, -1);
497    test("abcdefghij", 0, 0, "abcdefghij", 5, -5);
498    test("abcdefghij", 0, 0, "abcdefghij", 9, -9);
499    test("abcdefghij", 0, 0, "abcdefghij", 10, -10);
500    test("abcdefghij", 0, 0, "abcdefghijklmnopqrst", 0, 0);
501    test("abcdefghij", 0, 0, "abcdefghijklmnopqrst", 1, -1);
502    test("abcdefghij", 0, 0, "abcdefghijklmnopqrst", 10, -10);
503    test("abcdefghij", 0, 0, "abcdefghijklmnopqrst", 19, -19);
504    test("abcdefghij", 0, 0, "abcdefghijklmnopqrst", 20, -20);
505    test("abcdefghij", 0, 1, "", 0, 1);
506    test("abcdefghij", 0, 1, "abcde", 0, 1);
507    test("abcdefghij", 0, 1, "abcde", 1, 0);
508    test("abcdefghij", 0, 1, "abcde", 2, -1);
509    test("abcdefghij", 0, 1, "abcde", 4, -3);
510    test("abcdefghij", 0, 1, "abcde", 5, -4);
511    test("abcdefghij", 0, 1, "abcdefghij", 0, 1);
512    test("abcdefghij", 0, 1, "abcdefghij", 1, 0);
513    test("abcdefghij", 0, 1, "abcdefghij", 5, -4);
514    test("abcdefghij", 0, 1, "abcdefghij", 9, -8);
515    test("abcdefghij", 0, 1, "abcdefghij", 10, -9);
516    test("abcdefghij", 0, 1, "abcdefghijklmnopqrst", 0, 1);
517    test("abcdefghij", 0, 1, "abcdefghijklmnopqrst", 1, 0);
518    test("abcdefghij", 0, 1, "abcdefghijklmnopqrst", 10, -9);
519    test("abcdefghij", 0, 1, "abcdefghijklmnopqrst", 19, -18);
520    test("abcdefghij", 0, 1, "abcdefghijklmnopqrst", 20, -19);
521    test("abcdefghij", 0, 5, "", 0, 5);
522    test("abcdefghij", 0, 5, "abcde", 0, 5);
523    test("abcdefghij", 0, 5, "abcde", 1, 4);
524    test("abcdefghij", 0, 5, "abcde", 2, 3);
525    test("abcdefghij", 0, 5, "abcde", 4, 1);
526    test("abcdefghij", 0, 5, "abcde", 5, 0);
527    test("abcdefghij", 0, 5, "abcdefghij", 0, 5);
528    test("abcdefghij", 0, 5, "abcdefghij", 1, 4);
529    test("abcdefghij", 0, 5, "abcdefghij", 5, 0);
530    test("abcdefghij", 0, 5, "abcdefghij", 9, -4);
531    test("abcdefghij", 0, 5, "abcdefghij", 10, -5);
532    test("abcdefghij", 0, 5, "abcdefghijklmnopqrst", 0, 5);
533    test("abcdefghij", 0, 5, "abcdefghijklmnopqrst", 1, 4);
534    test("abcdefghij", 0, 5, "abcdefghijklmnopqrst", 10, -5);
535    test("abcdefghij", 0, 5, "abcdefghijklmnopqrst", 19, -14);
536    test("abcdefghij", 0, 5, "abcdefghijklmnopqrst", 20, -15);
537    test("abcdefghij", 0, 9, "", 0, 9);
538    test("abcdefghij", 0, 9, "abcde", 0, 9);
539    test("abcdefghij", 0, 9, "abcde", 1, 8);
540    test("abcdefghij", 0, 9, "abcde", 2, 7);
541    test("abcdefghij", 0, 9, "abcde", 4, 5);
542    test("abcdefghij", 0, 9, "abcde", 5, 4);
543    test("abcdefghij", 0, 9, "abcdefghij", 0, 9);
544    test("abcdefghij", 0, 9, "abcdefghij", 1, 8);
545    test("abcdefghij", 0, 9, "abcdefghij", 5, 4);
546    test("abcdefghij", 0, 9, "abcdefghij", 9, 0);
547    test("abcdefghij", 0, 9, "abcdefghij", 10, -1);
548    test("abcdefghij", 0, 9, "abcdefghijklmnopqrst", 0, 9);
549    test("abcdefghij", 0, 9, "abcdefghijklmnopqrst", 1, 8);
550    test("abcdefghij", 0, 9, "abcdefghijklmnopqrst", 10, -1);
551    test("abcdefghij", 0, 9, "abcdefghijklmnopqrst", 19, -10);
552    test("abcdefghij", 0, 9, "abcdefghijklmnopqrst", 20, -11);
553    test("abcdefghij", 0, 10, "", 0, 10);
554    test("abcdefghij", 0, 10, "abcde", 0, 10);
555    test("abcdefghij", 0, 10, "abcde", 1, 9);
556    test("abcdefghij", 0, 10, "abcde", 2, 8);
557    test("abcdefghij", 0, 10, "abcde", 4, 6);
558    test("abcdefghij", 0, 10, "abcde", 5, 5);
559    test("abcdefghij", 0, 10, "abcdefghij", 0, 10);
560    test("abcdefghij", 0, 10, "abcdefghij", 1, 9);
561    test("abcdefghij", 0, 10, "abcdefghij", 5, 5);
562    test("abcdefghij", 0, 10, "abcdefghij", 9, 1);
563    test("abcdefghij", 0, 10, "abcdefghij", 10, 0);
564    test("abcdefghij", 0, 10, "abcdefghijklmnopqrst", 0, 10);
565    test("abcdefghij", 0, 10, "abcdefghijklmnopqrst", 1, 9);
566    test("abcdefghij", 0, 10, "abcdefghijklmnopqrst", 10, 0);
567    test("abcdefghij", 0, 10, "abcdefghijklmnopqrst", 19, -9);
568    test("abcdefghij", 0, 10, "abcdefghijklmnopqrst", 20, -10);
569    test("abcdefghij", 0, 11, "", 0, 10);
570    test("abcdefghij", 0, 11, "abcde", 0, 10);
571    test("abcdefghij", 0, 11, "abcde", 1, 9);
572    test("abcdefghij", 0, 11, "abcde", 2, 8);
573}
574
575
576void test5()
577{
578    test("abcdefghij", 0, 11, "abcde", 4, 6);
579    test("abcdefghij", 0, 11, "abcde", 5, 5);
580    test("abcdefghij", 0, 11, "abcdefghij", 0, 10);
581    test("abcdefghij", 0, 11, "abcdefghij", 1, 9);
582    test("abcdefghij", 0, 11, "abcdefghij", 5, 5);
583    test("abcdefghij", 0, 11, "abcdefghij", 9, 1);
584    test("abcdefghij", 0, 11, "abcdefghij", 10, 0);
585    test("abcdefghij", 0, 11, "abcdefghijklmnopqrst", 0, 10);
586    test("abcdefghij", 0, 11, "abcdefghijklmnopqrst", 1, 9);
587    test("abcdefghij", 0, 11, "abcdefghijklmnopqrst", 10, 0);
588    test("abcdefghij", 0, 11, "abcdefghijklmnopqrst", 19, -9);
589    test("abcdefghij", 0, 11, "abcdefghijklmnopqrst", 20, -10);
590    test("abcdefghij", 1, 0, "", 0, 0);
591    test("abcdefghij", 1, 0, "abcde", 0, 0);
592    test("abcdefghij", 1, 0, "abcde", 1, -1);
593    test("abcdefghij", 1, 0, "abcde", 2, -2);
594    test("abcdefghij", 1, 0, "abcde", 4, -4);
595    test("abcdefghij", 1, 0, "abcde", 5, -5);
596    test("abcdefghij", 1, 0, "abcdefghij", 0, 0);
597    test("abcdefghij", 1, 0, "abcdefghij", 1, -1);
598    test("abcdefghij", 1, 0, "abcdefghij", 5, -5);
599    test("abcdefghij", 1, 0, "abcdefghij", 9, -9);
600    test("abcdefghij", 1, 0, "abcdefghij", 10, -10);
601    test("abcdefghij", 1, 0, "abcdefghijklmnopqrst", 0, 0);
602    test("abcdefghij", 1, 0, "abcdefghijklmnopqrst", 1, -1);
603    test("abcdefghij", 1, 0, "abcdefghijklmnopqrst", 10, -10);
604    test("abcdefghij", 1, 0, "abcdefghijklmnopqrst", 19, -19);
605    test("abcdefghij", 1, 0, "abcdefghijklmnopqrst", 20, -20);
606    test("abcdefghij", 1, 1, "", 0, 1);
607    test("abcdefghij", 1, 1, "abcde", 0, 1);
608    test("abcdefghij", 1, 1, "abcde", 1, 1);
609    test("abcdefghij", 1, 1, "abcde", 2, 1);
610    test("abcdefghij", 1, 1, "abcde", 4, 1);
611    test("abcdefghij", 1, 1, "abcde", 5, 1);
612    test("abcdefghij", 1, 1, "abcdefghij", 0, 1);
613    test("abcdefghij", 1, 1, "abcdefghij", 1, 1);
614    test("abcdefghij", 1, 1, "abcdefghij", 5, 1);
615    test("abcdefghij", 1, 1, "abcdefghij", 9, 1);
616    test("abcdefghij", 1, 1, "abcdefghij", 10, 1);
617    test("abcdefghij", 1, 1, "abcdefghijklmnopqrst", 0, 1);
618    test("abcdefghij", 1, 1, "abcdefghijklmnopqrst", 1, 1);
619    test("abcdefghij", 1, 1, "abcdefghijklmnopqrst", 10, 1);
620    test("abcdefghij", 1, 1, "abcdefghijklmnopqrst", 19, 1);
621    test("abcdefghij", 1, 1, "abcdefghijklmnopqrst", 20, 1);
622    test("abcdefghij", 1, 4, "", 0, 4);
623    test("abcdefghij", 1, 4, "abcde", 0, 4);
624    test("abcdefghij", 1, 4, "abcde", 1, 1);
625    test("abcdefghij", 1, 4, "abcde", 2, 1);
626    test("abcdefghij", 1, 4, "abcde", 4, 1);
627    test("abcdefghij", 1, 4, "abcde", 5, 1);
628    test("abcdefghij", 1, 4, "abcdefghij", 0, 4);
629    test("abcdefghij", 1, 4, "abcdefghij", 1, 1);
630    test("abcdefghij", 1, 4, "abcdefghij", 5, 1);
631    test("abcdefghij", 1, 4, "abcdefghij", 9, 1);
632    test("abcdefghij", 1, 4, "abcdefghij", 10, 1);
633    test("abcdefghij", 1, 4, "abcdefghijklmnopqrst", 0, 4);
634    test("abcdefghij", 1, 4, "abcdefghijklmnopqrst", 1, 1);
635    test("abcdefghij", 1, 4, "abcdefghijklmnopqrst", 10, 1);
636    test("abcdefghij", 1, 4, "abcdefghijklmnopqrst", 19, 1);
637    test("abcdefghij", 1, 4, "abcdefghijklmnopqrst", 20, 1);
638    test("abcdefghij", 1, 8, "", 0, 8);
639    test("abcdefghij", 1, 8, "abcde", 0, 8);
640    test("abcdefghij", 1, 8, "abcde", 1, 1);
641    test("abcdefghij", 1, 8, "abcde", 2, 1);
642    test("abcdefghij", 1, 8, "abcde", 4, 1);
643    test("abcdefghij", 1, 8, "abcde", 5, 1);
644    test("abcdefghij", 1, 8, "abcdefghij", 0, 8);
645    test("abcdefghij", 1, 8, "abcdefghij", 1, 1);
646    test("abcdefghij", 1, 8, "abcdefghij", 5, 1);
647    test("abcdefghij", 1, 8, "abcdefghij", 9, 1);
648    test("abcdefghij", 1, 8, "abcdefghij", 10, 1);
649    test("abcdefghij", 1, 8, "abcdefghijklmnopqrst", 0, 8);
650    test("abcdefghij", 1, 8, "abcdefghijklmnopqrst", 1, 1);
651    test("abcdefghij", 1, 8, "abcdefghijklmnopqrst", 10, 1);
652    test("abcdefghij", 1, 8, "abcdefghijklmnopqrst", 19, 1);
653    test("abcdefghij", 1, 8, "abcdefghijklmnopqrst", 20, 1);
654    test("abcdefghij", 1, 9, "", 0, 9);
655    test("abcdefghij", 1, 9, "abcde", 0, 9);
656    test("abcdefghij", 1, 9, "abcde", 1, 1);
657    test("abcdefghij", 1, 9, "abcde", 2, 1);
658    test("abcdefghij", 1, 9, "abcde", 4, 1);
659    test("abcdefghij", 1, 9, "abcde", 5, 1);
660    test("abcdefghij", 1, 9, "abcdefghij", 0, 9);
661    test("abcdefghij", 1, 9, "abcdefghij", 1, 1);
662    test("abcdefghij", 1, 9, "abcdefghij", 5, 1);
663    test("abcdefghij", 1, 9, "abcdefghij", 9, 1);
664    test("abcdefghij", 1, 9, "abcdefghij", 10, 1);
665    test("abcdefghij", 1, 9, "abcdefghijklmnopqrst", 0, 9);
666    test("abcdefghij", 1, 9, "abcdefghijklmnopqrst", 1, 1);
667    test("abcdefghij", 1, 9, "abcdefghijklmnopqrst", 10, 1);
668    test("abcdefghij", 1, 9, "abcdefghijklmnopqrst", 19, 1);
669    test("abcdefghij", 1, 9, "abcdefghijklmnopqrst", 20, 1);
670    test("abcdefghij", 1, 10, "", 0, 9);
671    test("abcdefghij", 1, 10, "abcde", 0, 9);
672    test("abcdefghij", 1, 10, "abcde", 1, 1);
673    test("abcdefghij", 1, 10, "abcde", 2, 1);
674    test("abcdefghij", 1, 10, "abcde", 4, 1);
675    test("abcdefghij", 1, 10, "abcde", 5, 1);
676    test("abcdefghij", 1, 10, "abcdefghij", 0, 9);
677    test("abcdefghij", 1, 10, "abcdefghij", 1, 1);
678}
679
680
681void test6()
682{
683    test("abcdefghij", 1, 10, "abcdefghij", 5, 1);
684    test("abcdefghij", 1, 10, "abcdefghij", 9, 1);
685    test("abcdefghij", 1, 10, "abcdefghij", 10, 1);
686    test("abcdefghij", 1, 10, "abcdefghijklmnopqrst", 0, 9);
687    test("abcdefghij", 1, 10, "abcdefghijklmnopqrst", 1, 1);
688    test("abcdefghij", 1, 10, "abcdefghijklmnopqrst", 10, 1);
689    test("abcdefghij", 1, 10, "abcdefghijklmnopqrst", 19, 1);
690    test("abcdefghij", 1, 10, "abcdefghijklmnopqrst", 20, 1);
691    test("abcdefghij", 5, 0, "", 0, 0);
692    test("abcdefghij", 5, 0, "abcde", 0, 0);
693    test("abcdefghij", 5, 0, "abcde", 1, -1);
694    test("abcdefghij", 5, 0, "abcde", 2, -2);
695    test("abcdefghij", 5, 0, "abcde", 4, -4);
696    test("abcdefghij", 5, 0, "abcde", 5, -5);
697    test("abcdefghij", 5, 0, "abcdefghij", 0, 0);
698    test("abcdefghij", 5, 0, "abcdefghij", 1, -1);
699    test("abcdefghij", 5, 0, "abcdefghij", 5, -5);
700    test("abcdefghij", 5, 0, "abcdefghij", 9, -9);
701    test("abcdefghij", 5, 0, "abcdefghij", 10, -10);
702    test("abcdefghij", 5, 0, "abcdefghijklmnopqrst", 0, 0);
703    test("abcdefghij", 5, 0, "abcdefghijklmnopqrst", 1, -1);
704    test("abcdefghij", 5, 0, "abcdefghijklmnopqrst", 10, -10);
705    test("abcdefghij", 5, 0, "abcdefghijklmnopqrst", 19, -19);
706    test("abcdefghij", 5, 0, "abcdefghijklmnopqrst", 20, -20);
707    test("abcdefghij", 5, 1, "", 0, 1);
708    test("abcdefghij", 5, 1, "abcde", 0, 1);
709    test("abcdefghij", 5, 1, "abcde", 1, 5);
710    test("abcdefghij", 5, 1, "abcde", 2, 5);
711    test("abcdefghij", 5, 1, "abcde", 4, 5);
712    test("abcdefghij", 5, 1, "abcde", 5, 5);
713    test("abcdefghij", 5, 1, "abcdefghij", 0, 1);
714    test("abcdefghij", 5, 1, "abcdefghij", 1, 5);
715    test("abcdefghij", 5, 1, "abcdefghij", 5, 5);
716    test("abcdefghij", 5, 1, "abcdefghij", 9, 5);
717    test("abcdefghij", 5, 1, "abcdefghij", 10, 5);
718    test("abcdefghij", 5, 1, "abcdefghijklmnopqrst", 0, 1);
719    test("abcdefghij", 5, 1, "abcdefghijklmnopqrst", 1, 5);
720    test("abcdefghij", 5, 1, "abcdefghijklmnopqrst", 10, 5);
721    test("abcdefghij", 5, 1, "abcdefghijklmnopqrst", 19, 5);
722    test("abcdefghij", 5, 1, "abcdefghijklmnopqrst", 20, 5);
723    test("abcdefghij", 5, 2, "", 0, 2);
724    test("abcdefghij", 5, 2, "abcde", 0, 2);
725    test("abcdefghij", 5, 2, "abcde", 1, 5);
726    test("abcdefghij", 5, 2, "abcde", 2, 5);
727    test("abcdefghij", 5, 2, "abcde", 4, 5);
728    test("abcdefghij", 5, 2, "abcde", 5, 5);
729    test("abcdefghij", 5, 2, "abcdefghij", 0, 2);
730    test("abcdefghij", 5, 2, "abcdefghij", 1, 5);
731    test("abcdefghij", 5, 2, "abcdefghij", 5, 5);
732    test("abcdefghij", 5, 2, "abcdefghij", 9, 5);
733    test("abcdefghij", 5, 2, "abcdefghij", 10, 5);
734    test("abcdefghij", 5, 2, "abcdefghijklmnopqrst", 0, 2);
735    test("abcdefghij", 5, 2, "abcdefghijklmnopqrst", 1, 5);
736    test("abcdefghij", 5, 2, "abcdefghijklmnopqrst", 10, 5);
737    test("abcdefghij", 5, 2, "abcdefghijklmnopqrst", 19, 5);
738    test("abcdefghij", 5, 2, "abcdefghijklmnopqrst", 20, 5);
739    test("abcdefghij", 5, 4, "", 0, 4);
740    test("abcdefghij", 5, 4, "abcde", 0, 4);
741    test("abcdefghij", 5, 4, "abcde", 1, 5);
742    test("abcdefghij", 5, 4, "abcde", 2, 5);
743    test("abcdefghij", 5, 4, "abcde", 4, 5);
744    test("abcdefghij", 5, 4, "abcde", 5, 5);
745    test("abcdefghij", 5, 4, "abcdefghij", 0, 4);
746    test("abcdefghij", 5, 4, "abcdefghij", 1, 5);
747    test("abcdefghij", 5, 4, "abcdefghij", 5, 5);
748    test("abcdefghij", 5, 4, "abcdefghij", 9, 5);
749    test("abcdefghij", 5, 4, "abcdefghij", 10, 5);
750    test("abcdefghij", 5, 4, "abcdefghijklmnopqrst", 0, 4);
751    test("abcdefghij", 5, 4, "abcdefghijklmnopqrst", 1, 5);
752    test("abcdefghij", 5, 4, "abcdefghijklmnopqrst", 10, 5);
753    test("abcdefghij", 5, 4, "abcdefghijklmnopqrst", 19, 5);
754    test("abcdefghij", 5, 4, "abcdefghijklmnopqrst", 20, 5);
755    test("abcdefghij", 5, 5, "", 0, 5);
756    test("abcdefghij", 5, 5, "abcde", 0, 5);
757    test("abcdefghij", 5, 5, "abcde", 1, 5);
758    test("abcdefghij", 5, 5, "abcde", 2, 5);
759    test("abcdefghij", 5, 5, "abcde", 4, 5);
760    test("abcdefghij", 5, 5, "abcde", 5, 5);
761    test("abcdefghij", 5, 5, "abcdefghij", 0, 5);
762    test("abcdefghij", 5, 5, "abcdefghij", 1, 5);
763    test("abcdefghij", 5, 5, "abcdefghij", 5, 5);
764    test("abcdefghij", 5, 5, "abcdefghij", 9, 5);
765    test("abcdefghij", 5, 5, "abcdefghij", 10, 5);
766    test("abcdefghij", 5, 5, "abcdefghijklmnopqrst", 0, 5);
767    test("abcdefghij", 5, 5, "abcdefghijklmnopqrst", 1, 5);
768    test("abcdefghij", 5, 5, "abcdefghijklmnopqrst", 10, 5);
769    test("abcdefghij", 5, 5, "abcdefghijklmnopqrst", 19, 5);
770    test("abcdefghij", 5, 5, "abcdefghijklmnopqrst", 20, 5);
771    test("abcdefghij", 5, 6, "", 0, 5);
772    test("abcdefghij", 5, 6, "abcde", 0, 5);
773    test("abcdefghij", 5, 6, "abcde", 1, 5);
774    test("abcdefghij", 5, 6, "abcde", 2, 5);
775    test("abcdefghij", 5, 6, "abcde", 4, 5);
776    test("abcdefghij", 5, 6, "abcde", 5, 5);
777    test("abcdefghij", 5, 6, "abcdefghij", 0, 5);
778    test("abcdefghij", 5, 6, "abcdefghij", 1, 5);
779    test("abcdefghij", 5, 6, "abcdefghij", 5, 5);
780    test("abcdefghij", 5, 6, "abcdefghij", 9, 5);
781    test("abcdefghij", 5, 6, "abcdefghij", 10, 5);
782    test("abcdefghij", 5, 6, "abcdefghijklmnopqrst", 0, 5);
783}
784
785
786void test7()
787{
788    test("abcdefghij", 5, 6, "abcdefghijklmnopqrst", 1, 5);
789    test("abcdefghij", 5, 6, "abcdefghijklmnopqrst", 10, 5);
790    test("abcdefghij", 5, 6, "abcdefghijklmnopqrst", 19, 5);
791    test("abcdefghij", 5, 6, "abcdefghijklmnopqrst", 20, 5);
792    test("abcdefghij", 9, 0, "", 0, 0);
793    test("abcdefghij", 9, 0, "abcde", 0, 0);
794    test("abcdefghij", 9, 0, "abcde", 1, -1);
795    test("abcdefghij", 9, 0, "abcde", 2, -2);
796    test("abcdefghij", 9, 0, "abcde", 4, -4);
797    test("abcdefghij", 9, 0, "abcde", 5, -5);
798    test("abcdefghij", 9, 0, "abcdefghij", 0, 0);
799    test("abcdefghij", 9, 0, "abcdefghij", 1, -1);
800    test("abcdefghij", 9, 0, "abcdefghij", 5, -5);
801    test("abcdefghij", 9, 0, "abcdefghij", 9, -9);
802    test("abcdefghij", 9, 0, "abcdefghij", 10, -10);
803    test("abcdefghij", 9, 0, "abcdefghijklmnopqrst", 0, 0);
804    test("abcdefghij", 9, 0, "abcdefghijklmnopqrst", 1, -1);
805    test("abcdefghij", 9, 0, "abcdefghijklmnopqrst", 10, -10);
806    test("abcdefghij", 9, 0, "abcdefghijklmnopqrst", 19, -19);
807    test("abcdefghij", 9, 0, "abcdefghijklmnopqrst", 20, -20);
808    test("abcdefghij", 9, 1, "", 0, 1);
809    test("abcdefghij", 9, 1, "abcde", 0, 1);
810    test("abcdefghij", 9, 1, "abcde", 1, 9);
811    test("abcdefghij", 9, 1, "abcde", 2, 9);
812    test("abcdefghij", 9, 1, "abcde", 4, 9);
813    test("abcdefghij", 9, 1, "abcde", 5, 9);
814    test("abcdefghij", 9, 1, "abcdefghij", 0, 1);
815    test("abcdefghij", 9, 1, "abcdefghij", 1, 9);
816    test("abcdefghij", 9, 1, "abcdefghij", 5, 9);
817    test("abcdefghij", 9, 1, "abcdefghij", 9, 9);
818    test("abcdefghij", 9, 1, "abcdefghij", 10, 9);
819    test("abcdefghij", 9, 1, "abcdefghijklmnopqrst", 0, 1);
820    test("abcdefghij", 9, 1, "abcdefghijklmnopqrst", 1, 9);
821    test("abcdefghij", 9, 1, "abcdefghijklmnopqrst", 10, 9);
822    test("abcdefghij", 9, 1, "abcdefghijklmnopqrst", 19, 9);
823    test("abcdefghij", 9, 1, "abcdefghijklmnopqrst", 20, 9);
824    test("abcdefghij", 9, 2, "", 0, 1);
825    test("abcdefghij", 9, 2, "abcde", 0, 1);
826    test("abcdefghij", 9, 2, "abcde", 1, 9);
827    test("abcdefghij", 9, 2, "abcde", 2, 9);
828    test("abcdefghij", 9, 2, "abcde", 4, 9);
829    test("abcdefghij", 9, 2, "abcde", 5, 9);
830    test("abcdefghij", 9, 2, "abcdefghij", 0, 1);
831    test("abcdefghij", 9, 2, "abcdefghij", 1, 9);
832    test("abcdefghij", 9, 2, "abcdefghij", 5, 9);
833    test("abcdefghij", 9, 2, "abcdefghij", 9, 9);
834    test("abcdefghij", 9, 2, "abcdefghij", 10, 9);
835    test("abcdefghij", 9, 2, "abcdefghijklmnopqrst", 0, 1);
836    test("abcdefghij", 9, 2, "abcdefghijklmnopqrst", 1, 9);
837    test("abcdefghij", 9, 2, "abcdefghijklmnopqrst", 10, 9);
838    test("abcdefghij", 9, 2, "abcdefghijklmnopqrst", 19, 9);
839    test("abcdefghij", 9, 2, "abcdefghijklmnopqrst", 20, 9);
840    test("abcdefghij", 10, 0, "", 0, 0);
841    test("abcdefghij", 10, 0, "abcde", 0, 0);
842    test("abcdefghij", 10, 0, "abcde", 1, -1);
843    test("abcdefghij", 10, 0, "abcde", 2, -2);
844    test("abcdefghij", 10, 0, "abcde", 4, -4);
845    test("abcdefghij", 10, 0, "abcde", 5, -5);
846    test("abcdefghij", 10, 0, "abcdefghij", 0, 0);
847    test("abcdefghij", 10, 0, "abcdefghij", 1, -1);
848    test("abcdefghij", 10, 0, "abcdefghij", 5, -5);
849    test("abcdefghij", 10, 0, "abcdefghij", 9, -9);
850    test("abcdefghij", 10, 0, "abcdefghij", 10, -10);
851    test("abcdefghij", 10, 0, "abcdefghijklmnopqrst", 0, 0);
852    test("abcdefghij", 10, 0, "abcdefghijklmnopqrst", 1, -1);
853    test("abcdefghij", 10, 0, "abcdefghijklmnopqrst", 10, -10);
854    test("abcdefghij", 10, 0, "abcdefghijklmnopqrst", 19, -19);
855    test("abcdefghij", 10, 0, "abcdefghijklmnopqrst", 20, -20);
856    test("abcdefghij", 10, 1, "", 0, 0);
857    test("abcdefghij", 10, 1, "abcde", 0, 0);
858    test("abcdefghij", 10, 1, "abcde", 1, -1);
859    test("abcdefghij", 10, 1, "abcde", 2, -2);
860    test("abcdefghij", 10, 1, "abcde", 4, -4);
861    test("abcdefghij", 10, 1, "abcde", 5, -5);
862    test("abcdefghij", 10, 1, "abcdefghij", 0, 0);
863    test("abcdefghij", 10, 1, "abcdefghij", 1, -1);
864    test("abcdefghij", 10, 1, "abcdefghij", 5, -5);
865    test("abcdefghij", 10, 1, "abcdefghij", 9, -9);
866    test("abcdefghij", 10, 1, "abcdefghij", 10, -10);
867    test("abcdefghij", 10, 1, "abcdefghijklmnopqrst", 0, 0);
868    test("abcdefghij", 10, 1, "abcdefghijklmnopqrst", 1, -1);
869    test("abcdefghij", 10, 1, "abcdefghijklmnopqrst", 10, -10);
870    test("abcdefghij", 10, 1, "abcdefghijklmnopqrst", 19, -19);
871    test("abcdefghij", 10, 1, "abcdefghijklmnopqrst", 20, -20);
872    test("abcdefghij", 11, 0, "", 0, 0);
873    test("abcdefghij", 11, 0, "abcde", 0, 0);
874    test("abcdefghij", 11, 0, "abcde", 1, 0);
875    test("abcdefghij", 11, 0, "abcde", 2, 0);
876    test("abcdefghij", 11, 0, "abcde", 4, 0);
877    test("abcdefghij", 11, 0, "abcde", 5, 0);
878    test("abcdefghij", 11, 0, "abcdefghij", 0, 0);
879    test("abcdefghij", 11, 0, "abcdefghij", 1, 0);
880    test("abcdefghij", 11, 0, "abcdefghij", 5, 0);
881    test("abcdefghij", 11, 0, "abcdefghij", 9, 0);
882    test("abcdefghij", 11, 0, "abcdefghij", 10, 0);
883    test("abcdefghij", 11, 0, "abcdefghijklmnopqrst", 0, 0);
884    test("abcdefghij", 11, 0, "abcdefghijklmnopqrst", 1, 0);
885    test("abcdefghij", 11, 0, "abcdefghijklmnopqrst", 10, 0);
886    test("abcdefghij", 11, 0, "abcdefghijklmnopqrst", 19, 0);
887    test("abcdefghij", 11, 0, "abcdefghijklmnopqrst", 20, 0);
888}
889
890void test8()
891{
892    test("abcdefghijklmnopqrst", 0, 0, "", 0, 0);
893    test("abcdefghijklmnopqrst", 0, 0, "abcde", 0, 0);
894    test("abcdefghijklmnopqrst", 0, 0, "abcde", 1, -1);
895    test("abcdefghijklmnopqrst", 0, 0, "abcde", 2, -2);
896    test("abcdefghijklmnopqrst", 0, 0, "abcde", 4, -4);
897    test("abcdefghijklmnopqrst", 0, 0, "abcde", 5, -5);
898    test("abcdefghijklmnopqrst", 0, 0, "abcdefghij", 0, 0);
899    test("abcdefghijklmnopqrst", 0, 0, "abcdefghij", 1, -1);
900    test("abcdefghijklmnopqrst", 0, 0, "abcdefghij", 5, -5);
901    test("abcdefghijklmnopqrst", 0, 0, "abcdefghij", 9, -9);
902    test("abcdefghijklmnopqrst", 0, 0, "abcdefghij", 10, -10);
903    test("abcdefghijklmnopqrst", 0, 0, "abcdefghijklmnopqrst", 0, 0);
904    test("abcdefghijklmnopqrst", 0, 0, "abcdefghijklmnopqrst", 1, -1);
905    test("abcdefghijklmnopqrst", 0, 0, "abcdefghijklmnopqrst", 10, -10);
906    test("abcdefghijklmnopqrst", 0, 0, "abcdefghijklmnopqrst", 19, -19);
907    test("abcdefghijklmnopqrst", 0, 0, "abcdefghijklmnopqrst", 20, -20);
908    test("abcdefghijklmnopqrst", 0, 1, "", 0, 1);
909    test("abcdefghijklmnopqrst", 0, 1, "abcde", 0, 1);
910    test("abcdefghijklmnopqrst", 0, 1, "abcde", 1, 0);
911    test("abcdefghijklmnopqrst", 0, 1, "abcde", 2, -1);
912    test("abcdefghijklmnopqrst", 0, 1, "abcde", 4, -3);
913    test("abcdefghijklmnopqrst", 0, 1, "abcde", 5, -4);
914    test("abcdefghijklmnopqrst", 0, 1, "abcdefghij", 0, 1);
915    test("abcdefghijklmnopqrst", 0, 1, "abcdefghij", 1, 0);
916    test("abcdefghijklmnopqrst", 0, 1, "abcdefghij", 5, -4);
917    test("abcdefghijklmnopqrst", 0, 1, "abcdefghij", 9, -8);
918    test("abcdefghijklmnopqrst", 0, 1, "abcdefghij", 10, -9);
919    test("abcdefghijklmnopqrst", 0, 1, "abcdefghijklmnopqrst", 0, 1);
920    test("abcdefghijklmnopqrst", 0, 1, "abcdefghijklmnopqrst", 1, 0);
921    test("abcdefghijklmnopqrst", 0, 1, "abcdefghijklmnopqrst", 10, -9);
922    test("abcdefghijklmnopqrst", 0, 1, "abcdefghijklmnopqrst", 19, -18);
923    test("abcdefghijklmnopqrst", 0, 1, "abcdefghijklmnopqrst", 20, -19);
924    test("abcdefghijklmnopqrst", 0, 10, "", 0, 10);
925    test("abcdefghijklmnopqrst", 0, 10, "abcde", 0, 10);
926    test("abcdefghijklmnopqrst", 0, 10, "abcde", 1, 9);
927    test("abcdefghijklmnopqrst", 0, 10, "abcde", 2, 8);
928    test("abcdefghijklmnopqrst", 0, 10, "abcde", 4, 6);
929    test("abcdefghijklmnopqrst", 0, 10, "abcde", 5, 5);
930    test("abcdefghijklmnopqrst", 0, 10, "abcdefghij", 0, 10);
931    test("abcdefghijklmnopqrst", 0, 10, "abcdefghij", 1, 9);
932    test("abcdefghijklmnopqrst", 0, 10, "abcdefghij", 5, 5);
933    test("abcdefghijklmnopqrst", 0, 10, "abcdefghij", 9, 1);
934    test("abcdefghijklmnopqrst", 0, 10, "abcdefghij", 10, 0);
935    test("abcdefghijklmnopqrst", 0, 10, "abcdefghijklmnopqrst", 0, 10);
936    test("abcdefghijklmnopqrst", 0, 10, "abcdefghijklmnopqrst", 1, 9);
937    test("abcdefghijklmnopqrst", 0, 10, "abcdefghijklmnopqrst", 10, 0);
938    test("abcdefghijklmnopqrst", 0, 10, "abcdefghijklmnopqrst", 19, -9);
939    test("abcdefghijklmnopqrst", 0, 10, "abcdefghijklmnopqrst", 20, -10);
940    test("abcdefghijklmnopqrst", 0, 19, "", 0, 19);
941    test("abcdefghijklmnopqrst", 0, 19, "abcde", 0, 19);
942    test("abcdefghijklmnopqrst", 0, 19, "abcde", 1, 18);
943    test("abcdefghijklmnopqrst", 0, 19, "abcde", 2, 17);
944    test("abcdefghijklmnopqrst", 0, 19, "abcde", 4, 15);
945    test("abcdefghijklmnopqrst", 0, 19, "abcde", 5, 14);
946    test("abcdefghijklmnopqrst", 0, 19, "abcdefghij", 0, 19);
947    test("abcdefghijklmnopqrst", 0, 19, "abcdefghij", 1, 18);
948    test("abcdefghijklmnopqrst", 0, 19, "abcdefghij", 5, 14);
949    test("abcdefghijklmnopqrst", 0, 19, "abcdefghij", 9, 10);
950    test("abcdefghijklmnopqrst", 0, 19, "abcdefghij", 10, 9);
951    test("abcdefghijklmnopqrst", 0, 19, "abcdefghijklmnopqrst", 0, 19);
952    test("abcdefghijklmnopqrst", 0, 19, "abcdefghijklmnopqrst", 1, 18);
953    test("abcdefghijklmnopqrst", 0, 19, "abcdefghijklmnopqrst", 10, 9);
954    test("abcdefghijklmnopqrst", 0, 19, "abcdefghijklmnopqrst", 19, 0);
955    test("abcdefghijklmnopqrst", 0, 19, "abcdefghijklmnopqrst", 20, -1);
956    test("abcdefghijklmnopqrst", 0, 20, "", 0, 20);
957    test("abcdefghijklmnopqrst", 0, 20, "abcde", 0, 20);
958    test("abcdefghijklmnopqrst", 0, 20, "abcde", 1, 19);
959    test("abcdefghijklmnopqrst", 0, 20, "abcde", 2, 18);
960    test("abcdefghijklmnopqrst", 0, 20, "abcde", 4, 16);
961    test("abcdefghijklmnopqrst", 0, 20, "abcde", 5, 15);
962    test("abcdefghijklmnopqrst", 0, 20, "abcdefghij", 0, 20);
963    test("abcdefghijklmnopqrst", 0, 20, "abcdefghij", 1, 19);
964    test("abcdefghijklmnopqrst", 0, 20, "abcdefghij", 5, 15);
965    test("abcdefghijklmnopqrst", 0, 20, "abcdefghij", 9, 11);
966    test("abcdefghijklmnopqrst", 0, 20, "abcdefghij", 10, 10);
967    test("abcdefghijklmnopqrst", 0, 20, "abcdefghijklmnopqrst", 0, 20);
968    test("abcdefghijklmnopqrst", 0, 20, "abcdefghijklmnopqrst", 1, 19);
969    test("abcdefghijklmnopqrst", 0, 20, "abcdefghijklmnopqrst", 10, 10);
970    test("abcdefghijklmnopqrst", 0, 20, "abcdefghijklmnopqrst", 19, 1);
971    test("abcdefghijklmnopqrst", 0, 20, "abcdefghijklmnopqrst", 20, 0);
972    test("abcdefghijklmnopqrst", 0, 21, "", 0, 20);
973    test("abcdefghijklmnopqrst", 0, 21, "abcde", 0, 20);
974    test("abcdefghijklmnopqrst", 0, 21, "abcde", 1, 19);
975    test("abcdefghijklmnopqrst", 0, 21, "abcde", 2, 18);
976    test("abcdefghijklmnopqrst", 0, 21, "abcde", 4, 16);
977    test("abcdefghijklmnopqrst", 0, 21, "abcde", 5, 15);
978    test("abcdefghijklmnopqrst", 0, 21, "abcdefghij", 0, 20);
979    test("abcdefghijklmnopqrst", 0, 21, "abcdefghij", 1, 19);
980    test("abcdefghijklmnopqrst", 0, 21, "abcdefghij", 5, 15);
981    test("abcdefghijklmnopqrst", 0, 21, "abcdefghij", 9, 11);
982    test("abcdefghijklmnopqrst", 0, 21, "abcdefghij", 10, 10);
983    test("abcdefghijklmnopqrst", 0, 21, "abcdefghijklmnopqrst", 0, 20);
984    test("abcdefghijklmnopqrst", 0, 21, "abcdefghijklmnopqrst", 1, 19);
985    test("abcdefghijklmnopqrst", 0, 21, "abcdefghijklmnopqrst", 10, 10);
986    test("abcdefghijklmnopqrst", 0, 21, "abcdefghijklmnopqrst", 19, 1);
987    test("abcdefghijklmnopqrst", 0, 21, "abcdefghijklmnopqrst", 20, 0);
988    test("abcdefghijklmnopqrst", 1, 0, "", 0, 0);
989    test("abcdefghijklmnopqrst", 1, 0, "abcde", 0, 0);
990    test("abcdefghijklmnopqrst", 1, 0, "abcde", 1, -1);
991    test("abcdefghijklmnopqrst", 1, 0, "abcde", 2, -2);
992}
993
994
995void test9()
996{
997    test("abcdefghijklmnopqrst", 1, 0, "abcde", 4, -4);
998    test("abcdefghijklmnopqrst", 1, 0, "abcde", 5, -5);
999    test("abcdefghijklmnopqrst", 1, 0, "abcdefghij", 0, 0);
1000    test("abcdefghijklmnopqrst", 1, 0, "abcdefghij", 1, -1);
1001    test("abcdefghijklmnopqrst", 1, 0, "abcdefghij", 5, -5);
1002    test("abcdefghijklmnopqrst", 1, 0, "abcdefghij", 9, -9);
1003    test("abcdefghijklmnopqrst", 1, 0, "abcdefghij", 10, -10);
1004    test("abcdefghijklmnopqrst", 1, 0, "abcdefghijklmnopqrst", 0, 0);
1005    test("abcdefghijklmnopqrst", 1, 0, "abcdefghijklmnopqrst", 1, -1);
1006    test("abcdefghijklmnopqrst", 1, 0, "abcdefghijklmnopqrst", 10, -10);
1007    test("abcdefghijklmnopqrst", 1, 0, "abcdefghijklmnopqrst", 19, -19);
1008    test("abcdefghijklmnopqrst", 1, 0, "abcdefghijklmnopqrst", 20, -20);
1009    test("abcdefghijklmnopqrst", 1, 1, "", 0, 1);
1010    test("abcdefghijklmnopqrst", 1, 1, "abcde", 0, 1);
1011    test("abcdefghijklmnopqrst", 1, 1, "abcde", 1, 1);
1012    test("abcdefghijklmnopqrst", 1, 1, "abcde", 2, 1);
1013    test("abcdefghijklmnopqrst", 1, 1, "abcde", 4, 1);
1014    test("abcdefghijklmnopqrst", 1, 1, "abcde", 5, 1);
1015    test("abcdefghijklmnopqrst", 1, 1, "abcdefghij", 0, 1);
1016    test("abcdefghijklmnopqrst", 1, 1, "abcdefghij", 1, 1);
1017    test("abcdefghijklmnopqrst", 1, 1, "abcdefghij", 5, 1);
1018    test("abcdefghijklmnopqrst", 1, 1, "abcdefghij", 9, 1);
1019    test("abcdefghijklmnopqrst", 1, 1, "abcdefghij", 10, 1);
1020    test("abcdefghijklmnopqrst", 1, 1, "abcdefghijklmnopqrst", 0, 1);
1021    test("abcdefghijklmnopqrst", 1, 1, "abcdefghijklmnopqrst", 1, 1);
1022    test("abcdefghijklmnopqrst", 1, 1, "abcdefghijklmnopqrst", 10, 1);
1023    test("abcdefghijklmnopqrst", 1, 1, "abcdefghijklmnopqrst", 19, 1);
1024    test("abcdefghijklmnopqrst", 1, 1, "abcdefghijklmnopqrst", 20, 1);
1025    test("abcdefghijklmnopqrst", 1, 9, "", 0, 9);
1026    test("abcdefghijklmnopqrst", 1, 9, "abcde", 0, 9);
1027    test("abcdefghijklmnopqrst", 1, 9, "abcde", 1, 1);
1028    test("abcdefghijklmnopqrst", 1, 9, "abcde", 2, 1);
1029    test("abcdefghijklmnopqrst", 1, 9, "abcde", 4, 1);
1030    test("abcdefghijklmnopqrst", 1, 9, "abcde", 5, 1);
1031    test("abcdefghijklmnopqrst", 1, 9, "abcdefghij", 0, 9);
1032    test("abcdefghijklmnopqrst", 1, 9, "abcdefghij", 1, 1);
1033    test("abcdefghijklmnopqrst", 1, 9, "abcdefghij", 5, 1);
1034    test("abcdefghijklmnopqrst", 1, 9, "abcdefghij", 9, 1);
1035    test("abcdefghijklmnopqrst", 1, 9, "abcdefghij", 10, 1);
1036    test("abcdefghijklmnopqrst", 1, 9, "abcdefghijklmnopqrst", 0, 9);
1037    test("abcdefghijklmnopqrst", 1, 9, "abcdefghijklmnopqrst", 1, 1);
1038    test("abcdefghijklmnopqrst", 1, 9, "abcdefghijklmnopqrst", 10, 1);
1039    test("abcdefghijklmnopqrst", 1, 9, "abcdefghijklmnopqrst", 19, 1);
1040    test("abcdefghijklmnopqrst", 1, 9, "abcdefghijklmnopqrst", 20, 1);
1041    test("abcdefghijklmnopqrst", 1, 18, "", 0, 18);
1042    test("abcdefghijklmnopqrst", 1, 18, "abcde", 0, 18);
1043    test("abcdefghijklmnopqrst", 1, 18, "abcde", 1, 1);
1044    test("abcdefghijklmnopqrst", 1, 18, "abcde", 2, 1);
1045    test("abcdefghijklmnopqrst", 1, 18, "abcde", 4, 1);
1046    test("abcdefghijklmnopqrst", 1, 18, "abcde", 5, 1);
1047    test("abcdefghijklmnopqrst", 1, 18, "abcdefghij", 0, 18);
1048    test("abcdefghijklmnopqrst", 1, 18, "abcdefghij", 1, 1);
1049    test("abcdefghijklmnopqrst", 1, 18, "abcdefghij", 5, 1);
1050    test("abcdefghijklmnopqrst", 1, 18, "abcdefghij", 9, 1);
1051    test("abcdefghijklmnopqrst", 1, 18, "abcdefghij", 10, 1);
1052    test("abcdefghijklmnopqrst", 1, 18, "abcdefghijklmnopqrst", 0, 18);
1053    test("abcdefghijklmnopqrst", 1, 18, "abcdefghijklmnopqrst", 1, 1);
1054    test("abcdefghijklmnopqrst", 1, 18, "abcdefghijklmnopqrst", 10, 1);
1055    test("abcdefghijklmnopqrst", 1, 18, "abcdefghijklmnopqrst", 19, 1);
1056    test("abcdefghijklmnopqrst", 1, 18, "abcdefghijklmnopqrst", 20, 1);
1057    test("abcdefghijklmnopqrst", 1, 19, "", 0, 19);
1058    test("abcdefghijklmnopqrst", 1, 19, "abcde", 0, 19);
1059    test("abcdefghijklmnopqrst", 1, 19, "abcde", 1, 1);
1060    test("abcdefghijklmnopqrst", 1, 19, "abcde", 2, 1);
1061    test("abcdefghijklmnopqrst", 1, 19, "abcde", 4, 1);
1062    test("abcdefghijklmnopqrst", 1, 19, "abcde", 5, 1);
1063    test("abcdefghijklmnopqrst", 1, 19, "abcdefghij", 0, 19);
1064    test("abcdefghijklmnopqrst", 1, 19, "abcdefghij", 1, 1);
1065    test("abcdefghijklmnopqrst", 1, 19, "abcdefghij", 5, 1);
1066    test("abcdefghijklmnopqrst", 1, 19, "abcdefghij", 9, 1);
1067    test("abcdefghijklmnopqrst", 1, 19, "abcdefghij", 10, 1);
1068    test("abcdefghijklmnopqrst", 1, 19, "abcdefghijklmnopqrst", 0, 19);
1069    test("abcdefghijklmnopqrst", 1, 19, "abcdefghijklmnopqrst", 1, 1);
1070    test("abcdefghijklmnopqrst", 1, 19, "abcdefghijklmnopqrst", 10, 1);
1071    test("abcdefghijklmnopqrst", 1, 19, "abcdefghijklmnopqrst", 19, 1);
1072    test("abcdefghijklmnopqrst", 1, 19, "abcdefghijklmnopqrst", 20, 1);
1073    test("abcdefghijklmnopqrst", 1, 20, "", 0, 19);
1074    test("abcdefghijklmnopqrst", 1, 20, "abcde", 0, 19);
1075    test("abcdefghijklmnopqrst", 1, 20, "abcde", 1, 1);
1076    test("abcdefghijklmnopqrst", 1, 20, "abcde", 2, 1);
1077    test("abcdefghijklmnopqrst", 1, 20, "abcde", 4, 1);
1078    test("abcdefghijklmnopqrst", 1, 20, "abcde", 5, 1);
1079    test("abcdefghijklmnopqrst", 1, 20, "abcdefghij", 0, 19);
1080    test("abcdefghijklmnopqrst", 1, 20, "abcdefghij", 1, 1);
1081    test("abcdefghijklmnopqrst", 1, 20, "abcdefghij", 5, 1);
1082    test("abcdefghijklmnopqrst", 1, 20, "abcdefghij", 9, 1);
1083    test("abcdefghijklmnopqrst", 1, 20, "abcdefghij", 10, 1);
1084    test("abcdefghijklmnopqrst", 1, 20, "abcdefghijklmnopqrst", 0, 19);
1085    test("abcdefghijklmnopqrst", 1, 20, "abcdefghijklmnopqrst", 1, 1);
1086    test("abcdefghijklmnopqrst", 1, 20, "abcdefghijklmnopqrst", 10, 1);
1087    test("abcdefghijklmnopqrst", 1, 20, "abcdefghijklmnopqrst", 19, 1);
1088    test("abcdefghijklmnopqrst", 1, 20, "abcdefghijklmnopqrst", 20, 1);
1089    test("abcdefghijklmnopqrst", 10, 0, "", 0, 0);
1090    test("abcdefghijklmnopqrst", 10, 0, "abcde", 0, 0);
1091    test("abcdefghijklmnopqrst", 10, 0, "abcde", 1, -1);
1092    test("abcdefghijklmnopqrst", 10, 0, "abcde", 2, -2);
1093    test("abcdefghijklmnopqrst", 10, 0, "abcde", 4, -4);
1094    test("abcdefghijklmnopqrst", 10, 0, "abcde", 5, -5);
1095    test("abcdefghijklmnopqrst", 10, 0, "abcdefghij", 0, 0);
1096    test("abcdefghijklmnopqrst", 10, 0, "abcdefghij", 1, -1);
1097}
1098
1099
1100void test10()
1101{
1102    test("abcdefghijklmnopqrst", 10, 0, "abcdefghij", 5, -5);
1103    test("abcdefghijklmnopqrst", 10, 0, "abcdefghij", 9, -9);
1104    test("abcdefghijklmnopqrst", 10, 0, "abcdefghij", 10, -10);
1105    test("abcdefghijklmnopqrst", 10, 0, "abcdefghijklmnopqrst", 0, 0);
1106    test("abcdefghijklmnopqrst", 10, 0, "abcdefghijklmnopqrst", 1, -1);
1107    test("abcdefghijklmnopqrst", 10, 0, "abcdefghijklmnopqrst", 10, -10);
1108    test("abcdefghijklmnopqrst", 10, 0, "abcdefghijklmnopqrst", 19, -19);
1109    test("abcdefghijklmnopqrst", 10, 0, "abcdefghijklmnopqrst", 20, -20);
1110    test("abcdefghijklmnopqrst", 10, 1, "", 0, 1);
1111    test("abcdefghijklmnopqrst", 10, 1, "abcde", 0, 1);
1112    test("abcdefghijklmnopqrst", 10, 1, "abcde", 1, 10);
1113    test("abcdefghijklmnopqrst", 10, 1, "abcde", 2, 10);
1114    test("abcdefghijklmnopqrst", 10, 1, "abcde", 4, 10);
1115    test("abcdefghijklmnopqrst", 10, 1, "abcde", 5, 10);
1116    test("abcdefghijklmnopqrst", 10, 1, "abcdefghij", 0, 1);
1117    test("abcdefghijklmnopqrst", 10, 1, "abcdefghij", 1, 10);
1118    test("abcdefghijklmnopqrst", 10, 1, "abcdefghij", 5, 10);
1119    test("abcdefghijklmnopqrst", 10, 1, "abcdefghij", 9, 10);
1120    test("abcdefghijklmnopqrst", 10, 1, "abcdefghij", 10, 10);
1121    test("abcdefghijklmnopqrst", 10, 1, "abcdefghijklmnopqrst", 0, 1);
1122    test("abcdefghijklmnopqrst", 10, 1, "abcdefghijklmnopqrst", 1, 10);
1123    test("abcdefghijklmnopqrst", 10, 1, "abcdefghijklmnopqrst", 10, 10);
1124    test("abcdefghijklmnopqrst", 10, 1, "abcdefghijklmnopqrst", 19, 10);
1125    test("abcdefghijklmnopqrst", 10, 1, "abcdefghijklmnopqrst", 20, 10);
1126    test("abcdefghijklmnopqrst", 10, 5, "", 0, 5);
1127    test("abcdefghijklmnopqrst", 10, 5, "abcde", 0, 5);
1128    test("abcdefghijklmnopqrst", 10, 5, "abcde", 1, 10);
1129    test("abcdefghijklmnopqrst", 10, 5, "abcde", 2, 10);
1130    test("abcdefghijklmnopqrst", 10, 5, "abcde", 4, 10);
1131    test("abcdefghijklmnopqrst", 10, 5, "abcde", 5, 10);
1132    test("abcdefghijklmnopqrst", 10, 5, "abcdefghij", 0, 5);
1133    test("abcdefghijklmnopqrst", 10, 5, "abcdefghij", 1, 10);
1134    test("abcdefghijklmnopqrst", 10, 5, "abcdefghij", 5, 10);
1135    test("abcdefghijklmnopqrst", 10, 5, "abcdefghij", 9, 10);
1136    test("abcdefghijklmnopqrst", 10, 5, "abcdefghij", 10, 10);
1137    test("abcdefghijklmnopqrst", 10, 5, "abcdefghijklmnopqrst", 0, 5);
1138    test("abcdefghijklmnopqrst", 10, 5, "abcdefghijklmnopqrst", 1, 10);
1139    test("abcdefghijklmnopqrst", 10, 5, "abcdefghijklmnopqrst", 10, 10);
1140    test("abcdefghijklmnopqrst", 10, 5, "abcdefghijklmnopqrst", 19, 10);
1141    test("abcdefghijklmnopqrst", 10, 5, "abcdefghijklmnopqrst", 20, 10);
1142    test("abcdefghijklmnopqrst", 10, 9, "", 0, 9);
1143    test("abcdefghijklmnopqrst", 10, 9, "abcde", 0, 9);
1144    test("abcdefghijklmnopqrst", 10, 9, "abcde", 1, 10);
1145    test("abcdefghijklmnopqrst", 10, 9, "abcde", 2, 10);
1146    test("abcdefghijklmnopqrst", 10, 9, "abcde", 4, 10);
1147    test("abcdefghijklmnopqrst", 10, 9, "abcde", 5, 10);
1148    test("abcdefghijklmnopqrst", 10, 9, "abcdefghij", 0, 9);
1149    test("abcdefghijklmnopqrst", 10, 9, "abcdefghij", 1, 10);
1150    test("abcdefghijklmnopqrst", 10, 9, "abcdefghij", 5, 10);
1151    test("abcdefghijklmnopqrst", 10, 9, "abcdefghij", 9, 10);
1152    test("abcdefghijklmnopqrst", 10, 9, "abcdefghij", 10, 10);
1153    test("abcdefghijklmnopqrst", 10, 9, "abcdefghijklmnopqrst", 0, 9);
1154    test("abcdefghijklmnopqrst", 10, 9, "abcdefghijklmnopqrst", 1, 10);
1155    test("abcdefghijklmnopqrst", 10, 9, "abcdefghijklmnopqrst", 10, 10);
1156    test("abcdefghijklmnopqrst", 10, 9, "abcdefghijklmnopqrst", 19, 10);
1157    test("abcdefghijklmnopqrst", 10, 9, "abcdefghijklmnopqrst", 20, 10);
1158    test("abcdefghijklmnopqrst", 10, 10, "", 0, 10);
1159    test("abcdefghijklmnopqrst", 10, 10, "abcde", 0, 10);
1160    test("abcdefghijklmnopqrst", 10, 10, "abcde", 1, 10);
1161    test("abcdefghijklmnopqrst", 10, 10, "abcde", 2, 10);
1162    test("abcdefghijklmnopqrst", 10, 10, "abcde", 4, 10);
1163    test("abcdefghijklmnopqrst", 10, 10, "abcde", 5, 10);
1164    test("abcdefghijklmnopqrst", 10, 10, "abcdefghij", 0, 10);
1165    test("abcdefghijklmnopqrst", 10, 10, "abcdefghij", 1, 10);
1166    test("abcdefghijklmnopqrst", 10, 10, "abcdefghij", 5, 10);
1167    test("abcdefghijklmnopqrst", 10, 10, "abcdefghij", 9, 10);
1168    test("abcdefghijklmnopqrst", 10, 10, "abcdefghij", 10, 10);
1169    test("abcdefghijklmnopqrst", 10, 10, "abcdefghijklmnopqrst", 0, 10);
1170    test("abcdefghijklmnopqrst", 10, 10, "abcdefghijklmnopqrst", 1, 10);
1171    test("abcdefghijklmnopqrst", 10, 10, "abcdefghijklmnopqrst", 10, 10);
1172    test("abcdefghijklmnopqrst", 10, 10, "abcdefghijklmnopqrst", 19, 10);
1173    test("abcdefghijklmnopqrst", 10, 10, "abcdefghijklmnopqrst", 20, 10);
1174    test("abcdefghijklmnopqrst", 10, 11, "", 0, 10);
1175    test("abcdefghijklmnopqrst", 10, 11, "abcde", 0, 10);
1176    test("abcdefghijklmnopqrst", 10, 11, "abcde", 1, 10);
1177    test("abcdefghijklmnopqrst", 10, 11, "abcde", 2, 10);
1178    test("abcdefghijklmnopqrst", 10, 11, "abcde", 4, 10);
1179    test("abcdefghijklmnopqrst", 10, 11, "abcde", 5, 10);
1180    test("abcdefghijklmnopqrst", 10, 11, "abcdefghij", 0, 10);
1181    test("abcdefghijklmnopqrst", 10, 11, "abcdefghij", 1, 10);
1182    test("abcdefghijklmnopqrst", 10, 11, "abcdefghij", 5, 10);
1183    test("abcdefghijklmnopqrst", 10, 11, "abcdefghij", 9, 10);
1184    test("abcdefghijklmnopqrst", 10, 11, "abcdefghij", 10, 10);
1185    test("abcdefghijklmnopqrst", 10, 11, "abcdefghijklmnopqrst", 0, 10);
1186    test("abcdefghijklmnopqrst", 10, 11, "abcdefghijklmnopqrst", 1, 10);
1187    test("abcdefghijklmnopqrst", 10, 11, "abcdefghijklmnopqrst", 10, 10);
1188    test("abcdefghijklmnopqrst", 10, 11, "abcdefghijklmnopqrst", 19, 10);
1189    test("abcdefghijklmnopqrst", 10, 11, "abcdefghijklmnopqrst", 20, 10);
1190    test("abcdefghijklmnopqrst", 19, 0, "", 0, 0);
1191    test("abcdefghijklmnopqrst", 19, 0, "abcde", 0, 0);
1192    test("abcdefghijklmnopqrst", 19, 0, "abcde", 1, -1);
1193    test("abcdefghijklmnopqrst", 19, 0, "abcde", 2, -2);
1194    test("abcdefghijklmnopqrst", 19, 0, "abcde", 4, -4);
1195    test("abcdefghijklmnopqrst", 19, 0, "abcde", 5, -5);
1196    test("abcdefghijklmnopqrst", 19, 0, "abcdefghij", 0, 0);
1197    test("abcdefghijklmnopqrst", 19, 0, "abcdefghij", 1, -1);
1198    test("abcdefghijklmnopqrst", 19, 0, "abcdefghij", 5, -5);
1199    test("abcdefghijklmnopqrst", 19, 0, "abcdefghij", 9, -9);
1200    test("abcdefghijklmnopqrst", 19, 0, "abcdefghij", 10, -10);
1201    test("abcdefghijklmnopqrst", 19, 0, "abcdefghijklmnopqrst", 0, 0);
1202}
1203
1204
1205void test11()
1206{
1207    test("abcdefghijklmnopqrst", 19, 0, "abcdefghijklmnopqrst", 1, -1);
1208    test("abcdefghijklmnopqrst", 19, 0, "abcdefghijklmnopqrst", 10, -10);
1209    test("abcdefghijklmnopqrst", 19, 0, "abcdefghijklmnopqrst", 19, -19);
1210    test("abcdefghijklmnopqrst", 19, 0, "abcdefghijklmnopqrst", 20, -20);
1211    test("abcdefghijklmnopqrst", 19, 1, "", 0, 1);
1212    test("abcdefghijklmnopqrst", 19, 1, "abcde", 0, 1);
1213    test("abcdefghijklmnopqrst", 19, 1, "abcde", 1, 19);
1214    test("abcdefghijklmnopqrst", 19, 1, "abcde", 2, 19);
1215    test("abcdefghijklmnopqrst", 19, 1, "abcde", 4, 19);
1216    test("abcdefghijklmnopqrst", 19, 1, "abcde", 5, 19);
1217    test("abcdefghijklmnopqrst", 19, 1, "abcdefghij", 0, 1);
1218    test("abcdefghijklmnopqrst", 19, 1, "abcdefghij", 1, 19);
1219    test("abcdefghijklmnopqrst", 19, 1, "abcdefghij", 5, 19);
1220    test("abcdefghijklmnopqrst", 19, 1, "abcdefghij", 9, 19);
1221    test("abcdefghijklmnopqrst", 19, 1, "abcdefghij", 10, 19);
1222    test("abcdefghijklmnopqrst", 19, 1, "abcdefghijklmnopqrst", 0, 1);
1223    test("abcdefghijklmnopqrst", 19, 1, "abcdefghijklmnopqrst", 1, 19);
1224    test("abcdefghijklmnopqrst", 19, 1, "abcdefghijklmnopqrst", 10, 19);
1225    test("abcdefghijklmnopqrst", 19, 1, "abcdefghijklmnopqrst", 19, 19);
1226    test("abcdefghijklmnopqrst", 19, 1, "abcdefghijklmnopqrst", 20, 19);
1227    test("abcdefghijklmnopqrst", 19, 2, "", 0, 1);
1228    test("abcdefghijklmnopqrst", 19, 2, "abcde", 0, 1);
1229    test("abcdefghijklmnopqrst", 19, 2, "abcde", 1, 19);
1230    test("abcdefghijklmnopqrst", 19, 2, "abcde", 2, 19);
1231    test("abcdefghijklmnopqrst", 19, 2, "abcde", 4, 19);
1232    test("abcdefghijklmnopqrst", 19, 2, "abcde", 5, 19);
1233    test("abcdefghijklmnopqrst", 19, 2, "abcdefghij", 0, 1);
1234    test("abcdefghijklmnopqrst", 19, 2, "abcdefghij", 1, 19);
1235    test("abcdefghijklmnopqrst", 19, 2, "abcdefghij", 5, 19);
1236    test("abcdefghijklmnopqrst", 19, 2, "abcdefghij", 9, 19);
1237    test("abcdefghijklmnopqrst", 19, 2, "abcdefghij", 10, 19);
1238    test("abcdefghijklmnopqrst", 19, 2, "abcdefghijklmnopqrst", 0, 1);
1239    test("abcdefghijklmnopqrst", 19, 2, "abcdefghijklmnopqrst", 1, 19);
1240    test("abcdefghijklmnopqrst", 19, 2, "abcdefghijklmnopqrst", 10, 19);
1241    test("abcdefghijklmnopqrst", 19, 2, "abcdefghijklmnopqrst", 19, 19);
1242    test("abcdefghijklmnopqrst", 19, 2, "abcdefghijklmnopqrst", 20, 19);
1243    test("abcdefghijklmnopqrst", 20, 0, "", 0, 0);
1244    test("abcdefghijklmnopqrst", 20, 0, "abcde", 0, 0);
1245    test("abcdefghijklmnopqrst", 20, 0, "abcde", 1, -1);
1246    test("abcdefghijklmnopqrst", 20, 0, "abcde", 2, -2);
1247    test("abcdefghijklmnopqrst", 20, 0, "abcde", 4, -4);
1248    test("abcdefghijklmnopqrst", 20, 0, "abcde", 5, -5);
1249    test("abcdefghijklmnopqrst", 20, 0, "abcdefghij", 0, 0);
1250    test("abcdefghijklmnopqrst", 20, 0, "abcdefghij", 1, -1);
1251    test("abcdefghijklmnopqrst", 20, 0, "abcdefghij", 5, -5);
1252    test("abcdefghijklmnopqrst", 20, 0, "abcdefghij", 9, -9);
1253    test("abcdefghijklmnopqrst", 20, 0, "abcdefghij", 10, -10);
1254    test("abcdefghijklmnopqrst", 20, 0, "abcdefghijklmnopqrst", 0, 0);
1255    test("abcdefghijklmnopqrst", 20, 0, "abcdefghijklmnopqrst", 1, -1);
1256    test("abcdefghijklmnopqrst", 20, 0, "abcdefghijklmnopqrst", 10, -10);
1257    test("abcdefghijklmnopqrst", 20, 0, "abcdefghijklmnopqrst", 19, -19);
1258    test("abcdefghijklmnopqrst", 20, 0, "abcdefghijklmnopqrst", 20, -20);
1259    test("abcdefghijklmnopqrst", 20, 1, "", 0, 0);
1260    test("abcdefghijklmnopqrst", 20, 1, "abcde", 0, 0);
1261    test("abcdefghijklmnopqrst", 20, 1, "abcde", 1, -1);
1262    test("abcdefghijklmnopqrst", 20, 1, "abcde", 2, -2);
1263    test("abcdefghijklmnopqrst", 20, 1, "abcde", 4, -4);
1264    test("abcdefghijklmnopqrst", 20, 1, "abcde", 5, -5);
1265    test("abcdefghijklmnopqrst", 20, 1, "abcdefghij", 0, 0);
1266    test("abcdefghijklmnopqrst", 20, 1, "abcdefghij", 1, -1);
1267    test("abcdefghijklmnopqrst", 20, 1, "abcdefghij", 5, -5);
1268    test("abcdefghijklmnopqrst", 20, 1, "abcdefghij", 9, -9);
1269    test("abcdefghijklmnopqrst", 20, 1, "abcdefghij", 10, -10);
1270    test("abcdefghijklmnopqrst", 20, 1, "abcdefghijklmnopqrst", 0, 0);
1271    test("abcdefghijklmnopqrst", 20, 1, "abcdefghijklmnopqrst", 1, -1);
1272    test("abcdefghijklmnopqrst", 20, 1, "abcdefghijklmnopqrst", 10, -10);
1273    test("abcdefghijklmnopqrst", 20, 1, "abcdefghijklmnopqrst", 19, -19);
1274    test("abcdefghijklmnopqrst", 20, 1, "abcdefghijklmnopqrst", 20, -20);
1275    test("abcdefghijklmnopqrst", 21, 0, "", 0, 0);
1276    test("abcdefghijklmnopqrst", 21, 0, "abcde", 0, 0);
1277    test("abcdefghijklmnopqrst", 21, 0, "abcde", 1, 0);
1278    test("abcdefghijklmnopqrst", 21, 0, "abcde", 2, 0);
1279    test("abcdefghijklmnopqrst", 21, 0, "abcde", 4, 0);
1280    test("abcdefghijklmnopqrst", 21, 0, "abcde", 5, 0);
1281    test("abcdefghijklmnopqrst", 21, 0, "abcdefghij", 0, 0);
1282    test("abcdefghijklmnopqrst", 21, 0, "abcdefghij", 1, 0);
1283    test("abcdefghijklmnopqrst", 21, 0, "abcdefghij", 5, 0);
1284    test("abcdefghijklmnopqrst", 21, 0, "abcdefghij", 9, 0);
1285    test("abcdefghijklmnopqrst", 21, 0, "abcdefghij", 10, 0);
1286    test("abcdefghijklmnopqrst", 21, 0, "abcdefghijklmnopqrst", 0, 0);
1287    test("abcdefghijklmnopqrst", 21, 0, "abcdefghijklmnopqrst", 1, 0);
1288    test("abcdefghijklmnopqrst", 21, 0, "abcdefghijklmnopqrst", 10, 0);
1289    test("abcdefghijklmnopqrst", 21, 0, "abcdefghijklmnopqrst", 19, 0);
1290    test("abcdefghijklmnopqrst", 21, 0, "abcdefghijklmnopqrst", 20, 0);
1291    }
1292
1293
1294int main () {
1295    test0();
1296    test1();
1297    test2();
1298    test3();
1299    test4();
1300    test5();
1301    test6();
1302    test7();
1303    test8();
1304    test9();
1305    test10();
1306    test11();
1307
1308    {
1309    test("", 0, 0, "abcde", 0, 0);
1310    test("", 0, 0, "abcde", 1, -1);
1311    test("abcdefghijklmnopqrst", 21, 0, "abcde", 0, 0);
1312    test("abcdefghijklmnopqrst", 21, 0, "abcde", 1, 0);
1313    test("abcdefghijklmnopqrst", 10, 0, "abcdefghij", 10, -10);
1314    }
1315
1316    {
1317    test(L"", 0, 0, L"abcde", 0, 0);
1318    test(L"", 0, 0, L"abcde", 1, -1);
1319    test(L"abcdefghijklmnopqrst", 21, 0, L"abcde", 0, 0);
1320    test(L"abcdefghijklmnopqrst", 21, 0, L"abcde", 1, 0);
1321    test(L"abcdefghijklmnopqrst", 10, 0, L"abcdefghij", 10, -10);
1322    }
1323
1324#if TEST_STD_VER >= 11
1325    {
1326    test(U"", 0, 0, U"abcde", 0, 0);
1327    test(U"", 0, 0, U"abcde", 1, -1);
1328    test(U"abcdefghijklmnopqrst", 21, 0, U"abcde", 0, 0);
1329    test(U"abcdefghijklmnopqrst", 21, 0, U"abcde", 1, 0);
1330    test(U"abcdefghijklmnopqrst", 10, 0, U"abcdefghij", 10, -10);
1331    }
1332
1333    {
1334    test(U"", 0, 0, U"abcde", 0, 0);
1335    test(U"", 0, 0, U"abcde", 1, -1);
1336    test(U"abcdefghijklmnopqrst", 21, 0, U"abcde", 0, 0);
1337    test(U"abcdefghijklmnopqrst", 21, 0, U"abcde", 1, 0);
1338    test(U"abcdefghijklmnopqrst", 10, 0, U"abcdefghij", 10, -10);
1339    }
1340#endif
1341
1342#if TEST_STD_VER > 11
1343    {
1344    typedef std::basic_string_view<char, constexpr_char_traits<char>> SV;
1345    constexpr SV  sv1;
1346    constexpr SV  sv2 { "abcdefghijklmnopqrst", 21 };
1347    static_assert ( sv1.compare(0, 0, "abcde", 0) == 0, "" );
1348    static_assert ( sv1.compare(0, 0, "abcde", 1) == -1, "" );
1349    static_assert ( sv2.compare(0, 0, "abcde", 1, 0) == 0, "" );
1350    }
1351#endif
1352}
1353