// 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/test_random.h"

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

namespace rng {
namespace {

using ::testing::ElementsAreArray;
using ::testing::Not;

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

TEST(TestRandomTest, DependantDraws) {
  constexpr size_t kNbElement = 20;

  TestRandom random1(0);
  TestRandom random2(0);

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

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

  EXPECT_THAT(v1, ElementsAreArray(v2));
}

TEST(TestRandomTest, ConsequentDraws) {
  constexpr size_t kNbElement = 20;

  TestRandom random1(0);

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

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

  EXPECT_THAT(v1, Not(ElementsAreArray(v2)));
}

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

  TestRandom random1(0);
  TestRandom random2(1);

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

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

  EXPECT_THAT(v1, Not(ElementsAreArray(v2)));
}

TEST(TestRandomTest, NoSeedTruncation) {
  // Tests that the seed is not accidentally truncated when initializing the
  // generator.
  constexpr size_t kNbElement = 20;

  TestRandom random1(1);
  TestRandom random2(1 + (1 << 8));
  TestRandom random3(1 + (1 << 16));
  TestRandom random4(1 + (uint64_t(1) << 32));

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

  random1.Draw(&v1);
  random2.Draw(&v2);
  random3.Draw(&v3);
  random4.Draw(&v4);

  EXPECT_THAT(v1, Not(ElementsAreArray(v2)));
  EXPECT_THAT(v1, Not(ElementsAreArray(v3)));
  EXPECT_THAT(v1, Not(ElementsAreArray(v4)));
}

}  // namespace
}  // namespace rng
