123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- // Copyright 2020 The Chromium 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 "ui/gfx/geometry/resize_utils.h"
- #include <string>
- #include "base/strings/strcat.h"
- #include "base/strings/string_number_conversions.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "ui/gfx/geometry/rect.h"
- #include "ui/gfx/geometry/size.h"
- namespace gfx {
- namespace {
- // Aspect ratio is defined by width / height.
- constexpr float kAspectRatioSquare = 1.0f;
- constexpr float kAspectRatioHorizontal = 2.0f;
- constexpr float kAspectRatioVertical = 0.5f;
- constexpr Size kMinSizeHorizontal(20, 10);
- constexpr Size kMaxSizeHorizontal(50, 25);
- constexpr Size kMinSizeVertical(10, 20);
- constexpr Size kMaxSizeVertical(25, 50);
- std::string HitTestToString(ResizeEdge resize_edge) {
- switch (resize_edge) {
- case ResizeEdge::kTop:
- return "top";
- case ResizeEdge::kTopRight:
- return "top-righ";
- case ResizeEdge::kRight:
- return "right";
- case ResizeEdge::kBottomRight:
- return "bottom-right";
- case ResizeEdge::kBottom:
- return "bottom";
- case ResizeEdge::kBottomLeft:
- return "bottom-left";
- case ResizeEdge::kLeft:
- return "left";
- case ResizeEdge::kTopLeft:
- return "top-left";
- }
- }
- } // namespace
- struct SizingParams {
- ResizeEdge resize_edge{};
- float aspect_ratio = 0.0f;
- Size min_size;
- absl::optional<Size> max_size;
- Rect input_rect;
- Rect expected_output_rect;
- std::string ToString() const {
- return base::StrCat(
- {HitTestToString(resize_edge), " ratio=",
- base::NumberToString(aspect_ratio), " [", min_size.ToString(), "..",
- max_size.has_value() ? max_size->ToString() : "nullopt", "] ",
- input_rect.ToString(), " -> ", expected_output_rect.ToString()});
- }
- };
- using ResizeUtilsTest = testing::TestWithParam<SizingParams>;
- TEST_P(ResizeUtilsTest, SizeRectToAspectRatio) {
- Rect rect = GetParam().input_rect;
- SizeRectToAspectRatio(GetParam().resize_edge, GetParam().aspect_ratio,
- GetParam().min_size, GetParam().max_size, &rect);
- EXPECT_EQ(rect, GetParam().expected_output_rect) << GetParam().ToString();
- }
- const SizingParams kSizeRectToSquareAspectRatioTestCases[] = {
- // Dragging the top resizer up.
- {ResizeEdge::kTop, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(100, 98, 22, 24), Rect(100, 98, 24, 24)},
- // Dragging the bottom resizer down.
- {ResizeEdge::kBottom, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(100, 100, 22, 24), Rect(100, 100, 24, 24)},
- // Dragging the left resizer right.
- {ResizeEdge::kLeft, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(102, 100, 22, 24), Rect(102, 102, 22, 22)},
- // Dragging the right resizer left.
- {ResizeEdge::kRight, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(100, 100, 22, 24), Rect(100, 100, 22, 22)},
- // Dragging the top-left resizer right.
- {ResizeEdge::kTopLeft, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(102, 100, 22, 24), Rect(102, 102, 22, 22)},
- // Dragging the top-right resizer down.
- {ResizeEdge::kTopRight, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(100, 102, 24, 22), Rect(100, 102, 22, 22)},
- // Dragging the bottom-left resizer right.
- {ResizeEdge::kBottomLeft, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(100, 102, 22, 24), Rect(100, 102, 22, 22)},
- // Dragging the bottom-right resizer up.
- {ResizeEdge::kBottomRight, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(100, 100, 24, 22), Rect(100, 100, 22, 22)},
- // Dragging the bottom-right resizer left.
- // Rect already as small as `kMinSizeHorizontal` allows.
- {ResizeEdge::kBottomRight, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal,
- Rect(100, 100, kMinSizeHorizontal.width(), kMinSizeHorizontal.width()),
- Rect(100, 100, kMinSizeHorizontal.width(), kMinSizeHorizontal.width())},
- // Dragging the top-left resizer left.
- // Rect already as large as `kMaxSizeHorizontal` allows.
- {ResizeEdge::kTopLeft, kAspectRatioSquare, kMinSizeHorizontal,
- kMaxSizeHorizontal,
- Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height()),
- Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height())},
- // Dragging the top-left resizer left.
- // No max size specified.
- {ResizeEdge::kTopLeft, kAspectRatioSquare, kMinSizeHorizontal,
- absl::nullopt, Rect(102, 100, 22, 24), Rect(102, 102, 22, 22)},
- };
- const SizingParams kSizeRectToHorizontalAspectRatioTestCases[] = {
- // Dragging the top resizer down.
- {ResizeEdge::kTop, kAspectRatioHorizontal, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(100, 102, 48, 22), Rect(100, 102, 44, 22)},
- // Dragging the left resizer left.
- {ResizeEdge::kLeft, kAspectRatioHorizontal, kMinSizeHorizontal,
- kMaxSizeHorizontal, Rect(96, 100, 48, 22), Rect(96, 98, 48, 24)},
- // Rect already as small as `kMinSizeHorizontal` allows.
- {ResizeEdge::kTop, kAspectRatioHorizontal, kMinSizeHorizontal,
- kMaxSizeHorizontal,
- Rect(100, 100, kMinSizeHorizontal.width(), kMinSizeHorizontal.height()),
- Rect(100, 100, kMinSizeHorizontal.width(), kMinSizeHorizontal.height())},
- // Rect already as large as `kMaxSizeHorizontal` allows.
- {ResizeEdge::kTop, kAspectRatioHorizontal, kMinSizeHorizontal,
- kMaxSizeHorizontal,
- Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height()),
- Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height())},
- // Dragging the left resizer left.
- // No max size specified.
- {ResizeEdge::kLeft, kAspectRatioHorizontal, kMinSizeHorizontal,
- absl::nullopt, Rect(96, 100, 48, 22), Rect(96, 98, 48, 24)},
- };
- const SizingParams kSizeRectToVerticalAspectRatioTestCases[] = {
- // Dragging the bottom resizer up.
- {ResizeEdge::kBottom, kAspectRatioVertical, kMinSizeVertical,
- kMaxSizeVertical, Rect(100, 100, 24, 44), Rect(100, 100, 22, 44)},
- // Dragging the right resizer right.
- {ResizeEdge::kRight, kAspectRatioVertical, kMinSizeVertical,
- kMaxSizeVertical, Rect(100, 100, 24, 44), Rect(100, 100, 24, 48)},
- // Rect already as small as `kMinSizeVertical` allows.
- {ResizeEdge::kTop, kAspectRatioVertical, kMinSizeVertical, kMaxSizeVertical,
- Rect(100, 100, kMinSizeVertical.width(), kMinSizeVertical.height()),
- Rect(100, 100, kMinSizeVertical.width(), kMinSizeVertical.height())},
- // Rect already as large as `kMaxSizeVertical` allows.
- {ResizeEdge::kTop, kAspectRatioVertical, kMinSizeVertical, kMaxSizeVertical,
- Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height()),
- Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height())},
- // Dragging the right resizer right.
- // No max size specified.
- {ResizeEdge::kRight, kAspectRatioVertical, kMinSizeVertical, absl::nullopt,
- Rect(100, 100, 24, 44), Rect(100, 100, 24, 48)},
- };
- INSTANTIATE_TEST_SUITE_P(
- Square,
- ResizeUtilsTest,
- testing::ValuesIn(kSizeRectToSquareAspectRatioTestCases));
- INSTANTIATE_TEST_SUITE_P(
- Horizontal,
- ResizeUtilsTest,
- testing::ValuesIn(kSizeRectToHorizontalAspectRatioTestCases));
- INSTANTIATE_TEST_SUITE_P(
- Vertical,
- ResizeUtilsTest,
- testing::ValuesIn(kSizeRectToVerticalAspectRatioTestCases));
- } // namespace gfx
|