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

#define FML_USED_ON_EMBEDDER

#ifndef FLUTTER_SHELL_COMMON_VSYNC_WAITERS_TEST_H_
#define FLUTTER_SHELL_COMMON_VSYNC_WAITERS_TEST_H_

#include "flutter/shell/common/shell.h"

namespace flutter {
namespace testing {

using CreateVsyncWaiter = std::function<std::unique_ptr<VsyncWaiter>()>;

class ShellTestVsyncClock {
 public:
  /// Simulate that a vsync signal is triggered.
  void SimulateVSync();

  /// A future that will return the index the next vsync signal.
  std::future<int> NextVSync();

 private:
  std::mutex mutex_;
  std::vector<std::promise<int>> vsync_promised_;
  size_t vsync_issued_ = 0;
};

class ShellTestVsyncWaiter : public VsyncWaiter {
 public:
  ShellTestVsyncWaiter(TaskRunners task_runners,
                       std::shared_ptr<ShellTestVsyncClock> clock)
      : VsyncWaiter(std::move(task_runners)), clock_(clock) {}

 protected:
  void AwaitVSync() override;

 private:
  std::shared_ptr<ShellTestVsyncClock> clock_;
};

class ConstantFiringVsyncWaiter : public VsyncWaiter {
 public:
  // both of these are set in the past so as to fire immediately.
  static constexpr fml::TimePoint frame_begin_time =
      fml::TimePoint::FromEpochDelta(fml::TimeDelta::FromSeconds(0));
  static constexpr fml::TimePoint frame_target_time =
      fml::TimePoint::FromEpochDelta(fml::TimeDelta::FromSeconds(100));

  ConstantFiringVsyncWaiter(TaskRunners task_runners)
      : VsyncWaiter(std::move(task_runners)) {}

 protected:
  void AwaitVSync() override;
};

}  // namespace testing
}  // namespace flutter

#endif  // FLUTTER_SHELL_COMMON_VSYNC_WAITERS_TEST_H_
