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