Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 30 additions & 30 deletions libc/test/src/wchar/mbrtowc_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,18 @@ TEST_F(LlvmLibcMBRToWCTest, TwoByte) {
const char ch[2] = {static_cast<char>(0xC2),
static_cast<char>(0x8E)}; // Ž car symbol
wchar_t dest[2];
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 2, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 2, &mb);
ASSERT_EQ(static_cast<int>(*dest), 142);
ASSERT_EQ(static_cast<int>(n), 2);
ASSERT_ERRNO_SUCCESS();

// Should fail since we have not read enough
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, mb);
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, &mb);
ASSERT_EQ(static_cast<int>(n), -2);
// Should pass after reading one more byte
n = LIBC_NAMESPACE::mbrtowc(dest, ch + 1, 1, mb);
n = LIBC_NAMESPACE::mbrtowc(dest, ch + 1, 1, &mb);
ASSERT_EQ(static_cast<int>(n), 1);
ASSERT_EQ(static_cast<int>(*dest), 142);
ASSERT_ERRNO_SUCCESS();
Expand All @@ -58,19 +58,19 @@ TEST_F(LlvmLibcMBRToWCTest, ThreeByte) {
const char ch[3] = {static_cast<char>(0xE2), static_cast<char>(0x88),
static_cast<char>(0x91)}; // ∑ sigma symbol
wchar_t dest[2];
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 3, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 3, &mb);
ASSERT_EQ(static_cast<int>(*dest), 8721);
ASSERT_EQ(static_cast<int>(n), 3);
ASSERT_ERRNO_SUCCESS();

// Should fail since we have not read enough
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, mb);
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, &mb);
ASSERT_EQ(static_cast<int>(n), -2);
ASSERT_ERRNO_SUCCESS();
// Should pass after reading two more bytes
n = LIBC_NAMESPACE::mbrtowc(dest, ch + 1, 2, mb);
n = LIBC_NAMESPACE::mbrtowc(dest, ch + 1, 2, &mb);
ASSERT_EQ(static_cast<int>(n), 2);
ASSERT_EQ(static_cast<int>(*dest), 8721);
ASSERT_ERRNO_SUCCESS();
Expand All @@ -81,18 +81,18 @@ TEST_F(LlvmLibcMBRToWCTest, FourByte) {
static_cast<char>(0xA4),
static_cast<char>(0xA1)}; // 🤡 clown emoji
wchar_t dest[2];
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 4, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 4, &mb);
ASSERT_EQ(static_cast<int>(*dest), 129313);
ASSERT_EQ(static_cast<int>(n), 4);
ASSERT_ERRNO_SUCCESS();
// Should fail since we have not read enough
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 2, mb);
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 2, &mb);
ASSERT_EQ(static_cast<int>(n), -2);
ASSERT_ERRNO_SUCCESS();
// Should pass after reading two more bytes
n = LIBC_NAMESPACE::mbrtowc(dest, ch + 2, 2, mb);
n = LIBC_NAMESPACE::mbrtowc(dest, ch + 2, 2, &mb);
ASSERT_EQ(static_cast<int>(n), 2);
ASSERT_EQ(static_cast<int>(*dest), 129313);
ASSERT_ERRNO_SUCCESS();
Expand All @@ -101,9 +101,9 @@ TEST_F(LlvmLibcMBRToWCTest, FourByte) {
TEST_F(LlvmLibcMBRToWCTest, InvalidByte) {
const char ch[1] = {static_cast<char>(0x80)};
wchar_t dest[2];
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, &mb);
ASSERT_EQ(static_cast<int>(n), -1);
ASSERT_ERRNO_EQ(EILSEQ);
}
Expand All @@ -113,18 +113,18 @@ TEST_F(LlvmLibcMBRToWCTest, InvalidMultiByte) {
static_cast<char>(0x80),
static_cast<char>(0x00)}; // invalid sequence of bytes
wchar_t dest[2];
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
// Trying to push all 4 should error
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 4, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 4, &mb);
ASSERT_EQ(static_cast<int>(n), -1);
ASSERT_ERRNO_EQ(EILSEQ);
// Trying to push just the first one should error
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, mb);
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, &mb);
ASSERT_EQ(static_cast<int>(n), -1);
ASSERT_ERRNO_EQ(EILSEQ);
// Trying to push the second and third should correspond to null wc
n = LIBC_NAMESPACE::mbrtowc(dest, ch + 1, 2, mb);
n = LIBC_NAMESPACE::mbrtowc(dest, ch + 1, 2, &mb);
ASSERT_EQ(static_cast<int>(n), 0);
ASSERT_TRUE(*dest == L'\0');
ASSERT_ERRNO_SUCCESS();
Expand All @@ -136,10 +136,10 @@ TEST_F(LlvmLibcMBRToWCTest, InvalidLastByte) {
const char ch[4] = {static_cast<char>(0xF1), static_cast<char>(0x80),
static_cast<char>(0x80), static_cast<char>(0xC0)};
wchar_t dest[2];
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
// Trying to push all 4 should error
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 4, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 4, &mb);
ASSERT_EQ(static_cast<int>(n), -1);
ASSERT_ERRNO_EQ(EILSEQ);
}
Expand All @@ -148,10 +148,10 @@ TEST_F(LlvmLibcMBRToWCTest, ValidTwoByteWithExtraRead) {
const char ch[3] = {static_cast<char>(0xC2), static_cast<char>(0x8E),
static_cast<char>(0x80)};
wchar_t dest[2];
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
// Trying to push all 3 should return valid 2 byte
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 3, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 3, &mb);
ASSERT_EQ(static_cast<int>(n), 2);
ASSERT_EQ(static_cast<int>(*dest), 142);
ASSERT_ERRNO_SUCCESS();
Expand All @@ -161,31 +161,31 @@ TEST_F(LlvmLibcMBRToWCTest, TwoValidTwoBytes) {
const char ch[4] = {static_cast<char>(0xC2), static_cast<char>(0x8E),
static_cast<char>(0xC7), static_cast<char>(0x8C)};
wchar_t dest[2];
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
// mbstate should reset after reading first one
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 2, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(dest, ch, 2, &mb);
ASSERT_EQ(static_cast<int>(n), 2);
ASSERT_EQ(static_cast<int>(*dest), 142);
ASSERT_ERRNO_SUCCESS();
n = LIBC_NAMESPACE::mbrtowc(dest + 1, ch + 2, 2, mb);
n = LIBC_NAMESPACE::mbrtowc(dest + 1, ch + 2, 2, &mb);
ASSERT_EQ(static_cast<int>(n), 2);
ASSERT_EQ(static_cast<int>(*(dest + 1)), 460);
ASSERT_ERRNO_SUCCESS();
}

