1//===-- Unittests for wmemmove --------------------------------------------===//
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/size_t.h"
10#include "hdr/types/wchar_t.h"
11#include "src/wchar/wmemmove.h"
12#include "test/UnitTest/Test.h"
13
14TEST(LlvmLibcWMemmoveTest, MoveZeroByte) {
15 wchar_t buffer[] = {L'a', L'b', L'y', L'z'};
16
17 wchar_t *ret = LIBC_NAMESPACE::wmemmove(buffer, buffer + 2, 0);
18 EXPECT_EQ(ret, buffer);
19
20 const wchar_t expected[] = {L'a', L'b', L'y', L'z'};
21 EXPECT_TRUE(buffer[0] == expected[0]);
22 EXPECT_TRUE(buffer[1] == expected[1]);
23 EXPECT_TRUE(buffer[2] == expected[2]);
24 EXPECT_TRUE(buffer[3] == expected[3]);
25}
26
27TEST(LlvmLibcWMemmoveTest, DstAndSrcPointToSameAddress) {
28 wchar_t buffer[] = {L'a', L'b'};
29
30 wchar_t *ret = LIBC_NAMESPACE::wmemmove(buffer, buffer, 1);
31 EXPECT_EQ(ret, buffer);
32
33 const wchar_t expected[] = {L'a', L'b'};
34 EXPECT_TRUE(buffer[0] == expected[0]);
35 EXPECT_TRUE(buffer[1] == expected[1]);
36}
37
38TEST(LlvmLibcWMemmoveTest, DstStartsBeforeSrc) {
39 // Set boundary at beginning and end for not overstepping when
40 // copy forward or backward.
41 wchar_t buffer[] = {L'z', L'a', L'b', L'c', L'z'};
42
43 wchar_t *dst = buffer + 1;
44 wchar_t *ret = LIBC_NAMESPACE::wmemmove(dst, buffer + 2, 2);
45 EXPECT_EQ(ret, dst);
46
47 const wchar_t expected[] = {L'z', L'b', L'c', L'c', L'z'};
48 EXPECT_TRUE(buffer[0] == expected[0]);
49 EXPECT_TRUE(buffer[1] == expected[1]);
50 EXPECT_TRUE(buffer[2] == expected[2]);
51 EXPECT_TRUE(buffer[3] == expected[3]);
52 EXPECT_TRUE(buffer[4] == expected[4]);
53}
54
55TEST(LlvmLibcWMemmoveTest, DstStartsAfterSrc) {
56 wchar_t buffer[] = {L'z', L'a', L'b', L'c', L'z'};
57
58 wchar_t *dst = buffer + 2;
59 wchar_t *ret = LIBC_NAMESPACE::wmemmove(dst, buffer + 1, 2);
60 EXPECT_EQ(ret, dst);
61
62 const wchar_t expected[] = {L'z', L'a', L'a', L'b', L'z'};
63 EXPECT_TRUE(buffer[0] == expected[0]);
64 EXPECT_TRUE(buffer[1] == expected[1]);
65 EXPECT_TRUE(buffer[2] == expected[2]);
66 EXPECT_TRUE(buffer[3] == expected[3]);
67 EXPECT_TRUE(buffer[4] == expected[4]);
68}
69
70// e.g. `Dst` follow `src`.
71// str: [abcdefghij]
72// [__src_____]
73// [_____Dst__]
74TEST(LlvmLibcWMemmoveTest, SrcFollowDst) {
75 wchar_t buffer[] = {L'z', L'a', L'b', L'z'};
76
77 wchar_t *dst = buffer + 1;
78 wchar_t *ret = LIBC_NAMESPACE::wmemmove(dst, buffer + 2, 1);
79 EXPECT_EQ(ret, dst);
80
81 const char expected[] = {L'z', L'b', L'b', L'z'};
82 EXPECT_TRUE(buffer[0] == expected[0]);
83 EXPECT_TRUE(buffer[1] == expected[1]);
84 EXPECT_TRUE(buffer[2] == expected[2]);
85 EXPECT_TRUE(buffer[3] == expected[3]);
86}
87
88TEST(LlvmLibcWMemmoveTest, DstFollowSrc) {
89 wchar_t buffer[] = {L'z', L'a', L'b', L'z'};
90
91 wchar_t *dst = buffer + 2;
92 wchar_t *ret = LIBC_NAMESPACE::wmemmove(dst, buffer + 1, 1);
93 EXPECT_EQ(ret, dst);
94
95 const char expected[] = {L'z', L'a', L'a', L'z'};
96 EXPECT_TRUE(buffer[0] == expected[0]);
97 EXPECT_TRUE(buffer[1] == expected[1]);
98 EXPECT_TRUE(buffer[2] == expected[2]);
99 EXPECT_TRUE(buffer[3] == expected[3]);
100}
101
102#if defined(LIBC_ADD_NULL_CHECKS) && !defined(LIBC_HAS_SANITIZER)
103TEST(LlvmLibcWMemmoveTest, NullptrCrash) {
104 wchar_t buffer[] = {L'a', L'b'};
105 // Passing in a nullptr should crash the program.
106 EXPECT_DEATH([&buffer] { LIBC_NAMESPACE::wmemmove(buffer, nullptr, 2); },
107 WITH_SIGNAL(-1));
108 EXPECT_DEATH([&buffer] { LIBC_NAMESPACE::wmemmove(nullptr, buffer, 2); },
109 WITH_SIGNAL(-1));
110}
111#endif // LIBC_HAS_ADDRESS_SANITIZER
112

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