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-exception
6//
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) && !defined(LIBC_HAS_SANITIZER)
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_HAS_ADDRESS_SANITIZER
94

source code of libc/test/src/wchar/wcpncpy_test.cpp