TEST_F(LlvmLibcMBRToWCTest, NullString) {
wchar_t dest[2] = {L'O', L'K'};
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
// reading on nullptr should return 0
size_t n = LIBC_NAMESPACE::mbrtowc(dest, nullptr, 2, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(dest, nullptr, 2, &mb);
ASSERT_EQ(static_cast<int>(n), 0);
ASSERT_TRUE(dest[0] == L'O');
ASSERT_ERRNO_SUCCESS();
// reading a null terminator should return 0
const char *ch = "\0";
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, mb);
n = LIBC_NAMESPACE::mbrtowc(dest, ch, 1, &mb);
ASSERT_EQ(static_cast<int>(n), 0);
ASSERT_ERRNO_SUCCESS();
}
Expand All @@ -194,10 +194,10 @@ TEST_F(LlvmLibcMBRToWCTest, NullDest) {
const char ch[4] = {static_cast<char>(0xF0), static_cast<char>(0x9F),
static_cast<char>(0xA4),
static_cast<char>(0xA1)}; // 🤡 clown emoji
mbstate_t *mb;
mbstate_t mb;
LIBC_NAMESPACE::memset(&mb, 0, sizeof(mbstate_t));
// reading nullptr should return correct size
size_t n = LIBC_NAMESPACE::mbrtowc(nullptr, ch, 10, mb);
size_t n = LIBC_NAMESPACE::mbrtowc(nullptr, ch, 10, &mb);
ASSERT_EQ(static_cast<int>(n), 4);
ASSERT_ERRNO_SUCCESS();
}
Expand Down
Loading