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

#include "ui/gfx/overlay_transform_utils.h"

#include "cc/base/math_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/rect.h"

namespace gfx {
namespace {

TEST(OverlayTransformUtilTest, All) {
  const Size viewport_bounds(100, 200);
  const Rect original(10, 10, 50, 100);
  struct TestCase {
    OverlayTransform overlay_transform;
    Rect transformed;
  };

  TestCase test_cases[] = {
      {OVERLAY_TRANSFORM_NONE, Rect(10, 10, 50, 100)},
      {OVERLAY_TRANSFORM_FLIP_HORIZONTAL, Rect(40, 10, 50, 100)},
      {OVERLAY_TRANSFORM_FLIP_VERTICAL, Rect(10, 90, 50, 100)},
      {OVERLAY_TRANSFORM_ROTATE_90, Rect(90, 10, 100, 50)},
      {OVERLAY_TRANSFORM_ROTATE_180, Rect(40, 90, 50, 100)},
      {OVERLAY_TRANSFORM_ROTATE_270, Rect(10, 40, 100, 50)},
  };

  for (const auto& test_case : test_cases) {
    SCOPED_TRACE(test_case.overlay_transform);

    auto transform = OverlayTransformToTransform(test_case.overlay_transform,
                                                 gfx::SizeF(viewport_bounds));
    EXPECT_EQ(test_case.transformed,
              cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
                  transform, original));

    auto transformed_viewport_size =
        cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
            transform, gfx::Rect(viewport_bounds))
            .size();
    auto inverse_transform = OverlayTransformToTransform(
        InvertOverlayTransform(test_case.overlay_transform),
        gfx::SizeF(transformed_viewport_size));
    EXPECT_EQ(original, cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
                            inverse_transform, test_case.transformed));
  }
}

}  // namespace
}  // namespace gfx
