15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_element.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_delegate.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/test/test_layer_animation_delegate.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/test/test_utils.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the transformation element progresses the delegate as expected and
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, TransformElement) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLayerAnimationDelegate delegate;
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Transform start_transform, target_transform;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  start_transform.Rotate(-30.0);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target_transform.Rotate(30.0);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks start_time;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks effective_start_time;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LayerAnimationElement> element(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LayerAnimationElement::CreateTransformElement(target_transform, delta));
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->set_animation_group_id(1);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2; ++i) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    start_time = effective_start_time + delta;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->set_requested_start_time(start_time);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate.SetTransformFromAnimation(start_transform);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Start(&delegate, 1);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time, &delegate);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckApproximatelyEqual(start_transform,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            delegate.GetTransformForAnimation());
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    effective_start_time = start_time + delta;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->set_effective_start_time(effective_start_time);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(effective_start_time, &delegate);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FLOAT_EQ(0.0, element->last_progressed_fraction());
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(effective_start_time + delta/2, &delegate);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FLOAT_EQ(0.5, element->last_progressed_fraction());
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta element_duration;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(element->IsFinished(effective_start_time + delta,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    &element_duration));
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2 * delta, element_duration);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(effective_start_time + delta, &delegate);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FLOAT_EQ(1.0, element->last_progressed_fraction());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckApproximatelyEqual(target_transform,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            delegate.GetTransformForAnimation());
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LayerAnimationElement::TargetValue target_value(&delegate);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element->GetTargetValue(&target_value);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckApproximatelyEqual(target_transform, target_value.transform);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Ensures that duration is copied correctly.
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(LayerAnimationElementTest, InverseElementDurationNoScale) {
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Transform transform;
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::TimeDelta delta;
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<LayerAnimationElement> base_element(
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LayerAnimationElement::CreateTransformElement(transform, delta));
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<LayerAnimationElement> inverse_element(
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LayerAnimationElement::CreateInverseTransformElement(transform,
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                           base_element.get()));
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(base_element->duration(), inverse_element->duration());
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Ensures that duration is copied correctly and not double scaled.
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST(LayerAnimationElementTest, InverseElementDurationScaled) {
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Transform transform;
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::TimeDelta delta;
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedAnimationDurationScaleMode faster_duration(
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ScopedAnimationDurationScaleMode::FAST_DURATION);
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<LayerAnimationElement> base_element(
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LayerAnimationElement::CreateTransformElement(transform, delta));
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<LayerAnimationElement> inverse_element(
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      LayerAnimationElement::CreateInverseTransformElement(transform,
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                           base_element.get()));
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(base_element->duration(), inverse_element->duration());
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Ensures that the GetTargetTransform() method works as intended.
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST(LayerAnimationElementTest, InverseElementTargetCalculation) {
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::TimeTicks start_time;
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  start_time += delta;
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Transform identity, transform;
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  transform.Scale3d(2.0, 2.0, 2.0);
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<LayerAnimationElement> base_element(
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      LayerAnimationElement::CreateTransformElement(transform, delta));
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<LayerAnimationElement> inverse_element(
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      LayerAnimationElement::CreateInverseTransformElement(identity,
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                                           base_element.get()));
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base_element->set_requested_start_time(start_time);
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  inverse_element->set_requested_start_time(start_time);
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestLayerAnimationDelegate delegate;
119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  delegate.SetTransformFromAnimation(transform);
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base_element->Start(&delegate, 1);
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  inverse_element->Start(&delegate, 1);
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  LayerAnimationElement::TargetValue target;
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  inverse_element->GetTargetValue(&target);
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_TRUE(target.transform.IsIdentity())
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    << "Target should be identity such that the initial 2x scale from the start"
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    << " carries over at end when parent is doubled.";
129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the bounds element progresses the delegate as expected and
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, BoundsElement) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLayerAnimationDelegate delegate;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect start, target, middle;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  start = target = middle = gfx::Rect(0, 0, 50, 50);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  start.set_x(-90);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target.set_x(90);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks start_time;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LayerAnimationElement> element(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LayerAnimationElement::CreateBoundsElement(target, delta));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2; ++i) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    start_time += delta;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->set_requested_start_time(start_time);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate.SetBoundsFromAnimation(start);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Start(&delegate, 1);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time, &delegate);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckApproximatelyEqual(start, delegate.GetBoundsForAnimation());
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time + delta/2, &delegate);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckApproximatelyEqual(middle, delegate.GetBoundsForAnimation());
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta element_duration;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration));
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(delta, element_duration);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time + delta, &delegate);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CheckApproximatelyEqual(target, delegate.GetBoundsForAnimation());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LayerAnimationElement::TargetValue target_value(&delegate);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element->GetTargetValue(&target_value);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckApproximatelyEqual(target, target_value.bounds);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the opacity element progresses the delegate as expected and
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, OpacityElement) {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLayerAnimationDelegate delegate;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float start = 0.0;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float middle = 0.5;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float target = 1.0;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks start_time;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks effective_start_time;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LayerAnimationElement> element(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LayerAnimationElement::CreateOpacityElement(target, delta));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2; ++i) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    start_time = effective_start_time + delta;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->set_requested_start_time(start_time);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate.SetOpacityFromAnimation(start);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Start(&delegate, 1);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time, &delegate);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FLOAT_EQ(start, element->last_progressed_fraction());
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    effective_start_time = start_time + delta;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->set_effective_start_time(effective_start_time);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(effective_start_time, &delegate);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FLOAT_EQ(start, element->last_progressed_fraction());
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(effective_start_time + delta/2, &delegate);
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FLOAT_EQ(middle, element->last_progressed_fraction());
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta element_duration;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(element->IsFinished(effective_start_time + delta,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    &element_duration));
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2 * delta, element_duration);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(effective_start_time + delta, &delegate);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FLOAT_EQ(target, element->last_progressed_fraction());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FLOAT_EQ(target, delegate.GetOpacityForAnimation());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LayerAnimationElement::TargetValue target_value(&delegate);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element->GetTargetValue(&target_value);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FLOAT_EQ(target, target_value.opacity);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the visibility element progresses the delegate as expected and
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, VisibilityElement) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLayerAnimationDelegate delegate;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool start = true;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool target = false;
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks start_time;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LayerAnimationElement> element(
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LayerAnimationElement::CreateVisibilityElement(target, delta));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2; ++i) {
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    start_time += delta;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->set_requested_start_time(start_time);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate.SetVisibilityFromAnimation(start);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Start(&delegate, 1);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time, &delegate);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate.GetVisibilityForAnimation());
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time + delta/2, &delegate);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(delegate.GetVisibilityForAnimation());
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta element_duration;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration));
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(delta, element_duration);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time + delta, &delegate);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(delegate.GetVisibilityForAnimation());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LayerAnimationElement::TargetValue target_value(&delegate);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element->GetTargetValue(&target_value);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(target_value.visibility);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the Brightness element progresses the delegate as expected and
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, BrightnessElement) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLayerAnimationDelegate delegate;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float start = 0.0;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float middle = 0.5;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float target = 1.0;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks start_time;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LayerAnimationElement> element(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LayerAnimationElement::CreateBrightnessElement(target, delta));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2; ++i) {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    start_time += delta;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->set_requested_start_time(start_time);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate.SetBrightnessFromAnimation(start);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Start(&delegate, 1);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time, &delegate);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FLOAT_EQ(start, delegate.GetBrightnessForAnimation());
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time + delta/2, &delegate);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FLOAT_EQ(middle, delegate.GetBrightnessForAnimation());
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta element_duration;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration));
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(delta, element_duration);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time + delta, &delegate);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FLOAT_EQ(target, delegate.GetBrightnessForAnimation());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LayerAnimationElement::TargetValue target_value(&delegate);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element->GetTargetValue(&target_value);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FLOAT_EQ(target, target_value.brightness);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the Grayscale element progresses the delegate as expected and
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, GrayscaleElement) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLayerAnimationDelegate delegate;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float start = 0.0;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float middle = 0.5;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float target = 1.0;
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks start_time;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LayerAnimationElement> element(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LayerAnimationElement::CreateGrayscaleElement(target, delta));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2; ++i) {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    start_time += delta;
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->set_requested_start_time(start_time);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate.SetGrayscaleFromAnimation(start);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Start(&delegate, 1);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time, &delegate);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FLOAT_EQ(start, delegate.GetGrayscaleForAnimation());
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time + delta/2, &delegate);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FLOAT_EQ(middle, delegate.GetGrayscaleForAnimation());
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeDelta element_duration;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration));
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(delta, element_duration);
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    element->Progress(start_time + delta, &delegate);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FLOAT_EQ(target, delegate.GetGrayscaleForAnimation());
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LayerAnimationElement::TargetValue target_value(&delegate);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element->GetTargetValue(&target_value);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FLOAT_EQ(target, target_value.grayscale);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that the pause element progresses the delegate as expected and
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the element can be reused after it completes.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LayerAnimationElementTest, PauseElement) {
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LayerAnimationElement::AnimatableProperties properties =
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerAnimationElement::TRANSFORM | LayerAnimationElement::BOUNDS |
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerAnimationElement::OPACITY | LayerAnimationElement::BRIGHTNESS |
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LayerAnimationElement::GRAYSCALE;
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks start_time;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<LayerAnimationElement> element(
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LayerAnimationElement::CreatePauseElement(properties, delta));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLayerAnimationDelegate delegate;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestLayerAnimationDelegate copy = delegate;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  start_time += delta;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->set_requested_start_time(start_time);
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->Start(&delegate, 1);
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Pause should last for |delta|.
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta element_duration;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(element->IsFinished(start_time + delta, &element_duration));
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(delta, element_duration);
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->Progress(start_time + delta, &delegate);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing should have changed.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckApproximatelyEqual(delegate.GetBoundsForAnimation(),
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          copy.GetBoundsForAnimation());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckApproximatelyEqual(delegate.GetTransformForAnimation(),
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          copy.GetTransformForAnimation());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(),
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  copy.GetOpacityForAnimation());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FLOAT_EQ(delegate.GetBrightnessForAnimation(),
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  copy.GetBrightnessForAnimation());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FLOAT_EQ(delegate.GetGrayscaleForAnimation(),
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  copy.GetGrayscaleForAnimation());
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Check that a threaded opacity element updates the delegate as expected when
3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// aborted.
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerAnimationElementTest, AbortOpacityElement) {
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestLayerAnimationDelegate delegate;
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float start = 0.0;
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float target = 1.0;
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks start_time;
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeTicks effective_start_time;
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<LayerAnimationElement> element(
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      LayerAnimationElement::CreateOpacityElement(target, delta));
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Choose a non-linear Tween type.
368d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Tween::Type tween_type = gfx::Tween::EASE_IN;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->set_tween_type(tween_type);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  delegate.SetOpacityFromAnimation(start);
3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Aborting the element before it has started should not update the delegate.
3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->Abort(&delegate);
3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_FLOAT_EQ(start, delegate.GetOpacityForAnimation());
3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  start_time += delta;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->set_requested_start_time(start_time);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->Start(&delegate, 1);
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->Progress(start_time, &delegate);
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  effective_start_time = start_time + delta;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->set_effective_start_time(effective_start_time);
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->Progress(effective_start_time, &delegate);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->Progress(effective_start_time + delta/2, &delegate);
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Since the element has started, it should update the delegate when
3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // aborted.
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  element->Abort(&delegate);
389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_FLOAT_EQ(gfx::Tween::CalculateValue(tween_type, 0.5),
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  delegate.GetOpacityForAnimation());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Check that a threaded transform element updates the delegate as expected when
3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// aborted.
3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST(LayerAnimationElementTest, AbortTransformElement) {
3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  TestLayerAnimationDelegate delegate;
3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gfx::Transform start_transform, target_transform;
3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  start_transform.Rotate(-30.0);
3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  target_transform.Rotate(30.0);
4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::TimeTicks start_time;
4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::TimeTicks effective_start_time;
4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<LayerAnimationElement> element(
4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      LayerAnimationElement::CreateTransformElement(target_transform, delta));
4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Choose a non-linear Tween type.
407d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Tween::Type tween_type = gfx::Tween::EASE_IN;
4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->set_tween_type(tween_type);
4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  delegate.SetTransformFromAnimation(start_transform);
4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Aborting the element before it has started should not update the delegate.
4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->Abort(&delegate);
4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CheckApproximatelyEqual(start_transform, delegate.GetTransformForAnimation());
4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  start_time += delta;
4177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->set_requested_start_time(start_time);
4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->Start(&delegate, 1);
4197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->Progress(start_time, &delegate);
4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  effective_start_time = start_time + delta;
4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->set_effective_start_time(effective_start_time);
4227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->Progress(effective_start_time, &delegate);
4237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->Progress(effective_start_time + delta/2, &delegate);
4247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Since the element has started, it should update the delegate when
4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // aborted.
4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  element->Abort(&delegate);
4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  target_transform.Blend(start_transform,
429d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                         gfx::Tween::CalculateValue(tween_type, 0.5));
4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CheckApproximatelyEqual(target_transform,
4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          delegate.GetTransformForAnimation());
4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui
437