xref: /llvm-project/libcxx/test/std/localization/locale.stdcvt/codecvt_utf8_length.pass.cpp (revision 233e7c5de2d2abda024577e79dcd195562de68c8)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <codecvt>
10 
11 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_CODECVT
12 
13 // template <class Elem, unsigned long Maxcode = 0x10ffff,
14 //           codecvt_mode Mode = (codecvt_mode)0>
15 // class codecvt_utf8
16 //     : public codecvt<Elem, char, mbstate_t>
17 // {
18 //     // unspecified
19 // };
20 
21 // int length(stateT& state, const externT* from, const externT* from_end,
22 //            size_t max) const;
23 
24 #include <codecvt>
25 #include <cassert>
26 
27 #include "test_macros.h"
28 
29 template <class CharT, std::size_t = sizeof(CharT)>
30 struct TestHelper;
31 
32 template <class CharT>
33 struct TestHelper<CharT, 2> {
34   static void test();
35 };
36 
37 template <class CharT>
38 struct TestHelper<CharT, 4> {
39   static void test();
40 };
41 
42 template <class CharT>
test()43 void TestHelper<CharT, 2>::test() {
44   {
45     typedef std::codecvt_utf8<CharT> C;
46     C c;
47     char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
48     std::mbstate_t m;
49     int r = c.length(m, n, n + 4, 1);
50     assert(r == 0);
51 
52     n[0] = char(0xE1);
53     n[1] = char(0x80);
54     n[2] = char(0x85);
55     r = c.length(m, n, n + 3, 2);
56     assert(r == 3);
57 
58     n[0] = char(0xD1);
59     n[1] = char(0x93);
60     r = c.length(m, n, n + 2, 3);
61     assert(r == 2);
62 
63     n[0] = char(0x56);
64     r = c.length(m, n, n + 1, 3);
65     assert(r == 1);
66   }
67   {
68     typedef std::codecvt_utf8<CharT, 0x1000> C;
69     C c;
70     char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
71     std::mbstate_t m;
72     int r = c.length(m, n, n + 4, 1);
73     assert(r == 0);
74 
75     n[0] = char(0xE1);
76     n[1] = char(0x80);
77     n[2] = char(0x85);
78     r = c.length(m, n, n + 3, 2);
79     assert(r == 0);
80 
81     n[0] = char(0xD1);
82     n[1] = char(0x93);
83     r = c.length(m, n, n + 2, 3);
84     assert(r == 2);
85 
86     n[0] = char(0x56);
87     r = c.length(m, n, n + 1, 3);
88     assert(r == 1);
89   }
90   {
91     typedef std::codecvt_utf8<CharT, 0xFFFFFFFF, std::consume_header> C;
92     C c;
93     char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
94     std::mbstate_t m;
95     int r = c.length(m, n, n + 7, 1);
96     assert(r == 3);
97 
98     n[0] = char(0xE1);
99     n[1] = char(0x80);
100     n[2] = char(0x85);
101     r = c.length(m, n, n + 3, 2);
102     assert(r == 3);
103 
104     n[0] = char(0xEF);
105     n[1] = char(0xBB);
106     n[2] = char(0xBF);
107     n[3] = char(0xD1);
108     n[4] = char(0x93);
109     r = c.length(m, n, n + 5, 3);
110     assert(r == 5);
111 
112     n[0] = char(0x56);
113     r = c.length(m, n, n + 1, 3);
114     assert(r == 1);
115   }
116 }
117 
118 template <class CharT>
test()119 void TestHelper<CharT, 4>::test() {
120   {
121     typedef std::codecvt_utf8<CharT> C;
122     C c;
123     char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
124     std::mbstate_t m;
125     int r = c.length(m, n, n + 4, 1);
126     assert(r == 4);
127 
128     n[0] = char(0xE1);
129     n[1] = char(0x80);
130     n[2] = char(0x85);
131     r = c.length(m, n, n + 3, 2);
132     assert(r == 3);
133 
134     n[0] = char(0xD1);
135     n[1] = char(0x93);
136     r = c.length(m, n, n + 2, 3);
137     assert(r == 2);
138 
139     n[0] = char(0x56);
140     r = c.length(m, n, n + 1, 3);
141     assert(r == 1);
142   }
143   {
144     typedef std::codecvt_utf8<CharT, 0x1000> C;
145     C c;
146     char n[4] = {char(0xF1), char(0x80), char(0x80), char(0x83)};
147     std::mbstate_t m;
148     int r = c.length(m, n, n + 4, 1);
149     assert(r == 0);
150 
151     n[0] = char(0xE1);
152     n[1] = char(0x80);
153     n[2] = char(0x85);
154     r = c.length(m, n, n + 3, 2);
155     assert(r == 0);
156 
157     n[0] = char(0xD1);
158     n[1] = char(0x93);
159     r = c.length(m, n, n + 2, 3);
160     assert(r == 2);
161 
162     n[0] = char(0x56);
163     r = c.length(m, n, n + 1, 3);
164     assert(r == 1);
165   }
166   {
167     typedef std::codecvt_utf8<CharT, 0xFFFFFFFF, std::consume_header> C;
168     C c;
169     char n[7] = {char(0xEF), char(0xBB), char(0xBF), char(0xF1), char(0x80), char(0x80), char(0x83)};
170     std::mbstate_t m;
171     int r = c.length(m, n, n + 7, 1);
172     assert(r == 7);
173 
174     n[0] = char(0xE1);
175     n[1] = char(0x80);
176     n[2] = char(0x85);
177     r = c.length(m, n, n + 3, 2);
178     assert(r == 3);
179 
180     n[0] = char(0xEF);
181     n[1] = char(0xBB);
182     n[2] = char(0xBF);
183     n[3] = char(0xD1);
184     n[4] = char(0x93);
185     r = c.length(m, n, n + 5, 3);
186     assert(r == 5);
187 
188     n[0] = char(0x56);
189     r = c.length(m, n, n + 1, 3);
190     assert(r == 1);
191   }
192 }
193 
main(int,char **)194 int main(int, char**) {
195 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
196   TestHelper<wchar_t>::test();
197 #endif
198   TestHelper<char32_t>::test();
199   TestHelper<char16_t>::test();
200   return 0;
201 }
202