brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 792a4ed Raw
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