//===-- Benchmark Memory Test ---------------------------------------------===//
//
// 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 "LibcMemoryBenchmark.h"
#include "llvm/Support/Alignment.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include <optional>

using testing::AllOf;
using testing::AnyOf;
using testing::ElementsAre;
using testing::Ge;
using testing::Gt;
using testing::Le;
using testing::Lt;

namespace llvm {
namespace libc_benchmarks {
namespace {

TEST(AlignedBuffer, IsAligned) {
  AlignedBuffer AB(0);
  EXPECT_TRUE(isAddrAligned(Align(AlignedBuffer::Alignment), AB.begin()));
}

TEST(AlignedBuffer, Empty) {
  AlignedBuffer AB(0);
  EXPECT_EQ(std::distance(AB.begin(), AB.end()), 0U);
}

TEST(OffsetDistribution, AlignToBegin) {
  const size_t BufferSize = 8192;
  OffsetDistribution OD(BufferSize, 1024, std::nullopt);
  std::default_random_engine Gen;
  for (size_t I = 0; I <= 10; ++I)
    EXPECT_EQ(OD(Gen), 0U);
}

TEST(OffsetDistribution, NoAlignment) {
  const size_t BufferSize = 8192;
  OffsetDistribution OD(BufferSize, 1, Align(1));
  std::default_random_engine Gen;
  for (size_t I = 0; I <= 10; ++I)
    EXPECT_THAT(OD(Gen), AllOf(Ge(0U), Lt(8192U)));
}

MATCHER_P(IsDivisibleBy, n, "") {
  *result_listener << "where the remainder is " << (arg % n);
  return (arg % n) == 0;
}

TEST(OffsetDistribution, Aligned) {
  const size_t BufferSize = 8192;
  OffsetDistribution OD(BufferSize, 1, Align(16));
  std::default_random_engine Gen;
  for (size_t I = 0; I <= 10; ++I)
    EXPECT_THAT(OD(Gen), AllOf(Ge(0U), Lt(8192U), IsDivisibleBy(16U)));
}

TEST(MismatchOffsetDistribution, EqualBufferDisablesDistribution) {
  const size_t BufferSize = 8192;
  const uint32_t MismatchAt = 0; // buffer are equal.

  MismatchOffsetDistribution MOD(BufferSize, 1024, MismatchAt);
  EXPECT_FALSE(MOD);
}

TEST(MismatchOffsetDistribution, DifferentBufferDisablesDistribution) {
  const size_t BufferSize = 8192;
  const uint32_t MismatchAt = 1; // buffer are different.

  MismatchOffsetDistribution MOD(BufferSize, 1024, MismatchAt);
  EXPECT_FALSE(MOD);
}

TEST(MismatchOffsetDistribution, MismatchAt2) {
  const size_t BufferSize = 16;
  const uint32_t MismatchAt = 2; // buffer are different at position 2.
  const uint32_t MaxSize = 4;

  MismatchOffsetDistribution MOD(BufferSize, MaxSize, MismatchAt);
  EXPECT_TRUE(MOD);
  // We test equality up to MaxSize (=4) so we need spans of 4 equal bytes
  // spaced by one mismatch.
  EXPECT_THAT(MOD.getMismatchIndices(), ElementsAre(5, 9, 13));
  std::default_random_engine Gen;
  for (size_t Iterations = 0; Iterations <= 10; ++Iterations) {
    for (size_t Size = 0; Size <= MaxSize; ++Size) {
      if (Size >= MismatchAt)
        EXPECT_THAT(MOD(Gen, Size),
                    AnyOf(5 - MismatchAt, 9 - MismatchAt, 13 - MismatchAt));
      else
        EXPECT_THAT(MOD(Gen, Size),
                    AnyOf(5 - Size - 1, 9 - Size - 1, 13 - Size - 1));
    }
  }
}

} // namespace
} // namespace libc_benchmarks
} // namespace llvm
