74 lines · cpp
1//===-- Unittests for wctomb ----------------------------------------------===//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 "hdr/errno_macros.h"10#include "hdr/types/wchar_t.h"11#include "src/stdlib/wctomb.h"12#include "test/UnitTest/ErrnoCheckingTest.h"13#include "test/UnitTest/Test.h"14 15using LlvmLibcWCToMBTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;16 17TEST(LlvmLibcWCToMBTest, OneByte) {18 wchar_t wc = L'U';19 char mb[4];20 int cnt = LIBC_NAMESPACE::wctomb(mb, wc);21 ASSERT_EQ(cnt, 1);22 ASSERT_EQ(mb[0], 'U');23}24 25TEST(LlvmLibcWCToMBTest, TwoByte) {26 // testing utf32: 0xff -> utf8: 0xc3 0xbf27 wchar_t wc = 0xff;28 char mb[4];29 int cnt = LIBC_NAMESPACE::wctomb(mb, wc);30 ASSERT_EQ(cnt, 2);31 ASSERT_EQ(mb[0], static_cast<char>(0xc3));32 ASSERT_EQ(mb[1], static_cast<char>(0xbf));33}34 35TEST(LlvmLibcWCToMBTest, ThreeByte) {36 // testing utf32: 0xac15 -> utf8: 0xea 0xb0 0x9537 wchar_t wc = 0xac15;38 char mb[4];39 int cnt = LIBC_NAMESPACE::wctomb(mb, wc);40 ASSERT_EQ(cnt, 3);41 ASSERT_EQ(mb[0], static_cast<char>(0xea));42 ASSERT_EQ(mb[1], static_cast<char>(0xb0));43 ASSERT_EQ(mb[2], static_cast<char>(0x95));44}45 46TEST(LlvmLibcWCToMBTest, FourByte) {47 // testing utf32: 0x1f921 -> utf8: 0xf0 0x9f 0xa4 0xa148 wchar_t wc = 0x1f921;49 char mb[4];50 int cnt = LIBC_NAMESPACE::wctomb(mb, wc);51 ASSERT_EQ(cnt, 4);52 ASSERT_EQ(mb[0], static_cast<char>(0xf0));53 ASSERT_EQ(mb[1], static_cast<char>(0x9f));54 ASSERT_EQ(mb[2], static_cast<char>(0xa4));55 ASSERT_EQ(mb[3], static_cast<char>(0xa1));56}57 58TEST(LlvmLibcWCToMBTest, NullString) {59 wchar_t wc = L'A';60 61 int cnt = LIBC_NAMESPACE::wctomb(nullptr, wc);62 63 // no state-dependent encoding64 ASSERT_EQ(cnt, 0);65}66 67TEST(LlvmLibcWCToMBTest, InvalidWchar) {68 wchar_t wc = 0x12ffff;69 char mb[4];70 int cnt = LIBC_NAMESPACE::wctomb(mb, wc);71 ASSERT_EQ(cnt, -1);72 ASSERT_ERRNO_EQ(EILSEQ);73}74