// 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.

#include "variable_refresh_rate_display.h"
#include "vsync_waiters_test.h"

#include "gtest/gtest.h"

namespace flutter {
namespace testing {

TEST(VariableRefreshRateDisplayTest, ReportCorrectInitialRefreshRate) {
  auto refresh_rate_reporter = std::make_shared<TestRefreshRateReporter>(60);
  auto display = flutter::VariableRefreshRateDisplay(
      std::weak_ptr<TestRefreshRateReporter>(refresh_rate_reporter));
  ASSERT_EQ(display.GetRefreshRate(), 60);
}

TEST(VariableRefreshRateDisplayTest, ReportCorrectRefreshRateWhenUpdated) {
  auto refresh_rate_reporter = std::make_shared<TestRefreshRateReporter>(60);
  auto display = flutter::VariableRefreshRateDisplay(
      std::weak_ptr<TestRefreshRateReporter>(refresh_rate_reporter));
  refresh_rate_reporter->UpdateRefreshRate(30);
  ASSERT_EQ(display.GetRefreshRate(), 30);
}

TEST(VariableRefreshRateDisplayTest,
     Report0IfReporterSharedPointerIsDestroyedAfterDisplayCreation) {
  auto refresh_rate_reporter = std::make_shared<TestRefreshRateReporter>(60);
  auto display = flutter::VariableRefreshRateDisplay(
      std::weak_ptr<TestRefreshRateReporter>(refresh_rate_reporter));
  refresh_rate_reporter.reset();
  ASSERT_EQ(display.GetRefreshRate(), 0);
}

TEST(VariableRefreshRateDisplayTest,
     Report0IfReporterSharedPointerIsDestroyedBeforeDisplayCreation) {
  auto refresh_rate_reporter = std::make_shared<TestRefreshRateReporter>(60);
  refresh_rate_reporter.reset();
  auto display = flutter::VariableRefreshRateDisplay(
      std::weak_ptr<TestRefreshRateReporter>(refresh_rate_reporter));
  ASSERT_EQ(display.GetRefreshRate(), 0);
}

}  // namespace testing
}  // namespace flutter
