#include <catch2/catch_test_macros.hpp>
#include <catch2/matchers/catch_matchers_all.hpp>

#include <utils/Messenger.hpp>
#include <utils/RandomEngine.hpp>

#include <utils/pugs_config.hpp>

// clazy:excludeall=non-pod-global-static

TEST_CASE("RandomEngine", "[random]")
{
  SECTION("current state")
  {
    RandomEngine& random_engine = RandomEngine::instance();
    REQUIRE(isSynchronized(random_engine));
  }

  SECTION("set seed")
  {
    RandomEngine& random_engine = RandomEngine::instance();
    random_engine.setRandomSeed(1402339680);

    REQUIRE(isSynchronized(random_engine));

    REQUIRE(random_engine.getCurrentSeed() == 1402339680);
  }

  SECTION("reset seed")
  {
    RandomEngine& random_engine = RandomEngine::instance();
    random_engine.resetRandomSeed();

    REQUIRE(isSynchronized(random_engine));
  }

  SECTION("de-synchronize seeds")
  {
    RandomEngine& random_engine = RandomEngine::instance();
    random_engine.resetRandomSeed();
    auto& engine = random_engine.engine();

    for (size_t i = 0; i < parallel::rank(); ++i) {
      engine();
    }

    REQUIRE(((parallel::size() == 1) or not isSynchronized(random_engine)));

    random_engine.resetRandomSeed();
    REQUIRE(isSynchronized(random_engine));
  }
}