//===-- Unittests for memmove ---------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "src/string/memcmp.h"
#include "src/string/memmove.h"
#include "utils/CPP/ArrayRef.h"
#include "utils/UnitTest/Test.h"

class MemmoveTest : public __llvm_libc::testing::Test {
public:
  void check_memmove(void *dest, const void *src, size_t count, const void *str,
                     const __llvm_libc::cpp::ArrayRef<unsigned char> expected) {
    void *result = __llvm_libc::memmove(dest, src, count);
    // Making sure the pointer returned is same with dest.
    EXPECT_EQ(result, dest);
    // expected is designed according to str.
    // dest and src might be part of str.
    // Making sure the str is same with expected.
    EXPECT_EQ(__llvm_libc::memcmp(str, expected.data(), expected.size()), 0);
  }
};

TEST_F(MemmoveTest, MoveZeroByte) {
  unsigned char dest[] = {'a', 'b'};
  const unsigned char src[] = {'y', 'z'};
  const unsigned char expected[] = {'a', 'b'};
  check_memmove(dest, src, 0, dest, expected);
}

TEST_F(MemmoveTest, OverlapThatDestAndSrcPointToSameAddress) {
  unsigned char str[] = {'a', 'b'};
  const unsigned char expected[] = {'a', 'b'};
  check_memmove(str, str, 1, str, expected);
}

TEST_F(MemmoveTest, OverlapThatDestStartsBeforeSrc) {
  // Set boundary at beginning and end for not overstepping when
  // copy forward or backward.
  unsigned char str[] = {'z', 'a', 'b', 'c', 'z'};
  const unsigned char expected[] = {'z', 'b', 'c', 'c', 'z'};
  // dest is &str[1].
  check_memmove(&str[1], &str[2], 2, str, expected);
}

TEST_F(MemmoveTest, OverlapThatDestStartsAfterSrc) {
  unsigned char str[] = {'z', 'a', 'b', 'c', 'z'};
  const unsigned char expected[] = {'z', 'a', 'a', 'b', 'z'};
  check_memmove(&str[2], &str[1], 2, str, expected);
}

// e.g. dest follow src.
// str: [abcdefghij]
//      [__src_____]
//      [_____dest_]
TEST_F(MemmoveTest, SrcFollowDest) {
  unsigned char str[] = {'z', 'a', 'b', 'z'};
  const unsigned char expected[] = {'z', 'b', 'b', 'z'};
  check_memmove(&str[1], &str[2], 1, str, expected);
}

TEST_F(MemmoveTest, DestFollowSrc) {
  unsigned char str[] = {'z', 'a', 'b', 'z'};
  const unsigned char expected[] = {'z', 'a', 'a', 'z'};
  check_memmove(&str[2], &str[1], 1, str, expected);
}
