// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/view_transition/view_transition_request.h"

#include <utility>

#include "base/test/bind.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cc {

TEST(ViewTransitionRequestTest, PrepareRequest) {
  bool called = false;
  auto callback = base::BindLambdaForTesting(
      [&called](const viz::ViewTransitionElementResourceRects&) {
        called = true;
      });

  auto request = ViewTransitionRequest::CreateCapture(
      blink::ViewTransitionToken(),
      /*maybe_cross_frame_sink=*/false, {}, std::move(callback));

  EXPECT_FALSE(called);
  request->TakeFinishedCallback().Run({});
  EXPECT_TRUE(called);
  EXPECT_TRUE(request->TakeFinishedCallback().is_null());

  auto directive = request->ConstructDirective({}, {});
  EXPECT_GT(directive.sequence_id(), 0u);
  EXPECT_EQ(viz::CompositorFrameTransitionDirective::Type::kSave,
            directive.type());

  auto duplicate = request->ConstructDirective({}, {});
  EXPECT_EQ(duplicate.sequence_id(), directive.sequence_id());
  EXPECT_EQ(duplicate.type(), directive.type());
}

TEST(ViewTransitionRequestTest, StartRequest) {
  auto request = ViewTransitionRequest::CreateAnimateRenderer(
      blink::ViewTransitionToken(),
      /*maybe_cross_frame_sink=*/false);

  EXPECT_TRUE(request->TakeFinishedCallback().is_null());

  auto directive = request->ConstructDirective({}, {});
  EXPECT_GT(directive.sequence_id(), 0u);
  EXPECT_EQ(viz::CompositorFrameTransitionDirective::Type::kAnimateRenderer,
            directive.type());
}

}  // namespace cc
