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