OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2006-2008 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 |
| 5 #include "ui/gfx/interpolated_transform.h" |
| 6 |
| 7 #include "base/basictypes.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 |
| 10 namespace { |
| 11 |
| 12 const static float EPSILON = 1e-6; |
| 13 |
| 14 bool ApproximatelyEqual(float lhs, float rhs) { |
| 15 if (lhs == 0) |
| 16 return fabs(rhs) < EPSILON; |
| 17 if (rhs == 0) |
| 18 return fabs(lhs) < EPSILON; |
| 19 return fabs(lhs - rhs) / std::max(fabs(rhs), fabs(lhs)) < EPSILON; |
| 20 } |
| 21 |
| 22 bool ApproximatelyEqual(const ui::Transform& lhs, const ui::Transform& rhs) { |
| 23 for (int i = 0; i < 9; ++i) { |
| 24 if (!ApproximatelyEqual(lhs.matrix()[i], rhs.matrix()[i])) |
| 25 return false; |
| 26 } |
| 27 return true; |
| 28 } |
| 29 |
| 30 } // namespace |
| 31 |
| 32 TEST(InterpolatedTransformTest, InterpolatedRotation) { |
| 33 ui::InterpolatedRotation interpolated_rotation(0, 100); |
| 34 ui::InterpolatedRotation interpolated_rotation_diff_start_end( |
| 35 0, 100, 100, 200); |
| 36 |
| 37 for (int i = 0; i <= 100; ++i) { |
| 38 ui::Transform rotation; |
| 39 rotation.SetRotate(i); |
| 40 ui::Transform interpolated = interpolated_rotation.Interpolate(i / 100.0f); |
| 41 EXPECT_TRUE(ApproximatelyEqual(rotation, interpolated)); |
| 42 interpolated = interpolated_rotation_diff_start_end.Interpolate(i + 100); |
| 43 EXPECT_TRUE(ApproximatelyEqual(rotation, interpolated)); |
| 44 } |
| 45 } |
| 46 |
| 47 TEST(InterpolatedTransformTest, InterpolatedScale) { |
| 48 ui::InterpolatedScale interpolated_scale(0, 100); |
| 49 ui::InterpolatedScale interpolated_scale_diff_start_end( |
| 50 0, 100, 100, 200); |
| 51 |
| 52 for (int i = 0; i <= 100; ++i) { |
| 53 ui::Transform scale; |
| 54 scale.SetScale(i, i); |
| 55 ui::Transform interpolated = interpolated_scale.Interpolate(i / 100.0f); |
| 56 EXPECT_TRUE(ApproximatelyEqual(scale, interpolated)); |
| 57 interpolated = interpolated_scale_diff_start_end.Interpolate(i + 100); |
| 58 EXPECT_TRUE(ApproximatelyEqual(scale, interpolated)); |
| 59 } |
| 60 } |
| 61 |
| 62 TEST(InterpolatedTransformTest, InterpolatedTranslate) { |
| 63 ui::InterpolatedTranslation interpolated_xform(gfx::Point(0, 0), |
| 64 gfx::Point(100, 100)); |
| 65 |
| 66 ui::InterpolatedTranslation interpolated_xform_diff_start_end( |
| 67 gfx::Point(0, 0), gfx::Point(100, 100), 100, 200); |
| 68 |
| 69 for (int i = 0; i <= 100; ++i) { |
| 70 ui::Transform xform; |
| 71 xform.SetTranslate(i, i); |
| 72 ui::Transform interpolated = interpolated_xform.Interpolate(i / 100.0f); |
| 73 EXPECT_TRUE(ApproximatelyEqual(xform, interpolated)); |
| 74 interpolated = interpolated_xform_diff_start_end.Interpolate(i + 100); |
| 75 EXPECT_TRUE(ApproximatelyEqual(xform, interpolated)); |
| 76 } |
| 77 } |
| 78 |
| 79 TEST(InterpolatedTransformTest, InterpolatedRotationAboutPivot) { |
| 80 gfx::Point pivot(100, 100); |
| 81 gfx::Point above_pivot(100, 200); |
| 82 ui::InterpolatedRotation rot(0, 90); |
| 83 ui::InterpolatedTransformAboutPivot interpolated_xform( |
| 84 pivot, |
| 85 new ui::InterpolatedRotation(0, 90)); |
| 86 ui::Transform result = interpolated_xform.Interpolate(0.0f); |
| 87 EXPECT_TRUE(ApproximatelyEqual(ui::Transform(), result)); |
| 88 result = interpolated_xform.Interpolate(1.0f); |
| 89 gfx::Point expected_result = pivot; |
| 90 EXPECT_TRUE(result.TransformPoint(&pivot)); |
| 91 EXPECT_EQ(expected_result, pivot); |
| 92 expected_result = gfx::Point(0, 100); |
| 93 EXPECT_TRUE(result.TransformPoint(&above_pivot)); |
| 94 EXPECT_EQ(expected_result, above_pivot); |
| 95 } |
| 96 |
| 97 TEST(InterpolatedTransformTest, InterpolatedScaleAboutPivot) { |
| 98 gfx::Point pivot(100, 100); |
| 99 gfx::Point above_pivot(100, 200); |
| 100 ui::InterpolatedTransformAboutPivot interpolated_xform( |
| 101 pivot, |
| 102 new ui::InterpolatedScale(1, 2)); |
| 103 ui::Transform result = interpolated_xform.Interpolate(0.0f); |
| 104 EXPECT_TRUE(ApproximatelyEqual(ui::Transform(), result)); |
| 105 result = interpolated_xform.Interpolate(1.0f); |
| 106 gfx::Point expected_result = pivot; |
| 107 EXPECT_TRUE(result.TransformPoint(&pivot)); |
| 108 EXPECT_EQ(expected_result, pivot); |
| 109 expected_result = gfx::Point(100, 300); |
| 110 EXPECT_TRUE(result.TransformPoint(&above_pivot)); |
| 111 EXPECT_EQ(expected_result, above_pivot); |
| 112 } |
OLD | NEW |