85 lines · cpp
1//===-- Unittests for wcstombs --------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/stdlib/wcstombs.h"10#include "test/UnitTest/ErrnoCheckingTest.h"11#include "test/UnitTest/Test.h"12 13using LlvmLibcWcstombs = LIBC_NAMESPACE::testing::ErrnoCheckingTest;14 15// these tests are fairly simple as this function just calls into the internal16// wcsnrtombs which is more thoroughly tested17 18TEST_F(LlvmLibcWcstombs, AllMultibyteLengths) {19 /// clown emoji, sigma symbol, y with diaeresis, letter A20 const wchar_t src[] = {static_cast<wchar_t>(0x1f921),21 static_cast<wchar_t>(0x2211),22 static_cast<wchar_t>(0xff), static_cast<wchar_t>(0x41),23 static_cast<wchar_t>(0x0)};24 char mbs[11];25 26 ASSERT_EQ(LIBC_NAMESPACE::wcstombs(mbs, src, 11), static_cast<size_t>(10));27 ASSERT_ERRNO_SUCCESS();28 ASSERT_EQ(mbs[0], '\xF0'); // clown begin29 ASSERT_EQ(mbs[1], '\x9F');30 ASSERT_EQ(mbs[2], '\xA4');31 ASSERT_EQ(mbs[3], '\xA1');32 ASSERT_EQ(mbs[4], '\xE2'); // sigma begin33 ASSERT_EQ(mbs[5], '\x88');34 ASSERT_EQ(mbs[6], '\x91');35 ASSERT_EQ(mbs[7], '\xC3'); // y diaeresis begin36 ASSERT_EQ(mbs[8], '\xBF');37 ASSERT_EQ(mbs[9], '\x41'); // A begin38 ASSERT_EQ(mbs[10], '\0'); // null terminator39}40 41TEST_F(LlvmLibcWcstombs, DestLimit) {42 /// clown emoji, sigma symbol, y with diaeresis, letter A43 const wchar_t src[] = {static_cast<wchar_t>(0x1f921),44 static_cast<wchar_t>(0x2211),45 static_cast<wchar_t>(0xff), static_cast<wchar_t>(0x41),46 static_cast<wchar_t>(0x0)};47 char mbs[11];48 for (int i = 0; i < 11; ++i)49 mbs[i] = '\x01'; // dummy initial values50 51 ASSERT_EQ(LIBC_NAMESPACE::wcstombs(mbs, src, 4), static_cast<size_t>(4));52 ASSERT_ERRNO_SUCCESS();53 ASSERT_EQ(mbs[0], '\xF0');54 ASSERT_EQ(mbs[1], '\x9F');55 ASSERT_EQ(mbs[2], '\xA4');56 ASSERT_EQ(mbs[3], '\xA1');57 ASSERT_EQ(mbs[4], '\x01'); // didn't write more than 4 bytes58 59 for (int i = 0; i < 11; ++i)60 mbs[i] = '\x01'; // dummy initial values61 62 // not enough bytes to convert the second character, so only converts one63 ASSERT_EQ(LIBC_NAMESPACE::wcstombs(mbs, src, 6), static_cast<size_t>(4));64 ASSERT_ERRNO_SUCCESS();65 ASSERT_EQ(mbs[0], '\xF0');66 ASSERT_EQ(mbs[1], '\x9F');67 ASSERT_EQ(mbs[2], '\xA4');68 ASSERT_EQ(mbs[3], '\xA1');69 ASSERT_EQ(mbs[4], '\x01');70}71 72TEST_F(LlvmLibcWcstombs, ErrnoTest) {73 const wchar_t src[] = {static_cast<wchar_t>(0x1f921),74 static_cast<wchar_t>(0x2211),75 static_cast<wchar_t>(0x12ffff), // invalid widechar76 static_cast<wchar_t>(0x0)};77 char mbs[11];78 79 // n parameter ignored when dest is null80 ASSERT_EQ(LIBC_NAMESPACE::wcstombs(mbs, src, 7), static_cast<size_t>(7));81 ASSERT_ERRNO_SUCCESS();82 ASSERT_EQ(LIBC_NAMESPACE::wcstombs(mbs, src, 100), static_cast<size_t>(-1));83 ASSERT_ERRNO_EQ(EILSEQ);84}85