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