9
9
#include " hdr/types/mbstate_t.h"
10
10
#include " hdr/types/wchar_t.h"
11
11
#include " src/__support/libc_errno.h"
12
+ #include " src/__support/wchar/mbstate.h"
12
13
#include " src/string/memset.h"
13
14
#include " src/wchar/mbrtowc.h"
15
+ #include " test/UnitTest/ErrnoCheckingTest.h"
14
16
#include " test/UnitTest/Test.h"
15
17
16
- TEST (LlvmLibcMBRToWC, OneByte) {
18
+ using LlvmLibcMBRToWCTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
19
+
20
+ TEST_F (LlvmLibcMBRToWCTest, OneByte) {
17
21
const char *ch = " A" ;
18
22
wchar_t dest[2 ];
19
23
// Testing if it works with nullptr mbstate_t
20
24
mbstate_t *mb = nullptr ;
21
25
size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
22
26
ASSERT_EQ (static_cast <char >(*dest), ' A' );
23
27
ASSERT_EQ (static_cast <int >(n), 1 );
28
+ ASSERT_ERRNO_SUCCESS ();
24
29
25
30
// Should fail since we have not read enough
26
31
n = LIBC_NAMESPACE::mbrtowc (dest, ch, 0 , mb);
27
32
ASSERT_EQ (static_cast <int >(n), -2 );
33
+ ASSERT_ERRNO_SUCCESS ();
28
34
}
29
35
30
- TEST (LlvmLibcMBRToWC , TwoByte) {
36
+ TEST_F (LlvmLibcMBRToWCTest , TwoByte) {
31
37
const char ch[2 ] = {static_cast <char >(0xC2 ),
32
38
static_cast <char >(0x8E )}; // car symbol
33
39
wchar_t dest[2 ];
@@ -36,6 +42,7 @@ TEST(LlvmLibcMBRToWC, TwoByte) {
36
42
size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 2 , mb);
37
43
ASSERT_EQ (static_cast <int >(*dest), 142 );
38
44
ASSERT_EQ (static_cast <int >(n), 2 );
45
+ ASSERT_ERRNO_SUCCESS ();
39
46
40
47
// Should fail since we have not read enough
41
48
n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
@@ -44,9 +51,10 @@ TEST(LlvmLibcMBRToWC, TwoByte) {
44
51
n = LIBC_NAMESPACE::mbrtowc (dest, ch + 1 , 1 , mb);
45
52
ASSERT_EQ (static_cast <int >(n), 1 );
46
53
ASSERT_EQ (static_cast <int >(*dest), 142 );
54
+ ASSERT_ERRNO_SUCCESS ();
47
55
}
48
56
49
- TEST (LlvmLibcMBRToWC , ThreeByte) {
57
+ TEST_F (LlvmLibcMBRToWCTest , ThreeByte) {
50
58
const char ch[3 ] = {static_cast <char >(0xE2 ), static_cast <char >(0x88 ),
51
59
static_cast <char >(0x91 )}; // ∑ sigma symbol
52
60
wchar_t dest[2 ];
@@ -55,17 +63,20 @@ TEST(LlvmLibcMBRToWC, ThreeByte) {
55
63
size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 3 , mb);
56
64
ASSERT_EQ (static_cast <int >(*dest), 8721 );
57
65
ASSERT_EQ (static_cast <int >(n), 3 );
66
+ ASSERT_ERRNO_SUCCESS ();
58
67
59
68
// Should fail since we have not read enough
60
69
n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
61
70
ASSERT_EQ (static_cast <int >(n), -2 );
71
+ ASSERT_ERRNO_SUCCESS ();
62
72
// Should pass after reading two more bytes
63
73
n = LIBC_NAMESPACE::mbrtowc (dest, ch + 1 , 2 , mb);
64
74
ASSERT_EQ (static_cast <int >(n), 2 );
65
75
ASSERT_EQ (static_cast <int >(*dest), 8721 );
76
+ ASSERT_ERRNO_SUCCESS ();
66
77
}
67
78
68
- TEST (LlvmLibcMBRToWC , FourByte) {
79
+ TEST_F (LlvmLibcMBRToWCTest , FourByte) {
69
80
const char ch[4 ] = {static_cast <char >(0xF0 ), static_cast <char >(0x9F ),
70
81
static_cast <char >(0xA4 ),
71
82
static_cast <char >(0xA1 )}; // 🤡 clown emoji
@@ -75,27 +86,29 @@ TEST(LlvmLibcMBRToWC, FourByte) {
75
86
size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 4 , mb);
76
87
ASSERT_EQ (static_cast <int >(*dest), 129313 );
77
88
ASSERT_EQ (static_cast <int >(n), 4 );
78
-
89
+ ASSERT_ERRNO_SUCCESS ();
79
90
// Should fail since we have not read enough
80
91
n = LIBC_NAMESPACE::mbrtowc (dest, ch, 2 , mb);
81
92
ASSERT_EQ (static_cast <int >(n), -2 );
93
+ ASSERT_ERRNO_SUCCESS ();
82
94
// Should pass after reading two more bytes
83
95
n = LIBC_NAMESPACE::mbrtowc (dest, ch + 2 , 2 , mb);
84
96
ASSERT_EQ (static_cast <int >(n), 2 );
85
97
ASSERT_EQ (static_cast <int >(*dest), 129313 );
98
+ ASSERT_ERRNO_SUCCESS ();
86
99
}
87
100
88
- TEST (LlvmLibcMBRToWC , InvalidByte) {
101
+ TEST_F (LlvmLibcMBRToWCTest , InvalidByte) {
89
102
const char ch[1 ] = {static_cast <char >(0x80 )};
90
103
wchar_t dest[2 ];
91
104
mbstate_t *mb;
92
105
LIBC_NAMESPACE::memset (&mb, 0 , sizeof (mbstate_t ));
93
106
size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
94
107
ASSERT_EQ (static_cast <int >(n), -1 );
95
- ASSERT_EQ ( static_cast < int >(libc_errno), EILSEQ);
108
+ ASSERT_ERRNO_EQ ( EILSEQ);
96
109
}
97
110
98
- TEST (LlvmLibcMBRToWC , InvalidMultiByte) {
111
+ TEST_F (LlvmLibcMBRToWCTest , InvalidMultiByte) {
99
112
const char ch[4 ] = {static_cast <char >(0x80 ), static_cast <char >(0x00 ),
100
113
static_cast <char >(0x80 ),
101
114
static_cast <char >(0x00 )}; // invalid sequence of bytes
@@ -105,18 +118,19 @@ TEST(LlvmLibcMBRToWC, InvalidMultiByte) {
105
118
// Trying to push all 4 should error
106
119
size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 4 , mb);
107
120
ASSERT_EQ (static_cast <int >(n), -1 );
108
- ASSERT_EQ ( static_cast < int >(libc_errno), EILSEQ);
121
+ ASSERT_ERRNO_EQ ( EILSEQ);
109
122
// Trying to push just the first one should error
110
123
n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
111
124
ASSERT_EQ (static_cast <int >(n), -1 );
112
- ASSERT_EQ ( static_cast < int >(libc_errno), EILSEQ);
125
+ ASSERT_ERRNO_EQ ( EILSEQ);
113
126
// Trying to push the second and third should correspond to null wc
114
127
n = LIBC_NAMESPACE::mbrtowc (dest, ch + 1 , 2 , mb);
115
128
ASSERT_EQ (static_cast <int >(n), 0 );
116
129
ASSERT_TRUE (*dest == L' \0 ' );
130
+ ASSERT_ERRNO_SUCCESS ();
117
131
}
118
132
119
- TEST (LlvmLibcMBRToWC , InvalidLastByte) {
133
+ TEST_F (LlvmLibcMBRToWCTest , InvalidLastByte) {
120
134
// Last byte is invalid since it does not have correct starting sequence.
121
135
// 0xC0 --> 11000000 starting sequence should be 10xxxxxx
122
136
const char ch[4 ] = {static_cast <char >(0xF1 ), static_cast <char >(0x80 ),
@@ -127,10 +141,10 @@ TEST(LlvmLibcMBRToWC, InvalidLastByte) {
127
141
// Trying to push all 4 should error
128
142
size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 4 , mb);
129
143
ASSERT_EQ (static_cast <int >(n), -1 );
130
- ASSERT_EQ ( static_cast < int >(libc_errno), EILSEQ);
144
+ ASSERT_ERRNO_EQ ( EILSEQ);
131
145
}
132
146
133
- TEST (LlvmLibcMBRToWC , ValidTwoByteWithExtraRead) {
147
+ TEST_F (LlvmLibcMBRToWCTest , ValidTwoByteWithExtraRead) {
134
148
const char ch[3 ] = {static_cast <char >(0xC2 ), static_cast <char >(0x8E ),
135
149
static_cast <char >(0x80 )};
136
150
wchar_t dest[2 ];
@@ -140,9 +154,10 @@ TEST(LlvmLibcMBRToWC, ValidTwoByteWithExtraRead) {
140
154
size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 3 , mb);
141
155
ASSERT_EQ (static_cast <int >(n), 2 );
142
156
ASSERT_EQ (static_cast <int >(*dest), 142 );
157
+ ASSERT_ERRNO_SUCCESS ();
143
158
}
144
159
145
- TEST (LlvmLibcMBRToWC , TwoValidTwoBytes) {
160
+ TEST_F (LlvmLibcMBRToWCTest , TwoValidTwoBytes) {
146
161
const char ch[4 ] = {static_cast <char >(0xC2 ), static_cast <char >(0x8E ),
147
162
static_cast <char >(0xC7 ), static_cast <char >(0x8C )};
148
163
wchar_t dest[2 ];
@@ -152,21 +167,39 @@ TEST(LlvmLibcMBRToWC, TwoValidTwoBytes) {
152
167
size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 2 , mb);
153
168
ASSERT_EQ (static_cast <int >(n), 2 );
154
169
ASSERT_EQ (static_cast <int >(*dest), 142 );
170
+ ASSERT_ERRNO_SUCCESS ();
155
171
n = LIBC_NAMESPACE::mbrtowc (dest + 1 , ch + 2 , 2 , mb);
156
172
ASSERT_EQ (static_cast <int >(n), 2 );
157
173
ASSERT_EQ (static_cast <int >(*(dest + 1 )), 460 );
174
+ ASSERT_ERRNO_SUCCESS ();
158
175
}
159
176
160
- TEST (LlvmLibcMBRToWC , NullString) {
177
+ TEST_F (LlvmLibcMBRToWCTest , NullString) {
161
178
wchar_t dest[2 ] = {L' O' , L' K' };
162
179
mbstate_t *mb;
163
180
LIBC_NAMESPACE::memset (&mb, 0 , sizeof (mbstate_t ));
164
181
// reading on nullptr should return 0
165
182
size_t n = LIBC_NAMESPACE::mbrtowc (dest, nullptr , 2 , mb);
166
183
ASSERT_EQ (static_cast <int >(n), 0 );
167
184
ASSERT_TRUE (dest[0 ] == L' O' );
185
+ ASSERT_ERRNO_SUCCESS ();
168
186
// reading a null terminator should return 0
169
187
const char *ch = " \0 " ;
170
188
n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
171
189
ASSERT_EQ (static_cast <int >(n), 0 );
190
+ ASSERT_ERRNO_SUCCESS ();
191
+ }
192
+
193
+ TEST_F (LlvmLibcMBRToWCTest, InvalidMBState) {
194
+ const char ch[4 ] = {static_cast <char >(0xC2 ), static_cast <char >(0x8E ),
195
+ static_cast <char >(0xC7 ), static_cast <char >(0x8C )};
196
+ wchar_t dest[2 ] = {L' O' , L' K' };
197
+ mbstate_t *mb;
198
+ LIBC_NAMESPACE::internal::mbstate inv;
199
+ inv.total_bytes = 6 ;
200
+ mb = reinterpret_cast <mbstate_t *>(&inv);
201
+ // invalid mbstate should error
202
+ size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 2 , mb);
203
+ ASSERT_EQ (static_cast <int >(n), -1 );
204
+ ASSERT_ERRNO_EQ (EINVAL);
172
205
}
0 commit comments