resize_utils_unittest.cc 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/gfx/geometry/resize_utils.h"
  5. #include <string>
  6. #include "base/strings/strcat.h"
  7. #include "base/strings/string_number_conversions.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. #include "ui/gfx/geometry/rect.h"
  10. #include "ui/gfx/geometry/size.h"
  11. namespace gfx {
  12. namespace {
  13. // Aspect ratio is defined by width / height.
  14. constexpr float kAspectRatioSquare = 1.0f;
  15. constexpr float kAspectRatioHorizontal = 2.0f;
  16. constexpr float kAspectRatioVertical = 0.5f;
  17. constexpr Size kMinSizeHorizontal(20, 10);
  18. constexpr Size kMaxSizeHorizontal(50, 25);
  19. constexpr Size kMinSizeVertical(10, 20);
  20. constexpr Size kMaxSizeVertical(25, 50);
  21. std::string HitTestToString(ResizeEdge resize_edge) {
  22. switch (resize_edge) {
  23. case ResizeEdge::kTop:
  24. return "top";
  25. case ResizeEdge::kTopRight:
  26. return "top-righ";
  27. case ResizeEdge::kRight:
  28. return "right";
  29. case ResizeEdge::kBottomRight:
  30. return "bottom-right";
  31. case ResizeEdge::kBottom:
  32. return "bottom";
  33. case ResizeEdge::kBottomLeft:
  34. return "bottom-left";
  35. case ResizeEdge::kLeft:
  36. return "left";
  37. case ResizeEdge::kTopLeft:
  38. return "top-left";
  39. }
  40. }
  41. } // namespace
  42. struct SizingParams {
  43. ResizeEdge resize_edge{};
  44. float aspect_ratio = 0.0f;
  45. Size min_size;
  46. absl::optional<Size> max_size;
  47. Rect input_rect;
  48. Rect expected_output_rect;
  49. std::string ToString() const {
  50. return base::StrCat(
  51. {HitTestToString(resize_edge), " ratio=",
  52. base::NumberToString(aspect_ratio), " [", min_size.ToString(), "..",
  53. max_size.has_value() ? max_size->ToString() : "nullopt", "] ",
  54. input_rect.ToString(), " -> ", expected_output_rect.ToString()});
  55. }
  56. };
  57. using ResizeUtilsTest = testing::TestWithParam<SizingParams>;
  58. TEST_P(ResizeUtilsTest, SizeRectToAspectRatio) {
  59. Rect rect = GetParam().input_rect;
  60. SizeRectToAspectRatio(GetParam().resize_edge, GetParam().aspect_ratio,
  61. GetParam().min_size, GetParam().max_size, &rect);
  62. EXPECT_EQ(rect, GetParam().expected_output_rect) << GetParam().ToString();
  63. }
  64. const SizingParams kSizeRectToSquareAspectRatioTestCases[] = {
  65. // Dragging the top resizer up.
  66. {ResizeEdge::kTop, kAspectRatioSquare, kMinSizeHorizontal,
  67. kMaxSizeHorizontal, Rect(100, 98, 22, 24), Rect(100, 98, 24, 24)},
  68. // Dragging the bottom resizer down.
  69. {ResizeEdge::kBottom, kAspectRatioSquare, kMinSizeHorizontal,
  70. kMaxSizeHorizontal, Rect(100, 100, 22, 24), Rect(100, 100, 24, 24)},
  71. // Dragging the left resizer right.
  72. {ResizeEdge::kLeft, kAspectRatioSquare, kMinSizeHorizontal,
  73. kMaxSizeHorizontal, Rect(102, 100, 22, 24), Rect(102, 102, 22, 22)},
  74. // Dragging the right resizer left.
  75. {ResizeEdge::kRight, kAspectRatioSquare, kMinSizeHorizontal,
  76. kMaxSizeHorizontal, Rect(100, 100, 22, 24), Rect(100, 100, 22, 22)},
  77. // Dragging the top-left resizer right.
  78. {ResizeEdge::kTopLeft, kAspectRatioSquare, kMinSizeHorizontal,
  79. kMaxSizeHorizontal, Rect(102, 100, 22, 24), Rect(102, 102, 22, 22)},
  80. // Dragging the top-right resizer down.
  81. {ResizeEdge::kTopRight, kAspectRatioSquare, kMinSizeHorizontal,
  82. kMaxSizeHorizontal, Rect(100, 102, 24, 22), Rect(100, 102, 22, 22)},
  83. // Dragging the bottom-left resizer right.
  84. {ResizeEdge::kBottomLeft, kAspectRatioSquare, kMinSizeHorizontal,
  85. kMaxSizeHorizontal, Rect(100, 102, 22, 24), Rect(100, 102, 22, 22)},
  86. // Dragging the bottom-right resizer up.
  87. {ResizeEdge::kBottomRight, kAspectRatioSquare, kMinSizeHorizontal,
  88. kMaxSizeHorizontal, Rect(100, 100, 24, 22), Rect(100, 100, 22, 22)},
  89. // Dragging the bottom-right resizer left.
  90. // Rect already as small as `kMinSizeHorizontal` allows.
  91. {ResizeEdge::kBottomRight, kAspectRatioSquare, kMinSizeHorizontal,
  92. kMaxSizeHorizontal,
  93. Rect(100, 100, kMinSizeHorizontal.width(), kMinSizeHorizontal.width()),
  94. Rect(100, 100, kMinSizeHorizontal.width(), kMinSizeHorizontal.width())},
  95. // Dragging the top-left resizer left.
  96. // Rect already as large as `kMaxSizeHorizontal` allows.
  97. {ResizeEdge::kTopLeft, kAspectRatioSquare, kMinSizeHorizontal,
  98. kMaxSizeHorizontal,
  99. Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height()),
  100. Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height())},
  101. // Dragging the top-left resizer left.
  102. // No max size specified.
  103. {ResizeEdge::kTopLeft, kAspectRatioSquare, kMinSizeHorizontal,
  104. absl::nullopt, Rect(102, 100, 22, 24), Rect(102, 102, 22, 22)},
  105. };
  106. const SizingParams kSizeRectToHorizontalAspectRatioTestCases[] = {
  107. // Dragging the top resizer down.
  108. {ResizeEdge::kTop, kAspectRatioHorizontal, kMinSizeHorizontal,
  109. kMaxSizeHorizontal, Rect(100, 102, 48, 22), Rect(100, 102, 44, 22)},
  110. // Dragging the left resizer left.
  111. {ResizeEdge::kLeft, kAspectRatioHorizontal, kMinSizeHorizontal,
  112. kMaxSizeHorizontal, Rect(96, 100, 48, 22), Rect(96, 98, 48, 24)},
  113. // Rect already as small as `kMinSizeHorizontal` allows.
  114. {ResizeEdge::kTop, kAspectRatioHorizontal, kMinSizeHorizontal,
  115. kMaxSizeHorizontal,
  116. Rect(100, 100, kMinSizeHorizontal.width(), kMinSizeHorizontal.height()),
  117. Rect(100, 100, kMinSizeHorizontal.width(), kMinSizeHorizontal.height())},
  118. // Rect already as large as `kMaxSizeHorizontal` allows.
  119. {ResizeEdge::kTop, kAspectRatioHorizontal, kMinSizeHorizontal,
  120. kMaxSizeHorizontal,
  121. Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height()),
  122. Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height())},
  123. // Dragging the left resizer left.
  124. // No max size specified.
  125. {ResizeEdge::kLeft, kAspectRatioHorizontal, kMinSizeHorizontal,
  126. absl::nullopt, Rect(96, 100, 48, 22), Rect(96, 98, 48, 24)},
  127. };
  128. const SizingParams kSizeRectToVerticalAspectRatioTestCases[] = {
  129. // Dragging the bottom resizer up.
  130. {ResizeEdge::kBottom, kAspectRatioVertical, kMinSizeVertical,
  131. kMaxSizeVertical, Rect(100, 100, 24, 44), Rect(100, 100, 22, 44)},
  132. // Dragging the right resizer right.
  133. {ResizeEdge::kRight, kAspectRatioVertical, kMinSizeVertical,
  134. kMaxSizeVertical, Rect(100, 100, 24, 44), Rect(100, 100, 24, 48)},
  135. // Rect already as small as `kMinSizeVertical` allows.
  136. {ResizeEdge::kTop, kAspectRatioVertical, kMinSizeVertical, kMaxSizeVertical,
  137. Rect(100, 100, kMinSizeVertical.width(), kMinSizeVertical.height()),
  138. Rect(100, 100, kMinSizeVertical.width(), kMinSizeVertical.height())},
  139. // Rect already as large as `kMaxSizeVertical` allows.
  140. {ResizeEdge::kTop, kAspectRatioVertical, kMinSizeVertical, kMaxSizeVertical,
  141. Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height()),
  142. Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height())},
  143. // Dragging the right resizer right.
  144. // No max size specified.
  145. {ResizeEdge::kRight, kAspectRatioVertical, kMinSizeVertical, absl::nullopt,
  146. Rect(100, 100, 24, 44), Rect(100, 100, 24, 48)},
  147. };
  148. INSTANTIATE_TEST_SUITE_P(
  149. Square,
  150. ResizeUtilsTest,
  151. testing::ValuesIn(kSizeRectToSquareAspectRatioTestCases));
  152. INSTANTIATE_TEST_SUITE_P(
  153. Horizontal,
  154. ResizeUtilsTest,
  155. testing::ValuesIn(kSizeRectToHorizontalAspectRatioTestCases));
  156. INSTANTIATE_TEST_SUITE_P(
  157. Vertical,
  158. ResizeUtilsTest,
  159. testing::ValuesIn(kSizeRectToVerticalAspectRatioTestCases));
  160. } // namespace gfx