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// int compare(size_type pos1, size_type n1, basic_string_vew sv) const;
13
14#include <string>
15#include <stdexcept>
16#include <cassert>
17
18#include "min_allocator.h"
19
20#include "test_macros.h"
21
22int sign(int x)
23{
24    if (x == 0)
25        return 0;
26    if (x < 0)
27        return -1;
28    return 1;
29}
30
31template <class S, class SV>
32void
33test(const S& s, typename S::size_type pos1, typename S::size_type n1,
34     SV sv, int x)
35{
36    if (pos1 <= s.size())
37        assert(sign(s.compare(pos1, n1, sv)) == sign(x));
38#ifndef TEST_HAS_NO_EXCEPTIONS
39    else
40    {
41        try
42        {
43            TEST_IGNORE_NODISCARD s.compare(pos1, n1, sv);
44            assert(false);
45        }
46        catch (std::out_of_range&)
47        {
48            assert(pos1 > s.size());
49        }
50    }
51#endif
52}
53
54template <class S, class SV>
55void test0()
56{
57    test(S(""), 0, 0, SV(""), 0);
58    test(S(""), 0, 0, SV("abcde"), -5);
59    test(S(""), 0, 0, SV("abcdefghij"), -10);
60    test(S(""), 0, 0, SV("abcdefghijklmnopqrst"), -20);
61    test(S(""), 0, 1, SV(""), 0);
62    test(S(""), 0, 1, SV("abcde"), -5);
63    test(S(""), 0, 1, SV("abcdefghij"), -10);
64    test(S(""), 0, 1, SV("abcdefghijklmnopqrst"), -20);
65    test(S(""), 1, 0, SV(""), 0);
66    test(S(""), 1, 0, SV("abcde"), 0);
67    test(S(""), 1, 0, SV("abcdefghij"), 0);
68    test(S(""), 1, 0, SV("abcdefghijklmnopqrst"), 0);
69    test(S("abcde"), 0, 0, SV(""), 0);
70    test(S("abcde"), 0, 0, SV("abcde"), -5);
71    test(S("abcde"), 0, 0, SV("abcdefghij"), -10);
72    test(S("abcde"), 0, 0, SV("abcdefghijklmnopqrst"), -20);
73    test(S("abcde"), 0, 1, SV(""), 1);
74    test(S("abcde"), 0, 1, SV("abcde"), -4);
75    test(S("abcde"), 0, 1, SV("abcdefghij"), -9);
76    test(S("abcde"), 0, 1, SV("abcdefghijklmnopqrst"), -19);
77    test(S("abcde"), 0, 2, SV(""), 2);
78    test(S("abcde"), 0, 2, SV("abcde"), -3);
79    test(S("abcde"), 0, 2, SV("abcdefghij"), -8);
80    test(S("abcde"), 0, 2, SV("abcdefghijklmnopqrst"), -18);
81    test(S("abcde"), 0, 4, SV(""), 4);
82    test(S("abcde"), 0, 4, SV("abcde"), -1);
83    test(S("abcde"), 0, 4, SV("abcdefghij"), -6);
84    test(S("abcde"), 0, 4, SV("abcdefghijklmnopqrst"), -16);
85    test(S("abcde"), 0, 5, SV(""), 5);
86    test(S("abcde"), 0, 5, SV("abcde"), 0);
87    test(S("abcde"), 0, 5, SV("abcdefghij"), -5);
88    test(S("abcde"), 0, 5, SV("abcdefghijklmnopqrst"), -15);
89    test(S("abcde"), 0, 6, SV(""), 5);
90    test(S("abcde"), 0, 6, SV("abcde"), 0);
91    test(S("abcde"), 0, 6, SV("abcdefghij"), -5);
92    test(S("abcde"), 0, 6, SV("abcdefghijklmnopqrst"), -15);
93    test(S("abcde"), 1, 0, SV(""), 0);
94    test(S("abcde"), 1, 0, SV("abcde"), -5);
95    test(S("abcde"), 1, 0, SV("abcdefghij"), -10);
96    test(S("abcde"), 1, 0, SV("abcdefghijklmnopqrst"), -20);
97    test(S("abcde"), 1, 1, SV(""), 1);
98    test(S("abcde"), 1, 1, SV("abcde"), 1);
99    test(S("abcde"), 1, 1, SV("abcdefghij"), 1);
100    test(S("abcde"), 1, 1, SV("abcdefghijklmnopqrst"), 1);
101    test(S("abcde"), 1, 2, SV(""), 2);
102    test(S("abcde"), 1, 2, SV("abcde"), 1);
103    test(S("abcde"), 1, 2, SV("abcdefghij"), 1);
104    test(S("abcde"), 1, 2, SV("abcdefghijklmnopqrst"), 1);
105    test(S("abcde"), 1, 3, SV(""), 3);
106    test(S("abcde"), 1, 3, SV("abcde"), 1);
107    test(S("abcde"), 1, 3, SV("abcdefghij"), 1);
108    test(S("abcde"), 1, 3, SV("abcdefghijklmnopqrst"), 1);
109    test(S("abcde"), 1, 4, SV(""), 4);
110    test(S("abcde"), 1, 4, SV("abcde"), 1);
111    test(S("abcde"), 1, 4, SV("abcdefghij"), 1);
112    test(S("abcde"), 1, 4, SV("abcdefghijklmnopqrst"), 1);
113    test(S("abcde"), 1, 5, SV(""), 4);
114    test(S("abcde"), 1, 5, SV("abcde"), 1);
115    test(S("abcde"), 1, 5, SV("abcdefghij"), 1);
116    test(S("abcde"), 1, 5, SV("abcdefghijklmnopqrst"), 1);
117    test(S("abcde"), 2, 0, SV(""), 0);
118    test(S("abcde"), 2, 0, SV("abcde"), -5);
119    test(S("abcde"), 2, 0, SV("abcdefghij"), -10);
120    test(S("abcde"), 2, 0, SV("abcdefghijklmnopqrst"), -20);
121    test(S("abcde"), 2, 1, SV(""), 1);
122    test(S("abcde"), 2, 1, SV("abcde"), 2);
123    test(S("abcde"), 2, 1, SV("abcdefghij"), 2);
124    test(S("abcde"), 2, 1, SV("abcdefghijklmnopqrst"), 2);
125    test(S("abcde"), 2, 2, SV(""), 2);
126    test(S("abcde"), 2, 2, SV("abcde"), 2);
127    test(S("abcde"), 2, 2, SV("abcdefghij"), 2);
128    test(S("abcde"), 2, 2, SV("abcdefghijklmnopqrst"), 2);
129    test(S("abcde"), 2, 3, SV(""), 3);
130    test(S("abcde"), 2, 3, SV("abcde"), 2);
131    test(S("abcde"), 2, 3, SV("abcdefghij"), 2);
132    test(S("abcde"), 2, 3, SV("abcdefghijklmnopqrst"), 2);
133    test(S("abcde"), 2, 4, SV(""), 3);
134    test(S("abcde"), 2, 4, SV("abcde"), 2);
135    test(S("abcde"), 2, 4, SV("abcdefghij"), 2);
136    test(S("abcde"), 2, 4, SV("abcdefghijklmnopqrst"), 2);
137    test(S("abcde"), 4, 0, SV(""), 0);
138    test(S("abcde"), 4, 0, SV("abcde"), -5);
139    test(S("abcde"), 4, 0, SV("abcdefghij"), -10);
140    test(S("abcde"), 4, 0, SV("abcdefghijklmnopqrst"), -20);
141    test(S("abcde"), 4, 1, SV(""), 1);
142    test(S("abcde"), 4, 1, SV("abcde"), 4);
143    test(S("abcde"), 4, 1, SV("abcdefghij"), 4);
144    test(S("abcde"), 4, 1, SV("abcdefghijklmnopqrst"), 4);
145    test(S("abcde"), 4, 2, SV(""), 1);
146    test(S("abcde"), 4, 2, SV("abcde"), 4);
147    test(S("abcde"), 4, 2, SV("abcdefghij"), 4);
148    test(S("abcde"), 4, 2, SV("abcdefghijklmnopqrst"), 4);
149    test(S("abcde"), 5, 0, SV(""), 0);
150    test(S("abcde"), 5, 0, SV("abcde"), -5);
151    test(S("abcde"), 5, 0, SV("abcdefghij"), -10);
152    test(S("abcde"), 5, 0, SV("abcdefghijklmnopqrst"), -20);
153    test(S("abcde"), 5, 1, SV(""), 0);
154    test(S("abcde"), 5, 1, SV("abcde"), -5);
155    test(S("abcde"), 5, 1, SV("abcdefghij"), -10);
156    test(S("abcde"), 5, 1, SV("abcdefghijklmnopqrst"), -20);
157}
158
159template <class S, class SV>
160void test1()
161{
162    test(S("abcde"), 6, 0, SV(""), 0);
163    test(S("abcde"), 6, 0, SV("abcde"), 0);
164    test(S("abcde"), 6, 0, SV("abcdefghij"), 0);
165    test(S("abcde"), 6, 0, SV("abcdefghijklmnopqrst"), 0);
166    test(S("abcdefghij"), 0, 0, SV(""), 0);
167    test(S("abcdefghij"), 0, 0, SV("abcde"), -5);
168    test(S("abcdefghij"), 0, 0, SV("abcdefghij"), -10);
169    test(S("abcdefghij"), 0, 0, SV("abcdefghijklmnopqrst"), -20);
170    test(S("abcdefghij"), 0, 1, SV(""), 1);
171    test(S("abcdefghij"), 0, 1, SV("abcde"), -4);
172    test(S("abcdefghij"), 0, 1, SV("abcdefghij"), -9);
173    test(S("abcdefghij"), 0, 1, SV("abcdefghijklmnopqrst"), -19);
174    test(S("abcdefghij"), 0, 5, SV(""), 5);
175    test(S("abcdefghij"), 0, 5, SV("abcde"), 0);
176    test(S("abcdefghij"), 0, 5, SV("abcdefghij"), -5);
177    test(S("abcdefghij"), 0, 5, SV("abcdefghijklmnopqrst"), -15);
178    test(S("abcdefghij"), 0, 9, SV(""), 9);
179    test(S("abcdefghij"), 0, 9, SV("abcde"), 4);
180    test(S("abcdefghij"), 0, 9, SV("abcdefghij"), -1);
181    test(S("abcdefghij"), 0, 9, SV("abcdefghijklmnopqrst"), -11);
182    test(S("abcdefghij"), 0, 10, SV(""), 10);
183    test(S("abcdefghij"), 0, 10, SV("abcde"), 5);
184    test(S("abcdefghij"), 0, 10, SV("abcdefghij"), 0);
185    test(S("abcdefghij"), 0, 10, SV("abcdefghijklmnopqrst"), -10);
186    test(S("abcdefghij"), 0, 11, SV(""), 10);
187    test(S("abcdefghij"), 0, 11, SV("abcde"), 5);
188    test(S("abcdefghij"), 0, 11, SV("abcdefghij"), 0);
189    test(S("abcdefghij"), 0, 11, SV("abcdefghijklmnopqrst"), -10);
190    test(S("abcdefghij"), 1, 0, SV(""), 0);
191    test(S("abcdefghij"), 1, 0, SV("abcde"), -5);
192    test(S("abcdefghij"), 1, 0, SV("abcdefghij"), -10);
193    test(S("abcdefghij"), 1, 0, SV("abcdefghijklmnopqrst"), -20);
194    test(S("abcdefghij"), 1, 1, SV(""), 1);
195    test(S("abcdefghij"), 1, 1, SV("abcde"), 1);
196    test(S("abcdefghij"), 1, 1, SV("abcdefghij"), 1);
197    test(S("abcdefghij"), 1, 1, SV("abcdefghijklmnopqrst"), 1);
198    test(S("abcdefghij"), 1, 4, SV(""), 4);
199    test(S("abcdefghij"), 1, 4, SV("abcde"), 1);
200    test(S("abcdefghij"), 1, 4, SV("abcdefghij"), 1);
201    test(S("abcdefghij"), 1, 4, SV("abcdefghijklmnopqrst"), 1);
202    test(S("abcdefghij"), 1, 8, SV(""), 8);
203    test(S("abcdefghij"), 1, 8, SV("abcde"), 1);
204    test(S("abcdefghij"), 1, 8, SV("abcdefghij"), 1);
205    test(S("abcdefghij"), 1, 8, SV("abcdefghijklmnopqrst"), 1);
206    test(S("abcdefghij"), 1, 9, SV(""), 9);
207    test(S("abcdefghij"), 1, 9, SV("abcde"), 1);
208    test(S("abcdefghij"), 1, 9, SV("abcdefghij"), 1);
209    test(S("abcdefghij"), 1, 9, SV("abcdefghijklmnopqrst"), 1);
210    test(S("abcdefghij"), 1, 10, SV(""), 9);
211    test(S("abcdefghij"), 1, 10, SV("abcde"), 1);
212    test(S("abcdefghij"), 1, 10, SV("abcdefghij"), 1);
213    test(S("abcdefghij"), 1, 10, SV("abcdefghijklmnopqrst"), 1);
214    test(S("abcdefghij"), 5, 0, SV(""), 0);
215    test(S("abcdefghij"), 5, 0, SV("abcde"), -5);
216    test(S("abcdefghij"), 5, 0, SV("abcdefghij"), -10);
217    test(S("abcdefghij"), 5, 0, SV("abcdefghijklmnopqrst"), -20);
218    test(S("abcdefghij"), 5, 1, SV(""), 1);
219    test(S("abcdefghij"), 5, 1, SV("abcde"), 5);
220    test(S("abcdefghij"), 5, 1, SV("abcdefghij"), 5);
221    test(S("abcdefghij"), 5, 1, SV("abcdefghijklmnopqrst"), 5);
222    test(S("abcdefghij"), 5, 2, SV(""), 2);
223    test(S("abcdefghij"), 5, 2, SV("abcde"), 5);
224    test(S("abcdefghij"), 5, 2, SV("abcdefghij"), 5);
225    test(S("abcdefghij"), 5, 2, SV("abcdefghijklmnopqrst"), 5);
226    test(S("abcdefghij"), 5, 4, SV(""), 4);
227    test(S("abcdefghij"), 5, 4, SV("abcde"), 5);
228    test(S("abcdefghij"), 5, 4, SV("abcdefghij"), 5);
229    test(S("abcdefghij"), 5, 4, SV("abcdefghijklmnopqrst"), 5);
230    test(S("abcdefghij"), 5, 5, SV(""), 5);
231    test(S("abcdefghij"), 5, 5, SV("abcde"), 5);
232    test(S("abcdefghij"), 5, 5, SV("abcdefghij"), 5);
233    test(S("abcdefghij"), 5, 5, SV("abcdefghijklmnopqrst"), 5);
234    test(S("abcdefghij"), 5, 6, SV(""), 5);
235    test(S("abcdefghij"), 5, 6, SV("abcde"), 5);
236    test(S("abcdefghij"), 5, 6, SV("abcdefghij"), 5);
237    test(S("abcdefghij"), 5, 6, SV("abcdefghijklmnopqrst"), 5);
238    test(S("abcdefghij"), 9, 0, SV(""), 0);
239    test(S("abcdefghij"), 9, 0, SV("abcde"), -5);
240    test(S("abcdefghij"), 9, 0, SV("abcdefghij"), -10);
241    test(S("abcdefghij"), 9, 0, SV("abcdefghijklmnopqrst"), -20);
242    test(S("abcdefghij"), 9, 1, SV(""), 1);
243    test(S("abcdefghij"), 9, 1, SV("abcde"), 9);
244    test(S("abcdefghij"), 9, 1, SV("abcdefghij"), 9);
245    test(S("abcdefghij"), 9, 1, SV("abcdefghijklmnopqrst"), 9);
246    test(S("abcdefghij"), 9, 2, SV(""), 1);
247    test(S("abcdefghij"), 9, 2, SV("abcde"), 9);
248    test(S("abcdefghij"), 9, 2, SV("abcdefghij"), 9);
249    test(S("abcdefghij"), 9, 2, SV("abcdefghijklmnopqrst"), 9);
250    test(S("abcdefghij"), 10, 0, SV(""), 0);
251    test(S("abcdefghij"), 10, 0, SV("abcde"), -5);
252    test(S("abcdefghij"), 10, 0, SV("abcdefghij"), -10);
253    test(S("abcdefghij"), 10, 0, SV("abcdefghijklmnopqrst"), -20);
254    test(S("abcdefghij"), 10, 1, SV(""), 0);
255    test(S("abcdefghij"), 10, 1, SV("abcde"), -5);
256    test(S("abcdefghij"), 10, 1, SV("abcdefghij"), -10);
257    test(S("abcdefghij"), 10, 1, SV("abcdefghijklmnopqrst"), -20);
258    test(S("abcdefghij"), 11, 0, SV(""), 0);
259    test(S("abcdefghij"), 11, 0, SV("abcde"), 0);
260    test(S("abcdefghij"), 11, 0, SV("abcdefghij"), 0);
261    test(S("abcdefghij"), 11, 0, SV("abcdefghijklmnopqrst"), 0);
262}
263
264template <class S, class SV>
265void test2()
266{
267    test(S("abcdefghijklmnopqrst"), 0, 0, SV(""), 0);
268    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcde"), -5);
269    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghij"), -10);
270    test(S("abcdefghijklmnopqrst"), 0, 0, SV("abcdefghijklmnopqrst"), -20);
271    test(S("abcdefghijklmnopqrst"), 0, 1, SV(""), 1);
272    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcde"), -4);
273    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghij"), -9);
274    test(S("abcdefghijklmnopqrst"), 0, 1, SV("abcdefghijklmnopqrst"), -19);
275    test(S("abcdefghijklmnopqrst"), 0, 10, SV(""), 10);
276    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcde"), 5);
277    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghij"), 0);
278    test(S("abcdefghijklmnopqrst"), 0, 10, SV("abcdefghijklmnopqrst"), -10);
279    test(S("abcdefghijklmnopqrst"), 0, 19, SV(""), 19);
280    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcde"), 14);
281    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghij"), 9);
282    test(S("abcdefghijklmnopqrst"), 0, 19, SV("abcdefghijklmnopqrst"), -1);
283    test(S("abcdefghijklmnopqrst"), 0, 20, SV(""), 20);
284    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcde"), 15);
285    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghij"), 10);
286    test(S("abcdefghijklmnopqrst"), 0, 20, SV("abcdefghijklmnopqrst"), 0);
287    test(S("abcdefghijklmnopqrst"), 0, 21, SV(""), 20);
288    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcde"), 15);
289    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghij"), 10);
290    test(S("abcdefghijklmnopqrst"), 0, 21, SV("abcdefghijklmnopqrst"), 0);
291    test(S("abcdefghijklmnopqrst"), 1, 0, SV(""), 0);
292    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcde"), -5);
293    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghij"), -10);
294    test(S("abcdefghijklmnopqrst"), 1, 0, SV("abcdefghijklmnopqrst"), -20);
295    test(S("abcdefghijklmnopqrst"), 1, 1, SV(""), 1);
296    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcde"), 1);
297    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghij"), 1);
298    test(S("abcdefghijklmnopqrst"), 1, 1, SV("abcdefghijklmnopqrst"), 1);
299    test(S("abcdefghijklmnopqrst"), 1, 9, SV(""), 9);
300    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcde"), 1);
301    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghij"), 1);
302    test(S("abcdefghijklmnopqrst"), 1, 9, SV("abcdefghijklmnopqrst"), 1);
303    test(S("abcdefghijklmnopqrst"), 1, 18, SV(""), 18);
304    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcde"), 1);
305    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghij"), 1);
306    test(S("abcdefghijklmnopqrst"), 1, 18, SV("abcdefghijklmnopqrst"), 1);
307    test(S("abcdefghijklmnopqrst"), 1, 19, SV(""), 19);
308    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcde"), 1);
309    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghij"), 1);
310    test(S("abcdefghijklmnopqrst"), 1, 19, SV("abcdefghijklmnopqrst"), 1);
311    test(S("abcdefghijklmnopqrst"), 1, 20, SV(""), 19);
312    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcde"), 1);
313    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghij"), 1);
314    test(S("abcdefghijklmnopqrst"), 1, 20, SV("abcdefghijklmnopqrst"), 1);
315    test(S("abcdefghijklmnopqrst"), 10, 0, SV(""), 0);
316    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcde"), -5);
317    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghij"), -10);
318    test(S("abcdefghijklmnopqrst"), 10, 0, SV("abcdefghijklmnopqrst"), -20);
319    test(S("abcdefghijklmnopqrst"), 10, 1, SV(""), 1);
320    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcde"), 10);
321    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghij"), 10);
322    test(S("abcdefghijklmnopqrst"), 10, 1, SV("abcdefghijklmnopqrst"), 10);
323    test(S("abcdefghijklmnopqrst"), 10, 5, SV(""), 5);
324    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcde"), 10);
325    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghij"), 10);
326    test(S("abcdefghijklmnopqrst"), 10, 5, SV("abcdefghijklmnopqrst"), 10);
327    test(S("abcdefghijklmnopqrst"), 10, 9, SV(""), 9);
328    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcde"), 10);
329    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghij"), 10);
330    test(S("abcdefghijklmnopqrst"), 10, 9, SV("abcdefghijklmnopqrst"), 10);
331    test(S("abcdefghijklmnopqrst"), 10, 10, SV(""), 10);
332    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcde"), 10);
333    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghij"), 10);
334    test(S("abcdefghijklmnopqrst"), 10, 10, SV("abcdefghijklmnopqrst"), 10);
335    test(S("abcdefghijklmnopqrst"), 10, 11, SV(""), 10);
336    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcde"), 10);
337    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghij"), 10);
338    test(S("abcdefghijklmnopqrst"), 10, 11, SV("abcdefghijklmnopqrst"), 10);
339    test(S("abcdefghijklmnopqrst"), 19, 0, SV(""), 0);
340    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcde"), -5);
341    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghij"), -10);
342    test(S("abcdefghijklmnopqrst"), 19, 0, SV("abcdefghijklmnopqrst"), -20);
343    test(S("abcdefghijklmnopqrst"), 19, 1, SV(""), 1);
344    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcde"), 19);
345    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghij"), 19);
346    test(S("abcdefghijklmnopqrst"), 19, 1, SV("abcdefghijklmnopqrst"), 19);
347    test(S("abcdefghijklmnopqrst"), 19, 2, SV(""), 1);
348    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcde"), 19);
349    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghij"), 19);
350    test(S("abcdefghijklmnopqrst"), 19, 2, SV("abcdefghijklmnopqrst"), 19);
351    test(S("abcdefghijklmnopqrst"), 20, 0, SV(""), 0);
352    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcde"), -5);
353    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghij"), -10);
354    test(S("abcdefghijklmnopqrst"), 20, 0, SV("abcdefghijklmnopqrst"), -20);
355    test(S("abcdefghijklmnopqrst"), 20, 1, SV(""), 0);
356    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcde"), -5);
357    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghij"), -10);
358    test(S("abcdefghijklmnopqrst"), 20, 1, SV("abcdefghijklmnopqrst"), -20);
359    test(S("abcdefghijklmnopqrst"), 21, 0, SV(""), 0);
360    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcde"), 0);
361    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghij"), 0);
362    test(S("abcdefghijklmnopqrst"), 21, 0, SV("abcdefghijklmnopqrst"), 0);
363}
364
365int main()
366{
367    {
368    typedef std::string S;
369    typedef std::string_view SV;
370    test0<S, SV>();
371    test1<S, SV>();
372    test2<S, SV>();
373    }
374#if TEST_STD_VER >= 11
375    {
376    typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
377    typedef std::string_view SV;
378    test0<S, SV>();
379    test1<S, SV>();
380    test2<S, SV>();
381    }
382#endif
383}
384