94 lines · cpp
1//===-- Unittests for wcpncpy --------------------------------------------===//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/types/wchar_t.h"10#include "src/wchar/wcpncpy.h"11#include "test/UnitTest/Test.h"12 13TEST(LlvmLibcWCPNCpyTest, EmptySrc) {14 // Empty src should lead to empty destination.15 wchar_t dest[4] = {L'a', L'b', L'c', L'\0'};16 const wchar_t *src = L"";17 LIBC_NAMESPACE::wcpncpy(dest, src, 3);18 ASSERT_TRUE(dest[0] == src[0]);19 ASSERT_TRUE(dest[0] == L'\0');20 // Rest should also be padded with L'\0'21 ASSERT_TRUE(dest[1] == L'\0');22 ASSERT_TRUE(dest[2] == L'\0');23}24 25TEST(LlvmLibcWCPNCpyTest, Untouched) {26 wchar_t dest[] = {L'a', L'b'};27 const wchar_t src[] = {L'x', L'\0'};28 LIBC_NAMESPACE::wcpncpy(dest, src, 0);29 ASSERT_TRUE(dest[0] == L'a');30 ASSERT_TRUE(dest[1] == L'b');31}32 33TEST(LlvmLibcWCPNCpyTest, CopyOne) {34 wchar_t dest[] = {L'a', L'b'};35 const wchar_t src[] = {L'x', L'y'};36 wchar_t *res = LIBC_NAMESPACE::wcpncpy(dest, src, 1);37 ASSERT_TRUE(dest[0] == L'x');38 ASSERT_TRUE(dest[1] == L'b');39 ASSERT_EQ(dest + 1, res);40}41 42TEST(LlvmLibcWCPNCpyTest, CopyNull) {43 wchar_t dest[] = {L'a', L'b'};44 const wchar_t src[] = {L'\0', L'y'};45 wchar_t *res = LIBC_NAMESPACE::wcpncpy(dest, src, 1);46 ASSERT_TRUE(dest[0] == L'\0');47 ASSERT_TRUE(dest[1] == L'b');48 ASSERT_EQ(dest, res);49}50 51TEST(LlvmLibcWCPNCpyTest, CopyPastSrc) {52 wchar_t dest[] = {L'a', L'b'};53 const wchar_t src[] = {L'\0', L'y'};54 wchar_t *res = LIBC_NAMESPACE::wcpncpy(dest, src, 2);55 ASSERT_TRUE(dest[0] == L'\0');56 ASSERT_TRUE(dest[1] == L'\0');57 ASSERT_EQ(dest, res);58}59 60TEST(LlvmLibcWCPNCpyTest, CopyTwoNoNull) {61 wchar_t dest[] = {L'a', L'b'};62 const wchar_t src[] = {L'x', L'y'};63 wchar_t *res = LIBC_NAMESPACE::wcpncpy(dest, src, 2);64 ASSERT_TRUE(dest[0] == L'x');65 ASSERT_TRUE(dest[1] == L'y');66 ASSERT_EQ(dest + 2, res);67}68 69TEST(LlvmLibcWCPNCpyTest, CopyTwoWithNull) {70 wchar_t dest[] = {L'a', L'b'};71 const wchar_t src[] = {L'x', L'\0'};72 wchar_t *res = LIBC_NAMESPACE::wcpncpy(dest, src, 2);73 ASSERT_TRUE(dest[0] == L'x');74 ASSERT_TRUE(dest[1] == L'\0');75 ASSERT_EQ(dest + 1, res);76}77 78TEST(LlvmLibcWCPNCpyTest, CopyAndFill) {79 wchar_t dest[] = {L'a', L'b', L'c'};80 wchar_t *res = LIBC_NAMESPACE::wcpncpy(dest, L"x", 3);81 ASSERT_TRUE(dest[0] == L'x');82 ASSERT_TRUE(dest[1] == L'\0');83 ASSERT_TRUE(dest[2] == L'\0');84 ASSERT_EQ(dest + 1, res);85}86 87#if defined(LIBC_ADD_NULL_CHECKS)88TEST(LlvmLibcWCPNCpyTest, NullptrCrash) {89 // Passing in a nullptr should crash the program.90 EXPECT_DEATH([] { LIBC_NAMESPACE::wcpncpy(nullptr, nullptr, 1); },91 WITH_SIGNAL(-1));92}93#endif // LIBC_ADD_NULL_CHECKS94