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