99#include " hdr/types/mbstate_t.h"
1010#include " hdr/types/wchar_t.h"
1111#include " src/__support/libc_errno.h"
12+ #include " src/__support/wchar/mbstate.h"
1213#include " src/string/memset.h"
1314#include " src/wchar/mbrtowc.h"
15+ #include " test/UnitTest/ErrnoCheckingTest.h"
1416#include " test/UnitTest/Test.h"
1517
16- TEST (LlvmLibcMBRToWC, OneByte) {
18+ using LlvmLibcMBRToWCTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
19+
20+ TEST_F (LlvmLibcMBRToWCTest, OneByte) {
1721 const char *ch = " A" ;
1822 wchar_t dest[2 ];
1923 // Testing if it works with nullptr mbstate_t
2024 mbstate_t *mb = nullptr ;
2125 size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
2226 ASSERT_EQ (static_cast <char >(*dest), ' A' );
2327 ASSERT_EQ (static_cast <int >(n), 1 );
28+ ASSERT_ERRNO_SUCCESS ();
2429
2530 // Should fail since we have not read enough
2631 n = LIBC_NAMESPACE::mbrtowc (dest, ch, 0 , mb);
2732 ASSERT_EQ (static_cast <int >(n), -2 );
33+ ASSERT_ERRNO_SUCCESS ();
2834}
2935
30- TEST (LlvmLibcMBRToWC , TwoByte) {
36+ TEST_F (LlvmLibcMBRToWCTest , TwoByte) {
3137 const char ch[2 ] = {static_cast <char >(0xC2 ),
3238 static_cast <char >(0x8E )}; // car symbol
3339 wchar_t dest[2 ];
@@ -36,6 +42,7 @@ TEST(LlvmLibcMBRToWC, TwoByte) {
3642 size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 2 , mb);
3743 ASSERT_EQ (static_cast <int >(*dest), 142 );
3844 ASSERT_EQ (static_cast <int >(n), 2 );
45+ ASSERT_ERRNO_SUCCESS ();
3946
4047 // Should fail since we have not read enough
4148 n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
@@ -44,9 +51,10 @@ TEST(LlvmLibcMBRToWC, TwoByte) {
4451 n = LIBC_NAMESPACE::mbrtowc (dest, ch + 1 , 1 , mb);
4552 ASSERT_EQ (static_cast <int >(n), 1 );
4653 ASSERT_EQ (static_cast <int >(*dest), 142 );
54+ ASSERT_ERRNO_SUCCESS ();
4755}
4856
49- TEST (LlvmLibcMBRToWC , ThreeByte) {
57+ TEST_F (LlvmLibcMBRToWCTest , ThreeByte) {
5058 const char ch[3 ] = {static_cast <char >(0xE2 ), static_cast <char >(0x88 ),
5159 static_cast <char >(0x91 )}; // ∑ sigma symbol
5260 wchar_t dest[2 ];
@@ -55,17 +63,20 @@ TEST(LlvmLibcMBRToWC, ThreeByte) {
5563 size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 3 , mb);
5664 ASSERT_EQ (static_cast <int >(*dest), 8721 );
5765 ASSERT_EQ (static_cast <int >(n), 3 );
66+ ASSERT_ERRNO_SUCCESS ();
5867
5968 // Should fail since we have not read enough
6069 n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
6170 ASSERT_EQ (static_cast <int >(n), -2 );
71+ ASSERT_ERRNO_SUCCESS ();
6272 // Should pass after reading two more bytes
6373 n = LIBC_NAMESPACE::mbrtowc (dest, ch + 1 , 2 , mb);
6474 ASSERT_EQ (static_cast <int >(n), 2 );
6575 ASSERT_EQ (static_cast <int >(*dest), 8721 );
76+ ASSERT_ERRNO_SUCCESS ();
6677}
6778
68- TEST (LlvmLibcMBRToWC , FourByte) {
79+ TEST_F (LlvmLibcMBRToWCTest , FourByte) {
6980 const char ch[4 ] = {static_cast <char >(0xF0 ), static_cast <char >(0x9F ),
7081 static_cast <char >(0xA4 ),
7182 static_cast <char >(0xA1 )}; // 🤡 clown emoji
@@ -75,27 +86,29 @@ TEST(LlvmLibcMBRToWC, FourByte) {
7586 size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 4 , mb);
7687 ASSERT_EQ (static_cast <int >(*dest), 129313 );
7788 ASSERT_EQ (static_cast <int >(n), 4 );
78-
89+ ASSERT_ERRNO_SUCCESS ();
7990 // Should fail since we have not read enough
8091 n = LIBC_NAMESPACE::mbrtowc (dest, ch, 2 , mb);
8192 ASSERT_EQ (static_cast <int >(n), -2 );
93+ ASSERT_ERRNO_SUCCESS ();
8294 // Should pass after reading two more bytes
8395 n = LIBC_NAMESPACE::mbrtowc (dest, ch + 2 , 2 , mb);
8496 ASSERT_EQ (static_cast <int >(n), 2 );
8597 ASSERT_EQ (static_cast <int >(*dest), 129313 );
98+ ASSERT_ERRNO_SUCCESS ();
8699}
87100
88- TEST (LlvmLibcMBRToWC , InvalidByte) {
101+ TEST_F (LlvmLibcMBRToWCTest , InvalidByte) {
89102 const char ch[1 ] = {static_cast <char >(0x80 )};
90103 wchar_t dest[2 ];
91104 mbstate_t *mb;
92105 LIBC_NAMESPACE::memset (&mb, 0 , sizeof (mbstate_t ));
93106 size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
94107 ASSERT_EQ (static_cast <int >(n), -1 );
95- ASSERT_EQ ( static_cast < int >(libc_errno), EILSEQ);
108+ ASSERT_ERRNO_EQ ( EILSEQ);
96109}
97110
98- TEST (LlvmLibcMBRToWC , InvalidMultiByte) {
111+ TEST_F (LlvmLibcMBRToWCTest , InvalidMultiByte) {
99112 const char ch[4 ] = {static_cast <char >(0x80 ), static_cast <char >(0x00 ),
100113 static_cast <char >(0x80 ),
101114 static_cast <char >(0x00 )}; // invalid sequence of bytes
@@ -105,18 +118,19 @@ TEST(LlvmLibcMBRToWC, InvalidMultiByte) {
105118 // Trying to push all 4 should error
106119 size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 4 , mb);
107120 ASSERT_EQ (static_cast <int >(n), -1 );
108- ASSERT_EQ ( static_cast < int >(libc_errno), EILSEQ);
121+ ASSERT_ERRNO_EQ ( EILSEQ);
109122 // Trying to push just the first one should error
110123 n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
111124 ASSERT_EQ (static_cast <int >(n), -1 );
112- ASSERT_EQ ( static_cast < int >(libc_errno), EILSEQ);
125+ ASSERT_ERRNO_EQ ( EILSEQ);
113126 // Trying to push the second and third should correspond to null wc
114127 n = LIBC_NAMESPACE::mbrtowc (dest, ch + 1 , 2 , mb);
115128 ASSERT_EQ (static_cast <int >(n), 0 );
116129 ASSERT_TRUE (*dest == L' \0 ' );
130+ ASSERT_ERRNO_SUCCESS ();
117131}
118132
119- TEST (LlvmLibcMBRToWC , InvalidLastByte) {
133+ TEST_F (LlvmLibcMBRToWCTest , InvalidLastByte) {
120134 // Last byte is invalid since it does not have correct starting sequence.
121135 // 0xC0 --> 11000000 starting sequence should be 10xxxxxx
122136 const char ch[4 ] = {static_cast <char >(0xF1 ), static_cast <char >(0x80 ),
@@ -127,10 +141,10 @@ TEST(LlvmLibcMBRToWC, InvalidLastByte) {
127141 // Trying to push all 4 should error
128142 size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 4 , mb);
129143 ASSERT_EQ (static_cast <int >(n), -1 );
130- ASSERT_EQ ( static_cast < int >(libc_errno), EILSEQ);
144+ ASSERT_ERRNO_EQ ( EILSEQ);
131145}
132146
133- TEST (LlvmLibcMBRToWC , ValidTwoByteWithExtraRead) {
147+ TEST_F (LlvmLibcMBRToWCTest , ValidTwoByteWithExtraRead) {
134148 const char ch[3 ] = {static_cast <char >(0xC2 ), static_cast <char >(0x8E ),
135149 static_cast <char >(0x80 )};
136150 wchar_t dest[2 ];
@@ -140,9 +154,10 @@ TEST(LlvmLibcMBRToWC, ValidTwoByteWithExtraRead) {
140154 size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 3 , mb);
141155 ASSERT_EQ (static_cast <int >(n), 2 );
142156 ASSERT_EQ (static_cast <int >(*dest), 142 );
157+ ASSERT_ERRNO_SUCCESS ();
143158}
144159
145- TEST (LlvmLibcMBRToWC , TwoValidTwoBytes) {
160+ TEST_F (LlvmLibcMBRToWCTest , TwoValidTwoBytes) {
146161 const char ch[4 ] = {static_cast <char >(0xC2 ), static_cast <char >(0x8E ),
147162 static_cast <char >(0xC7 ), static_cast <char >(0x8C )};
148163 wchar_t dest[2 ];
@@ -152,21 +167,39 @@ TEST(LlvmLibcMBRToWC, TwoValidTwoBytes) {
152167 size_t n = LIBC_NAMESPACE::mbrtowc (dest, ch, 2 , mb);
153168 ASSERT_EQ (static_cast <int >(n), 2 );
154169 ASSERT_EQ (static_cast <int >(*dest), 142 );
170+ ASSERT_ERRNO_SUCCESS ();
155171 n = LIBC_NAMESPACE::mbrtowc (dest + 1 , ch + 2 , 2 , mb);
156172 ASSERT_EQ (static_cast <int >(n), 2 );
157173 ASSERT_EQ (static_cast <int >(*(dest + 1 )), 460 );
174+ ASSERT_ERRNO_SUCCESS ();
158175}
159176
160- TEST (LlvmLibcMBRToWC , NullString) {
177+ TEST_F (LlvmLibcMBRToWCTest , NullString) {
161178 wchar_t dest[2 ] = {L' O' , L' K' };
162179 mbstate_t *mb;
163180 LIBC_NAMESPACE::memset (&mb, 0 , sizeof (mbstate_t ));
164181 // reading on nullptr should return 0
165182 size_t n = LIBC_NAMESPACE::mbrtowc (dest, nullptr , 2 , mb);
166183 ASSERT_EQ (static_cast <int >(n), 0 );
167184 ASSERT_TRUE (dest[0 ] == L' O' );
185+ ASSERT_ERRNO_SUCCESS ();
168186 // reading a null terminator should return 0
169187 const char *ch = " \0 " ;
170188 n = LIBC_NAMESPACE::mbrtowc (dest, ch, 1 , mb);
171189 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);
172205}
0 commit comments