1 // Copyright 2012 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 "cc/animation/animation.h" 6 7 #include "cc/test/animation_test_common.h" 8 #include "testing/gmock/include/gmock/gmock.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 11 namespace cc { 12 namespace { 13 14 using base::TimeDelta; 15 16 static base::TimeTicks TicksFromSecondsF(double seconds) { 17 return base::TimeTicks::FromInternalValue(seconds * 18 base::Time::kMicrosecondsPerSecond); 19 } 20 21 scoped_ptr<Animation> CreateAnimation(int iterations, double duration) { 22 scoped_ptr<Animation> to_return(Animation::Create( 23 make_scoped_ptr( 24 new FakeFloatAnimationCurve(duration)).PassAs<AnimationCurve>(), 25 0, 26 1, 27 Animation::Opacity)); 28 to_return->set_iterations(iterations); 29 return to_return.Pass(); 30 } 31 32 scoped_ptr<Animation> CreateAnimation(int iterations) { 33 return CreateAnimation(iterations, 1); 34 } 35 36 TEST(AnimationTest, TrimTimeZeroIterations) { 37 scoped_ptr<Animation> anim(CreateAnimation(0)); 38 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))); 39 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 40 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 41 } 42 43 TEST(AnimationTest, TrimTimeOneIteration) { 44 scoped_ptr<Animation> anim(CreateAnimation(1)); 45 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))); 46 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 47 EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 48 EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))); 49 } 50 51 TEST(AnimationTest, TrimTimeInfiniteIterations) { 52 scoped_ptr<Animation> anim(CreateAnimation(-1)); 53 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 54 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 55 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 56 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))); 57 } 58 59 TEST(AnimationTest, TrimTimeReverse) { 60 scoped_ptr<Animation> anim(CreateAnimation(-1)); 61 anim->set_direction(Animation::Reverse); 62 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0))); 63 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))); 64 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 65 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))); 66 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 67 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))); 68 } 69 70 TEST(AnimationTest, TrimTimeAlternateInfiniteIterations) { 71 scoped_ptr<Animation> anim(CreateAnimation(-1)); 72 anim->set_direction(Animation::Alternate); 73 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 74 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))); 75 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 76 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))); 77 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 78 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))); 79 } 80 81 TEST(AnimationTest, TrimTimeAlternateOneIteration) { 82 scoped_ptr<Animation> anim(CreateAnimation(1)); 83 anim->set_direction(Animation::Alternate); 84 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 85 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))); 86 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 87 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))); 88 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 89 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))); 90 } 91 92 TEST(AnimationTest, TrimTimeAlternateTwoIterations) { 93 scoped_ptr<Animation> anim(CreateAnimation(2)); 94 anim->set_direction(Animation::Alternate); 95 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 96 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))); 97 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 98 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))); 99 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 100 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))); 101 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))); 102 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))); 103 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))); 104 } 105 106 TEST(AnimationTest, TrimTimeAlternateReverseInfiniteIterations) { 107 scoped_ptr<Animation> anim(CreateAnimation(-1)); 108 anim->set_direction(Animation::AlternateReverse); 109 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 110 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))); 111 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 112 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))); 113 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 114 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))); 115 } 116 117 TEST(AnimationTest, TrimTimeAlternateReverseOneIteration) { 118 scoped_ptr<Animation> anim(CreateAnimation(1)); 119 anim->set_direction(Animation::AlternateReverse); 120 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 121 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))); 122 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 123 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))); 124 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 125 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))); 126 } 127 128 TEST(AnimationTest, TrimTimeAlternateReverseTwoIterations) { 129 scoped_ptr<Animation> anim(CreateAnimation(2)); 130 anim->set_direction(Animation::AlternateReverse); 131 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 132 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))); 133 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 134 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))); 135 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 136 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))); 137 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))); 138 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))); 139 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))); 140 } 141 142 TEST(AnimationTest, TrimTimeStartTime) { 143 scoped_ptr<Animation> anim(CreateAnimation(1)); 144 anim->set_start_time(TicksFromSecondsF(4)); 145 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 146 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))); 147 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))); 148 EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0))); 149 EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0))); 150 } 151 152 TEST(AnimationTest, TrimTimeStartTimeReverse) { 153 scoped_ptr<Animation> anim(CreateAnimation(1)); 154 anim->set_start_time(TicksFromSecondsF(4)); 155 anim->set_direction(Animation::Reverse); 156 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 157 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))); 158 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))); 159 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0))); 160 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0))); 161 } 162 163 TEST(AnimationTest, TrimTimeTimeOffset) { 164 scoped_ptr<Animation> anim(CreateAnimation(1)); 165 anim->set_time_offset(TimeDelta::FromMilliseconds(4000)); 166 anim->set_start_time(TicksFromSecondsF(4)); 167 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 168 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 169 EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 170 EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 171 } 172 173 TEST(AnimationTest, TrimTimeTimeOffsetReverse) { 174 scoped_ptr<Animation> anim(CreateAnimation(1)); 175 anim->set_time_offset(TimeDelta::FromMilliseconds(4000)); 176 anim->set_start_time(TicksFromSecondsF(4)); 177 anim->set_direction(Animation::Reverse); 178 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 179 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 180 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 181 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 182 } 183 184 TEST(AnimationTest, TrimTimeNegativeTimeOffset) { 185 scoped_ptr<Animation> anim(CreateAnimation(1)); 186 anim->set_time_offset(TimeDelta::FromMilliseconds(-4000)); 187 188 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 189 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))); 190 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))); 191 EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0))); 192 } 193 194 TEST(AnimationTest, TrimTimeNegativeTimeOffsetReverse) { 195 scoped_ptr<Animation> anim(CreateAnimation(1)); 196 anim->set_time_offset(TimeDelta::FromMilliseconds(-4000)); 197 anim->set_direction(Animation::Reverse); 198 199 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 200 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))); 201 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))); 202 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0))); 203 } 204 205 TEST(AnimationTest, TrimTimePauseResume) { 206 scoped_ptr<Animation> anim(CreateAnimation(1)); 207 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 208 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 209 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 210 anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.5)); 211 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))); 212 anim->SetRunState(Animation::Running, TicksFromSecondsF(1024.0)); 213 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))); 214 EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5))); 215 } 216 217 TEST(AnimationTest, TrimTimePauseResumeReverse) { 218 scoped_ptr<Animation> anim(CreateAnimation(1)); 219 anim->set_direction(Animation::Reverse); 220 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 221 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 222 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 223 anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.25)); 224 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))); 225 anim->SetRunState(Animation::Running, TicksFromSecondsF(1024.0)); 226 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))); 227 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.75))); 228 } 229 230 TEST(AnimationTest, TrimTimeSuspendResume) { 231 scoped_ptr<Animation> anim(CreateAnimation(1)); 232 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 233 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 234 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))); 235 anim->Suspend(TicksFromSecondsF(0.5)); 236 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))); 237 anim->Resume(TicksFromSecondsF(1024)); 238 EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))); 239 EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5))); 240 } 241 242 TEST(AnimationTest, TrimTimeSuspendResumeReverse) { 243 scoped_ptr<Animation> anim(CreateAnimation(1)); 244 anim->set_direction(Animation::Reverse); 245 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 246 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 247 EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))); 248 anim->Suspend(TicksFromSecondsF(0.75)); 249 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))); 250 anim->Resume(TicksFromSecondsF(1024)); 251 EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))); 252 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.25))); 253 } 254 255 TEST(AnimationTest, TrimTimeZeroDuration) { 256 scoped_ptr<Animation> anim(CreateAnimation(0, 0)); 257 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 258 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))); 259 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 260 EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 261 } 262 263 TEST(AnimationTest, TrimTimeStarting) { 264 scoped_ptr<Animation> anim(CreateAnimation(1, 5.0)); 265 anim->SetRunState(Animation::Starting, TicksFromSecondsF(0.0)); 266 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))); 267 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 268 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 269 anim->set_time_offset(TimeDelta::FromMilliseconds(2000)); 270 EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))); 271 EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 272 EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 273 anim->set_start_time(TicksFromSecondsF(1.0)); 274 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))); 275 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 276 EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 277 EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))); 278 } 279 280 TEST(AnimationTest, TrimTimeNeedsSynchronizedStartTime) { 281 scoped_ptr<Animation> anim(CreateAnimation(1, 5.0)); 282 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 283 anim->set_needs_synchronized_start_time(true); 284 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))); 285 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 286 EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 287 anim->set_time_offset(TimeDelta::FromMilliseconds(2000)); 288 EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))); 289 EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 290 EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 291 anim->set_start_time(TicksFromSecondsF(1.0)); 292 anim->set_needs_synchronized_start_time(false); 293 EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))); 294 EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))); 295 EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))); 296 } 297 298 TEST(AnimationTest, IsFinishedAtZeroIterations) { 299 scoped_ptr<Animation> anim(CreateAnimation(0)); 300 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 301 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0))); 302 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 303 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0))); 304 } 305 306 TEST(AnimationTest, IsFinishedAtOneIteration) { 307 scoped_ptr<Animation> anim(CreateAnimation(1)); 308 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 309 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0))); 310 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 311 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0))); 312 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.0))); 313 } 314 315 TEST(AnimationTest, IsFinishedAtInfiniteIterations) { 316 scoped_ptr<Animation> anim(CreateAnimation(-1)); 317 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 318 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 319 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.5))); 320 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.0))); 321 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.5))); 322 } 323 324 TEST(AnimationTest, IsFinishedNegativeTimeOffset) { 325 scoped_ptr<Animation> anim(CreateAnimation(1)); 326 anim->set_time_offset(TimeDelta::FromMilliseconds(-500)); 327 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 328 329 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0))); 330 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 331 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.5))); 332 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.0))); 333 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.5))); 334 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.0))); 335 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.5))); 336 } 337 338 TEST(AnimationTest, IsFinishedPositiveTimeOffset) { 339 scoped_ptr<Animation> anim(CreateAnimation(1)); 340 anim->set_time_offset(TimeDelta::FromMilliseconds(500)); 341 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 342 343 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0))); 344 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 345 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.5))); 346 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0))); 347 } 348 349 TEST(AnimationTest, IsFinishedAtNotRunning) { 350 scoped_ptr<Animation> anim(CreateAnimation(0)); 351 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 352 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 353 anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.0)); 354 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 355 anim->SetRunState(Animation::WaitingForTargetAvailability, 356 TicksFromSecondsF(0.0)); 357 EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 358 anim->SetRunState(Animation::Finished, TicksFromSecondsF(0.0)); 359 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 360 anim->SetRunState(Animation::Aborted, TicksFromSecondsF(0.0)); 361 EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0))); 362 } 363 364 TEST(AnimationTest, IsFinished) { 365 scoped_ptr<Animation> anim(CreateAnimation(1)); 366 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 367 EXPECT_FALSE(anim->is_finished()); 368 anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.0)); 369 EXPECT_FALSE(anim->is_finished()); 370 anim->SetRunState(Animation::WaitingForTargetAvailability, 371 TicksFromSecondsF(0.0)); 372 EXPECT_FALSE(anim->is_finished()); 373 anim->SetRunState(Animation::Finished, TicksFromSecondsF(0.0)); 374 EXPECT_TRUE(anim->is_finished()); 375 anim->SetRunState(Animation::Aborted, TicksFromSecondsF(0.0)); 376 EXPECT_TRUE(anim->is_finished()); 377 } 378 379 TEST(AnimationTest, IsFinishedNeedsSynchronizedStartTime) { 380 scoped_ptr<Animation> anim(CreateAnimation(1)); 381 anim->SetRunState(Animation::Running, TicksFromSecondsF(2.0)); 382 EXPECT_FALSE(anim->is_finished()); 383 anim->SetRunState(Animation::Paused, TicksFromSecondsF(2.0)); 384 EXPECT_FALSE(anim->is_finished()); 385 anim->SetRunState(Animation::WaitingForTargetAvailability, 386 TicksFromSecondsF(2.0)); 387 EXPECT_FALSE(anim->is_finished()); 388 anim->SetRunState(Animation::Finished, TicksFromSecondsF(0.0)); 389 EXPECT_TRUE(anim->is_finished()); 390 anim->SetRunState(Animation::Aborted, TicksFromSecondsF(0.0)); 391 EXPECT_TRUE(anim->is_finished()); 392 } 393 394 TEST(AnimationTest, RunStateChangesIgnoredWhileSuspended) { 395 scoped_ptr<Animation> anim(CreateAnimation(1)); 396 anim->Suspend(TicksFromSecondsF(0)); 397 EXPECT_EQ(Animation::Paused, anim->run_state()); 398 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 399 EXPECT_EQ(Animation::Paused, anim->run_state()); 400 anim->Resume(TicksFromSecondsF(0)); 401 anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0)); 402 EXPECT_EQ(Animation::Running, anim->run_state()); 403 } 404 405 } // namespace 406 } // namespace cc 407