[go: nahoru, domu]

Rename animation_unittest.cc to keyframe_model_unittest.cc

In patch https://chromium-review.googlesource.com/906830 we renamed cc
side animation related classes but it missed a test file listed in the
subject. It should be fixed prior to next renaming patch.

Bug: 807667
Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.android:android_optional_gpu_tests_rel
Change-Id: Ib8c86a9f28b12b6a298f5d284c7ceb7171db1958
Reviewed-on: https://chromium-review.googlesource.com/924172
Reviewed-by: Stephen McGruer <smcgruer@chromium.org>
Reviewed-by: Robert Flack <flackr@chromium.org>
Commit-Queue: Yi Gu <yigu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#537377}
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index cefc5a9..9d81997 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -704,8 +704,8 @@
     "animation/animation_host_unittest.cc",
     "animation/animation_player_unittest.cc",
     "animation/animation_timeline_unittest.cc",
-    "animation/animation_unittest.cc",
     "animation/element_animations_unittest.cc",
+    "animation/keyframe_model_unittest.cc",
     "animation/keyframed_animation_curve_unittest.cc",
     "animation/scroll_offset_animation_curve_unittest.cc",
     "animation/scroll_timeline_unittest.cc",
diff --git a/cc/animation/animation_unittest.cc b/cc/animation/animation_unittest.cc
deleted file mode 100644
index 5fdcb62..0000000
--- a/cc/animation/animation_unittest.cc
+++ /dev/null
@@ -1,1019 +0,0 @@
-// Copyright 2012 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 "cc/animation/keyframe_model.h"
-
-#include "base/memory/ptr_util.h"
-#include "base/strings/stringprintf.h"
-#include "cc/test/animation_test_common.h"
-#include "cc/trees/target_property.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace cc {
-namespace {
-
-using base::TimeDelta;
-
-static base::TimeTicks TicksFromSecondsF(double seconds) {
-  return base::TimeTicks() + base::TimeDelta::FromSecondsD(seconds);
-}
-
-std::unique_ptr<KeyframeModel> CreateAnimation(double iterations,
-                                               double duration,
-                                               double playback_rate) {
-  std::unique_ptr<KeyframeModel> to_return(
-      KeyframeModel::Create(std::make_unique<FakeFloatAnimationCurve>(duration),
-                            0, 1, TargetProperty::OPACITY));
-  to_return->set_iterations(iterations);
-  to_return->set_playback_rate(playback_rate);
-  return to_return;
-}
-
-std::unique_ptr<KeyframeModel> CreateAnimation(double iterations,
-                                               double duration) {
-  return CreateAnimation(iterations, duration, 1);
-}
-
-std::unique_ptr<KeyframeModel> CreateAnimation(double iterations) {
-  return CreateAnimation(iterations, 1, 1);
-}
-
-TEST(AnimationTest, TrimTimeZeroIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(0));
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeOneIteration) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeOneHalfIteration) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1.5));
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.9, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.9))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeInfiniteIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(-1));
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(-1));
-  anim->set_direction(KeyframeModel::Direction::REVERSE);
-  EXPECT_EQ(
-      1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)).InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                      .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                      .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateInfiniteIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(-1));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                      .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                      .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateOneIteration) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                      .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateTwoIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(2));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                      .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
-                      .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateTwoHalfIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(2.5));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                      .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
-                      .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.50))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.75))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateReverseInfiniteIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(-1));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                      .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                      .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateReverseOneIteration) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                      .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateReverseTwoIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(2));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                      .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                      .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
-                      .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeStartTime) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_start_time(TicksFromSecondsF(4));
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)).InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)).InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeStartTimeReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_start_time(TicksFromSecondsF(4));
-  anim->set_direction(KeyframeModel::Direction::REVERSE);
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeTimeOffset) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_time_offset(TimeDelta::FromMilliseconds(4000));
-  anim->set_start_time(TicksFromSecondsF(4));
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeTimeOffsetReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_time_offset(TimeDelta::FromMilliseconds(4000));
-  anim->set_start_time(TicksFromSecondsF(4));
-  anim->set_direction(KeyframeModel::Direction::REVERSE);
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeNegativeTimeOffset) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_time_offset(TimeDelta::FromMilliseconds(-4000));
-
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)).InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeNegativeTimeOffsetReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_time_offset(TimeDelta::FromMilliseconds(-4000));
-  anim->set_direction(KeyframeModel::Direction::REVERSE);
-
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePauseResume) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  anim->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(0.5));
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
-                     .InSecondsF());
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(1024.0));
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
-                     .InSecondsF());
-  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5))
-                   .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePauseResumeReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_direction(KeyframeModel::Direction::REVERSE);
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  anim->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(0.25));
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
-                      .InSecondsF());
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(1024.0));
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
-                      .InSecondsF());
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.75))
-                   .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeSuspendResume) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  anim->Suspend(TicksFromSecondsF(0.5));
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
-                     .InSecondsF());
-  anim->Resume(TicksFromSecondsF(1024));
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
-                     .InSecondsF());
-  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5))
-                   .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeSuspendResumeReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_direction(KeyframeModel::Direction::REVERSE);
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                      .InSecondsF());
-  anim->Suspend(TicksFromSecondsF(0.75));
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
-                      .InSecondsF());
-  anim->Resume(TicksFromSecondsF(1024));
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
-                      .InSecondsF());
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.25))
-                   .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeZeroDuration) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(0, 0));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeStarting) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 5.0));
-  anim->SetRunState(KeyframeModel::STARTING, TicksFromSecondsF(0.0));
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  anim->set_time_offset(TimeDelta::FromMilliseconds(2000));
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  anim->set_start_time(TicksFromSecondsF(1.0));
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeNeedsSynchronizedStartTime) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 5.0));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  anim->set_needs_synchronized_start_time(true);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  anim->set_time_offset(TimeDelta::FromMilliseconds(2000));
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  anim->set_start_time(TicksFromSecondsF(1.0));
-  anim->set_needs_synchronized_start_time(false);
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, IsFinishedAtZeroIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(0));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
-}
-
-TEST(AnimationTest, IsFinishedAtOneIteration) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.0)));
-}
-
-TEST(AnimationTest, IsFinishedAtInfiniteIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(-1));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.5)));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.5)));
-}
-
-TEST(AnimationTest, IsFinishedNegativeTimeOffset) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_time_offset(TimeDelta::FromMilliseconds(-500));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.5)));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.5)));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.0)));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.5)));
-}
-
-TEST(AnimationTest, IsFinishedPositiveTimeOffset) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_time_offset(TimeDelta::FromMilliseconds(500));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.5)));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
-}
-
-TEST(AnimationTest, IsFinishedAtNotRunning) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(0));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-  anim->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(0.0));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-  anim->SetRunState(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-                    TicksFromSecondsF(0.0));
-  EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-  anim->SetRunState(KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-  anim->SetRunState(KeyframeModel::ABORTED, TicksFromSecondsF(0.0));
-  EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
-}
-
-TEST(AnimationTest, IsFinished) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_FALSE(anim->is_finished());
-  anim->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(0.0));
-  EXPECT_FALSE(anim->is_finished());
-  anim->SetRunState(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-                    TicksFromSecondsF(0.0));
-  EXPECT_FALSE(anim->is_finished());
-  anim->SetRunState(KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
-  EXPECT_TRUE(anim->is_finished());
-  anim->SetRunState(KeyframeModel::ABORTED, TicksFromSecondsF(0.0));
-  EXPECT_TRUE(anim->is_finished());
-}
-
-TEST(AnimationTest, IsFinishedNeedsSynchronizedStartTime) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(2.0));
-  EXPECT_FALSE(anim->is_finished());
-  anim->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(2.0));
-  EXPECT_FALSE(anim->is_finished());
-  anim->SetRunState(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
-                    TicksFromSecondsF(2.0));
-  EXPECT_FALSE(anim->is_finished());
-  anim->SetRunState(KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
-  EXPECT_TRUE(anim->is_finished());
-  anim->SetRunState(KeyframeModel::ABORTED, TicksFromSecondsF(0.0));
-  EXPECT_TRUE(anim->is_finished());
-}
-
-TEST(AnimationTest, RunStateChangesIgnoredWhileSuspended) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->Suspend(TicksFromSecondsF(0));
-  EXPECT_EQ(KeyframeModel::PAUSED, anim->run_state());
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_EQ(KeyframeModel::PAUSED, anim->run_state());
-  anim->Resume(TicksFromSecondsF(0));
-  anim->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
-  EXPECT_EQ(KeyframeModel::RUNNING, anim->run_state());
-}
-
-TEST(AnimationTest, TrimTimePlaybackNormal) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 1, 1));
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePlaybackSlow) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 1, 0.5));
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                      .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)).InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePlaybackFast) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 4, 2));
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)).InSecondsF());
-  EXPECT_EQ(
-      2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(
-      3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)).InSecondsF());
-  EXPECT_EQ(
-      4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)).InSecondsF());
-  EXPECT_EQ(
-      4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePlaybackNormalReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 2, -1));
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)).InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePlaybackSlowReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 2, -0.5));
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)).InSecondsF());
-  EXPECT_EQ(1.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                      .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                      .InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)).InSecondsF());
-  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
-                      .InSecondsF());
-  EXPECT_EQ(
-      0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3)).InSecondsF());
-  EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))
-                      .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePlaybackFastReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 2, -2));
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)).InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                     .InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)).InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                     .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePlaybackFastInfiniteIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(-1, 4, 4));
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(
-      2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)).InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(
-      2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)).InSecondsF());
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1000.0))
-                   .InSecondsF());
-  EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1000.5))
-                   .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePlaybackNormalDoubleReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 1, -1));
-  anim->set_direction(KeyframeModel::Direction::REVERSE);
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimePlaybackFastDoubleReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 4, -2));
-  anim->set_direction(KeyframeModel::Direction::REVERSE);
-  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                   .InSecondsF());
-  EXPECT_EQ(
-      0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)).InSecondsF());
-  EXPECT_EQ(
-      1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)).InSecondsF());
-  EXPECT_EQ(
-      2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)).InSecondsF());
-  EXPECT_EQ(
-      3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)).InSecondsF());
-  EXPECT_EQ(
-      4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)).InSecondsF());
-  EXPECT_EQ(
-      4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)).InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateTwoIterationsPlaybackFast) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(2, 2, 2));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateTwoIterationsPlaybackFastReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(2, 2, 2));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeAlternateTwoIterationsPlaybackFastDoubleReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(2, 2, -2));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest,
-     TrimTimeAlternateReverseThreeIterationsPlaybackFastAlternateReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(3, 2, -2));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.75))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.25))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest,
-     TrimTimeAlternateReverseTwoIterationsPlaybackNormalAlternate) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(2, 2, -1));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeIterationStart) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(2, 1, 1));
-  anim->set_iteration_start(0.5);
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeIterationStartAlternate) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(2, 1, 1));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  anim->set_iteration_start(0.3);
-  EXPECT_EQ(0.3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.8, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.7))
-                     .InSecondsF());
-  EXPECT_EQ(0.7, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.2))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.7))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, TrimTimeIterationStartAlternateThreeIterations) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(3, 1, 1));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  anim->set_iteration_start(1);
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest,
-     TrimTimeIterationStartAlternateThreeIterationsPlaybackReverse) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(3, 1, -1));
-  anim->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
-  anim->set_iteration_start(1);
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
-                     .InSecondsF());
-  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))
-                     .InSecondsF());
-  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))
-                     .InSecondsF());
-}
-
-TEST(AnimationTest, InEffectFillMode) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1));
-  anim->set_fill_mode(KeyframeModel::FillMode::NONE);
-  EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
-
-  anim->set_fill_mode(KeyframeModel::FillMode::FORWARDS);
-  EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
-
-  anim->set_fill_mode(KeyframeModel::FillMode::BACKWARDS);
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
-
-  anim->set_fill_mode(KeyframeModel::FillMode::BOTH);
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
-}
-
-TEST(AnimationTest, InEffectFillModePlayback) {
-  std::unique_ptr<KeyframeModel> anim(CreateAnimation(1, 1, -1));
-  anim->set_fill_mode(KeyframeModel::FillMode::NONE);
-  EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
-
-  anim->set_fill_mode(KeyframeModel::FillMode::FORWARDS);
-  EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
-
-  anim->set_fill_mode(KeyframeModel::FillMode::BACKWARDS);
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
-
-  anim->set_fill_mode(KeyframeModel::FillMode::BOTH);
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
-  EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
-}
-
-TEST(AnimationTest, ToString) {
-  std::unique_ptr<KeyframeModel> keyframe_model =
-      KeyframeModel::Create(std::make_unique<FakeFloatAnimationCurve>(15), 42,
-                            73, TargetProperty::OPACITY);
-  EXPECT_EQ(
-      base::StringPrintf("KeyframeModel{id=%d, group=73, target_property_id=1, "
-                         "run_state=WAITING_FOR_TARGET_AVAILABILITY}",
-                         keyframe_model->id()),
-      keyframe_model->ToString());
-}
-
-}  // namespace
-}  // namespace cc
diff --git a/cc/animation/keyframe_model_unittest.cc b/cc/animation/keyframe_model_unittest.cc
new file mode 100644
index 0000000..df583614
--- /dev/null
+++ b/cc/animation/keyframe_model_unittest.cc
@@ -0,0 +1,1308 @@
+// Copyright 2012 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 "cc/animation/keyframe_model.h"
+
+#include "base/memory/ptr_util.h"
+#include "base/strings/stringprintf.h"
+#include "cc/test/animation_test_common.h"
+#include "cc/trees/target_property.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cc {
+namespace {
+
+using base::TimeDelta;
+
+static base::TimeTicks TicksFromSecondsF(double seconds) {
+  return base::TimeTicks() + base::TimeDelta::FromSecondsD(seconds);
+}
+
+std::unique_ptr<KeyframeModel> CreateKeyframeModel(double iterations,
+                                                   double duration,
+                                                   double playback_rate) {
+  std::unique_ptr<KeyframeModel> to_return(
+      KeyframeModel::Create(std::make_unique<FakeFloatAnimationCurve>(duration),
+                            0, 1, TargetProperty::OPACITY));
+  to_return->set_iterations(iterations);
+  to_return->set_playback_rate(playback_rate);
+  return to_return;
+}
+
+std::unique_ptr<KeyframeModel> CreateKeyframeModel(double iterations,
+                                                   double duration) {
+  return CreateKeyframeModel(iterations, duration, 1);
+}
+
+std::unique_ptr<KeyframeModel> CreateKeyframeModel(double iterations) {
+  return CreateKeyframeModel(iterations, 1, 1);
+}
+
+TEST(KeyframeModelTest, TrimTimeZeroIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(0));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeOneIteration) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeOneHalfIteration) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1.5));
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.9,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.9))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeInfiniteIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(-1));
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(-1));
+  keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeAlternateInfiniteIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(-1));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeAlternateOneIteration) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeAlternateTwoIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(2));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeAlternateTwoHalfIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(2.5));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.50))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.75))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeAlternateReverseInfiniteIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(-1));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeAlternateReverseOneIteration) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeAlternateReverseTwoIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(2));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeStartTime) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_start_time(TicksFromSecondsF(4));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeStartTimeReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_start_time(TicksFromSecondsF(4));
+  keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeTimeOffset) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_time_offset(TimeDelta::FromMilliseconds(4000));
+  keyframe_model->set_start_time(TicksFromSecondsF(4));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeTimeOffsetReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_time_offset(TimeDelta::FromMilliseconds(4000));
+  keyframe_model->set_start_time(TicksFromSecondsF(4));
+  keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeNegativeTimeOffset) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_time_offset(TimeDelta::FromMilliseconds(-4000));
+
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeNegativeTimeOffsetReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_time_offset(TimeDelta::FromMilliseconds(-4000));
+  keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
+
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePauseResume) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  keyframe_model->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(0.5));
+  EXPECT_EQ(
+      0.5, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
+               .InSecondsF());
+  keyframe_model->SetRunState(KeyframeModel::RUNNING,
+                              TicksFromSecondsF(1024.0));
+  EXPECT_EQ(
+      0.5, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
+               .InSecondsF());
+  EXPECT_EQ(
+      1, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5))
+             .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePauseResumeReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  keyframe_model->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(0.25));
+  EXPECT_EQ(0.75, keyframe_model
+                      ->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
+                      .InSecondsF());
+  keyframe_model->SetRunState(KeyframeModel::RUNNING,
+                              TicksFromSecondsF(1024.0));
+  EXPECT_EQ(0.75, keyframe_model
+                      ->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
+                      .InSecondsF());
+  EXPECT_EQ(
+      0, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.75))
+             .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeSuspendResume) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  keyframe_model->Suspend(TicksFromSecondsF(0.5));
+  EXPECT_EQ(
+      0.5, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
+               .InSecondsF());
+  keyframe_model->Resume(TicksFromSecondsF(1024));
+  EXPECT_EQ(
+      0.5, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
+               .InSecondsF());
+  EXPECT_EQ(
+      1, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5))
+             .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeSuspendResumeReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  keyframe_model->Suspend(TicksFromSecondsF(0.75));
+  EXPECT_EQ(0.25, keyframe_model
+                      ->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
+                      .InSecondsF());
+  keyframe_model->Resume(TicksFromSecondsF(1024));
+  EXPECT_EQ(0.25, keyframe_model
+                      ->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0))
+                      .InSecondsF());
+  EXPECT_EQ(
+      0, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.25))
+             .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeZeroDuration) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(0, 0));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeStarting) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 5.0));
+  keyframe_model->SetRunState(KeyframeModel::STARTING, TicksFromSecondsF(0.0));
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  keyframe_model->set_time_offset(TimeDelta::FromMilliseconds(2000));
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  keyframe_model->set_start_time(TicksFromSecondsF(1.0));
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(3.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeNeedsSynchronizedStartTime) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 5.0));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  keyframe_model->set_needs_synchronized_start_time(true);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  keyframe_model->set_time_offset(TimeDelta::FromMilliseconds(2000));
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  keyframe_model->set_start_time(TicksFromSecondsF(1.0));
+  keyframe_model->set_needs_synchronized_start_time(false);
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(3.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, IsFinishedAtZeroIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(0));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(1.0)));
+}
+
+TEST(KeyframeModelTest, IsFinishedAtOneIteration) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(-1.0)));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(1.0)));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(2.0)));
+}
+
+TEST(KeyframeModelTest, IsFinishedAtInfiniteIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(-1));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.5)));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(1.0)));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(1.5)));
+}
+
+TEST(KeyframeModelTest, IsFinishedNegativeTimeOffset) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_time_offset(TimeDelta::FromMilliseconds(-500));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(-1.0)));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.5)));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(1.0)));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(1.5)));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(2.0)));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(2.5)));
+}
+
+TEST(KeyframeModelTest, IsFinishedPositiveTimeOffset) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_time_offset(TimeDelta::FromMilliseconds(500));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(-1.0)));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.5)));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(1.0)));
+}
+
+TEST(KeyframeModelTest, IsFinishedAtNotRunning) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(0));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+  keyframe_model->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(0.0));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+  keyframe_model->SetRunState(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
+                              TicksFromSecondsF(0.0));
+  EXPECT_FALSE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+  keyframe_model->SetRunState(KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+  keyframe_model->SetRunState(KeyframeModel::ABORTED, TicksFromSecondsF(0.0));
+  EXPECT_TRUE(keyframe_model->IsFinishedAt(TicksFromSecondsF(0.0)));
+}
+
+TEST(KeyframeModelTest, IsFinished) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_FALSE(keyframe_model->is_finished());
+  keyframe_model->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(0.0));
+  EXPECT_FALSE(keyframe_model->is_finished());
+  keyframe_model->SetRunState(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
+                              TicksFromSecondsF(0.0));
+  EXPECT_FALSE(keyframe_model->is_finished());
+  keyframe_model->SetRunState(KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
+  EXPECT_TRUE(keyframe_model->is_finished());
+  keyframe_model->SetRunState(KeyframeModel::ABORTED, TicksFromSecondsF(0.0));
+  EXPECT_TRUE(keyframe_model->is_finished());
+}
+
+TEST(KeyframeModelTest, IsFinishedNeedsSynchronizedStartTime) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(2.0));
+  EXPECT_FALSE(keyframe_model->is_finished());
+  keyframe_model->SetRunState(KeyframeModel::PAUSED, TicksFromSecondsF(2.0));
+  EXPECT_FALSE(keyframe_model->is_finished());
+  keyframe_model->SetRunState(KeyframeModel::WAITING_FOR_TARGET_AVAILABILITY,
+                              TicksFromSecondsF(2.0));
+  EXPECT_FALSE(keyframe_model->is_finished());
+  keyframe_model->SetRunState(KeyframeModel::FINISHED, TicksFromSecondsF(0.0));
+  EXPECT_TRUE(keyframe_model->is_finished());
+  keyframe_model->SetRunState(KeyframeModel::ABORTED, TicksFromSecondsF(0.0));
+  EXPECT_TRUE(keyframe_model->is_finished());
+}
+
+TEST(KeyframeModelTest, RunStateChangesIgnoredWhileSuspended) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->Suspend(TicksFromSecondsF(0));
+  EXPECT_EQ(KeyframeModel::PAUSED, keyframe_model->run_state());
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_EQ(KeyframeModel::PAUSED, keyframe_model->run_state());
+  keyframe_model->Resume(TicksFromSecondsF(0));
+  keyframe_model->SetRunState(KeyframeModel::RUNNING, TicksFromSecondsF(0.0));
+  EXPECT_EQ(KeyframeModel::RUNNING, keyframe_model->run_state());
+}
+
+TEST(KeyframeModelTest, TrimTimePlaybackNormal) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 1, 1));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePlaybackSlow) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 1, 0.5));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePlaybackFast) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 4, 2));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(2,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(3,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(4,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(4,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePlaybackNormalReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 2, -1));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(2, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0))
+                   .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePlaybackSlowReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(
+      CreateKeyframeModel(1, 2, -0.5));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(2, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0))
+                   .InSecondsF());
+  EXPECT_EQ(1.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(0.75,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3))
+                .InSecondsF());
+  EXPECT_EQ(0.25,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))
+                .InSecondsF());
+  EXPECT_EQ(0, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4))
+                   .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePlaybackFastReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 2, -2));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(2, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0))
+                   .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePlaybackFastInfiniteIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(-1, 4, 4));
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(2,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(2,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(
+      0, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1000.0))
+             .InSecondsF());
+  EXPECT_EQ(
+      2, keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1000.5))
+             .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePlaybackNormalDoubleReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 1, -1));
+  keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimePlaybackFastDoubleReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 4, -2));
+  keyframe_model->set_direction(KeyframeModel::Direction::REVERSE);
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(1,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(2,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(3,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(4,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(4,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeAlternateTwoIterationsPlaybackFast) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(2, 2, 2));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeAlternateTwoIterationsPlaybackFastReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(2, 2, 2));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest,
+     TrimTimeAlternateTwoIterationsPlaybackFastDoubleReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(2, 2, -2));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest,
+     TrimTimeAlternateReverseThreeIterationsPlaybackFastAlternateReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(3, 2, -2));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_REVERSE);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.75))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.25))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest,
+     TrimTimeAlternateReverseTwoIterationsPlaybackNormalAlternate) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(2, 2, -1));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(2.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(1.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeIterationStart) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(2, 1, 1));
+  keyframe_model->set_iteration_start(0.5);
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeIterationStartAlternate) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(2, 1, 1));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
+  keyframe_model->set_iteration_start(0.3);
+  EXPECT_EQ(0.3,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.3,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.8,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.7))
+                .InSecondsF());
+  EXPECT_EQ(0.7,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.2))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.7))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, TrimTimeIterationStartAlternateThreeIterations) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(3, 1, 1));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
+  keyframe_model->set_iteration_start(1);
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(0.5,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest,
+     TrimTimeIterationStartAlternateThreeIterationsPlaybackReverse) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(3, 1, -1));
+  keyframe_model->set_direction(KeyframeModel::Direction::ALTERNATE_NORMAL);
+  keyframe_model->set_iteration_start(1);
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0))
+                .InSecondsF());
+  EXPECT_EQ(0.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0))
+                .InSecondsF());
+  EXPECT_EQ(1.0,
+            keyframe_model->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5))
+                .InSecondsF());
+}
+
+TEST(KeyframeModelTest, InEffectFillMode) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1));
+  keyframe_model->set_fill_mode(KeyframeModel::FillMode::NONE);
+  EXPECT_FALSE(keyframe_model->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(1.0)));
+
+  keyframe_model->set_fill_mode(KeyframeModel::FillMode::FORWARDS);
+  EXPECT_FALSE(keyframe_model->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(1.0)));
+
+  keyframe_model->set_fill_mode(KeyframeModel::FillMode::BACKWARDS);
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(1.0)));
+
+  keyframe_model->set_fill_mode(KeyframeModel::FillMode::BOTH);
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(1.0)));
+}
+
+TEST(KeyframeModelTest, InEffectFillModePlayback) {
+  std::unique_ptr<KeyframeModel> keyframe_model(CreateKeyframeModel(1, 1, -1));
+  keyframe_model->set_fill_mode(KeyframeModel::FillMode::NONE);
+  EXPECT_FALSE(keyframe_model->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(1.0)));
+
+  keyframe_model->set_fill_mode(KeyframeModel::FillMode::FORWARDS);
+  EXPECT_FALSE(keyframe_model->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(1.0)));
+
+  keyframe_model->set_fill_mode(KeyframeModel::FillMode::BACKWARDS);
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(1.0)));
+
+  keyframe_model->set_fill_mode(KeyframeModel::FillMode::BOTH);
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(-1.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(0.0)));
+  EXPECT_TRUE(keyframe_model->InEffect(TicksFromSecondsF(1.0)));
+}
+
+TEST(KeyframeModelTest, ToString) {
+  std::unique_ptr<KeyframeModel> keyframe_model =
+      KeyframeModel::Create(std::make_unique<FakeFloatAnimationCurve>(15), 42,
+                            73, TargetProperty::OPACITY);
+  EXPECT_EQ(
+      base::StringPrintf("KeyframeModel{id=%d, group=73, target_property_id=1, "
+                         "run_state=WAITING_FOR_TARGET_AVAILABILITY}",
+                         keyframe_model->id()),
+      keyframe_model->ToString());
+}
+
+}  // namespace
+}  // namespace cc