// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "peridot/lib/rng/system_random.h"

#include <algorithm>
#include <random>
#include <vector>

#include "gmock/gmock.h"
#include "gtest/gtest.h"

namespace rng {
namespace {

using ::testing::ElementsAre;
using ::testing::Ge;
using ::testing::Le;
using ::testing::SizeIs;

TEST(TestRandomTest, InUniquePtr) {
  auto test_random = std::make_unique<SystemRandom>();
  std::unique_ptr<Random> random = std::move(test_random);
  EXPECT_TRUE(random);
}

TEST(SystemRandomTest, MiscRandomTest) {
  constexpr size_t kNbElement = 20;

  SystemRandom random;

  std::vector<uint32_t> v1;
  for (size_t i = 0; i < kNbElement; ++i) {
    v1.push_back(random.Draw<uint32_t>());
  }
  EXPECT_TRUE(std::any_of(v1.begin(), v1.end(), [](const uint8_t& v) { return v != 0; }));

  std::vector<uint8_t> v2(kNbElement, 0);
  random.Draw(&v2);
  EXPECT_TRUE(std::any_of(v2.begin(), v2.end(), [](const uint8_t& v) { return v != 0; }));

  uint8_t bytes[kNbElement];
  random.Draw(bytes, kNbElement);
  EXPECT_TRUE(std::any_of(bytes, bytes + kNbElement, [](const uint8_t& v) { return v != 0; }));
}

TEST(SystemRandomTest, BitGeneratorTest) {
  constexpr size_t kNbElement = 100;
  SystemRandom random;

  auto engine = random.NewBitGenerator<uint32_t>();
  std::discrete_distribution<> d({1, 1, 1, 1});
  std::set<uint32_t> s;
  for (size_t i = 0; i < kNbElement; ++i) {
    s.insert(d(engine));
  }
  EXPECT_THAT(s, ElementsAre(0, 1, 2, 3));
}

TEST(SystemRandomTest, RandomStructTest) {
  constexpr size_t kNbElement = 64;
  struct S {
    uint64_t array[kNbElement];
  };
  SystemRandom random;

  auto s1 = random.Draw<S>();
  std::set<uint64_t> v1(s1.array, s1.array + kNbElement);

  EXPECT_THAT(v1, SizeIs(Ge(kNbElement - 2)));

  auto s2 = random.Draw<S>();
  std::set<uint64_t> v2(s2.array, s2.array + kNbElement);

  std::vector<uint64_t> common_data;
  set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(common_data));
  EXPECT_THAT(common_data, SizeIs(Le(2u)));
}

TEST(SystemRandomTest, IndependantDraws) {
  constexpr size_t kNbElement = 20;

  SystemRandom random1;
  SystemRandom random2;

  std::vector<uint8_t> v1(kNbElement, 0);
  std::vector<uint8_t> v2(kNbElement, 0);

  random1.Draw(&v1);
  random2.Draw(&v2);

  EXPECT_NE(v1, v2);
}

}  // namespace
}  // namespace rng
