1 // Copyright 2013 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.
5 #include "ui/gfx/animation/tween.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "ui/gfx/test/gfx_util.h"
19 double next_double(double d
) {
21 return _nextafter(d
, d
+ 1);
23 // Step two units of least precision towards positive infinity. On some 32
24 // bit x86 compilers a single step was not enough due to loss of precision in
26 return nextafter(nextafter(d
, d
+ 1), d
+ 1);
30 // Validates that the same interpolations are made as in Blink.
31 TEST(TweenTest
, ColorValueBetween
) {
32 // From blink's AnimatableColorTest.
33 EXPECT_SKCOLOR_EQ(0xFF00FF00,
34 Tween::ColorValueBetween(-10.0, 0xFF00FF00, 0xFF00FF00));
35 EXPECT_SKCOLOR_EQ(0xFF00FF00,
36 Tween::ColorValueBetween(-10.0, 0xFF00FF00, 0xFFFF00FF));
37 EXPECT_SKCOLOR_EQ(0xFF00FF00,
38 Tween::ColorValueBetween(0.0, 0xFF00FF00, 0xFFFF00FF));
39 EXPECT_SKCOLOR_EQ(0xFF01FE01,
40 Tween::ColorValueBetween(1.0 / 255, 0xFF00FF00, 0xFFFF00FF));
41 EXPECT_SKCOLOR_EQ(0xFF808080,
42 Tween::ColorValueBetween(0.5, 0xFF00FF00, 0xFFFF00FF));
45 Tween::ColorValueBetween(254.0 / 255.0, 0xFF00FF00, 0xFFFF00FF));
46 EXPECT_SKCOLOR_EQ(0xFFFF00FF,
47 Tween::ColorValueBetween(1.0, 0xFF00FF00, 0xFFFF00FF));
48 EXPECT_SKCOLOR_EQ(0xFFFF00FF,
49 Tween::ColorValueBetween(10.0, 0xFF00FF00, 0xFFFF00FF));
50 EXPECT_SKCOLOR_EQ(0xFF0C253E,
51 Tween::ColorValueBetween(3.0 / 16.0, 0xFF001020, 0xFF4080C0));
52 EXPECT_SKCOLOR_EQ(0x80FF00FF,
53 Tween::ColorValueBetween(0.5, 0x0000FF00, 0xFFFF00FF));
54 EXPECT_SKCOLOR_EQ(0x60AA55AA,
55 Tween::ColorValueBetween(0.5, 0x4000FF00, 0x80FF00FF));
56 EXPECT_SKCOLOR_EQ(0x60FFAAFF,
57 Tween::ColorValueBetween(0.5, 0x40FF00FF, 0x80FFFFFF));
58 EXPECT_SKCOLOR_EQ(0x103060A0,
59 Tween::ColorValueBetween(0.5, 0x10204080, 0x104080C0));
62 // Ensures that each of the 3 integers in [0, 1, 2] ae selected with equal
64 TEST(TweenTest
, IntValueBetween
) {
65 EXPECT_EQ(0, Tween::IntValueBetween(0.0, 0, 2));
66 EXPECT_EQ(0, Tween::IntValueBetween(0.5 / 3.0, 0, 2));
67 EXPECT_EQ(0, Tween::IntValueBetween(1.0 / 3.0, 0, 2));
69 EXPECT_EQ(1, Tween::IntValueBetween(next_double(1.0 / 3.0), 0, 2));
70 EXPECT_EQ(1, Tween::IntValueBetween(1.5 / 3.0, 0, 2));
71 EXPECT_EQ(1, Tween::IntValueBetween(2.0 / 3.0, 0, 2));
73 EXPECT_EQ(2, Tween::IntValueBetween(next_double(2.0 / 3.0), 0, 2));
74 EXPECT_EQ(2, Tween::IntValueBetween(2.5 / 3.0, 0, 2));
75 EXPECT_EQ(2, Tween::IntValueBetween(3.0 / 3.0, 0, 2));
78 TEST(TweenTest
, IntValueBetweenNegative
) {
79 EXPECT_EQ(-2, Tween::IntValueBetween(0.0, -2, 0));
80 EXPECT_EQ(-2, Tween::IntValueBetween(0.5 / 3.0, -2, 0));
81 EXPECT_EQ(-2, Tween::IntValueBetween(1.0 / 3.0, -2, 0));
83 EXPECT_EQ(-1, Tween::IntValueBetween(next_double(1.0 / 3.0), -2, 0));
84 EXPECT_EQ(-1, Tween::IntValueBetween(1.5 / 3.0, -2, 0));
85 EXPECT_EQ(-1, Tween::IntValueBetween(2.0 / 3.0, -2, 0));
87 EXPECT_EQ(0, Tween::IntValueBetween(next_double(2.0 / 3.0), -2, 0));
88 EXPECT_EQ(0, Tween::IntValueBetween(2.5 / 3.0, -2, 0));
89 EXPECT_EQ(0, Tween::IntValueBetween(3.0 / 3.0, -2, 0));
92 TEST(TweenTest
, IntValueBetweenReverse
) {
93 EXPECT_EQ(2, Tween::IntValueBetween(0.0, 2, 0));
94 EXPECT_EQ(2, Tween::IntValueBetween(0.5 / 3.0, 2, 0));
95 EXPECT_EQ(2, Tween::IntValueBetween(1.0 / 3.0, 2, 0));
97 EXPECT_EQ(1, Tween::IntValueBetween(next_double(1.0 / 3.0), 2, 0));
98 EXPECT_EQ(1, Tween::IntValueBetween(1.5 / 3.0, 2, 0));
99 EXPECT_EQ(1, Tween::IntValueBetween(2.0 / 3.0, 2, 0));
101 EXPECT_EQ(0, Tween::IntValueBetween(next_double(2.0 / 3.0), 2, 0));
102 EXPECT_EQ(0, Tween::IntValueBetween(2.5 / 3.0, 2, 0));
103 EXPECT_EQ(0, Tween::IntValueBetween(3.0 / 3.0, 2, 0));
106 TEST(TweenTest
, LinearIntValueBetween
) {
107 EXPECT_EQ(0, Tween::LinearIntValueBetween(0.0, 0, 2));
108 EXPECT_EQ(0, Tween::LinearIntValueBetween(0.5 / 4.0, 0, 2));
109 EXPECT_EQ(0, Tween::LinearIntValueBetween(0.99 / 4.0, 0, 2));
111 EXPECT_EQ(1, Tween::LinearIntValueBetween(1.0 / 4.0, 0, 2));
112 EXPECT_EQ(1, Tween::LinearIntValueBetween(1.5 / 4.0, 0, 2));
113 EXPECT_EQ(1, Tween::LinearIntValueBetween(2.0 / 4.0, 0, 2));
114 EXPECT_EQ(1, Tween::LinearIntValueBetween(2.5 / 4.0, 0, 2));
115 EXPECT_EQ(1, Tween::LinearIntValueBetween(2.99 / 4.0, 0, 2));
117 EXPECT_EQ(2, Tween::LinearIntValueBetween(3.0 / 4.0, 0, 2));
118 EXPECT_EQ(2, Tween::LinearIntValueBetween(3.5 / 4.0, 0, 2));
119 EXPECT_EQ(2, Tween::LinearIntValueBetween(4.0 / 4.0, 0, 2));
122 TEST(TweenTest
, LinearIntValueBetweenNegative
) {
123 EXPECT_EQ(-2, Tween::LinearIntValueBetween(0.0, -2, 0));
124 EXPECT_EQ(-2, Tween::LinearIntValueBetween(0.5 / 4.0, -2, 0));
125 EXPECT_EQ(-2, Tween::LinearIntValueBetween(0.99 / 4.0, -2, 0));
127 EXPECT_EQ(-1, Tween::LinearIntValueBetween(1.0 / 4.0, -2, 0));
128 EXPECT_EQ(-1, Tween::LinearIntValueBetween(1.5 / 4.0, -2, 0));
129 EXPECT_EQ(-1, Tween::LinearIntValueBetween(2.0 / 4.0, -2, 0));
130 EXPECT_EQ(-1, Tween::LinearIntValueBetween(2.5 / 4.0, -2, 0));
131 EXPECT_EQ(-1, Tween::LinearIntValueBetween(2.99 / 4.0, -2, 0));
133 EXPECT_EQ(0, Tween::LinearIntValueBetween(3.0 / 4.0, -2, 0));
134 EXPECT_EQ(0, Tween::LinearIntValueBetween(3.5 / 4.0, -2, 0));
135 EXPECT_EQ(0, Tween::LinearIntValueBetween(4.0 / 4.0, -2, 0));