// Copyright 2019 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 "src/lib/util/sleeper.h"

#include <chrono>

#include <gtest/gtest.h>

#include "src/lib/util/clock.h"

using std::chrono::milliseconds;
using std::chrono::steady_clock;

namespace cobalt::util {

TEST(SleeperTest, BasicFakeSleeper) {
  FakeSleeper fake_sleeper;
  for (auto i = 42; i < 45; i++) {
    fake_sleeper.sleep_for(milliseconds(i));
    EXPECT_EQ(milliseconds(i), fake_sleeper.last_sleep_duration());
  }
  fake_sleeper.Reset();
  EXPECT_EQ(milliseconds(0), fake_sleeper.last_sleep_duration());
  fake_sleeper.sleep_for(milliseconds(45));
  EXPECT_EQ(milliseconds(45), fake_sleeper.last_sleep_duration());
}

TEST(SleeperTest, FakeSleeperWithSteadyClock) {
  FakeSleeper fake_sleeper;
  IncrementingSteadyClock clock;
  clock.set_time(steady_clock::time_point(milliseconds(100)));
  fake_sleeper.set_incrementing_steady_clock(&clock);
  fake_sleeper.sleep_for(milliseconds(17));
  EXPECT_EQ(clock.peek_now(), steady_clock::time_point(milliseconds(117)));
}

TEST(SleeperTest, FakeSleeperWithCallback) {
  FakeSleeper fake_sleeper;
  milliseconds sleep_duration(0);
  fake_sleeper.set_callback([&sleep_duration](const milliseconds& d) { sleep_duration = d; });
  fake_sleeper.sleep_for(milliseconds(17));
  EXPECT_EQ(sleep_duration, milliseconds(17));
}

}  // namespace cobalt::util
