| Index: chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6e283aa7ff2182cc41fbc49497938bfe077a520f
|
| --- /dev/null
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/ChromeAnimationTest.java
|
| @@ -0,0 +1,110 @@
|
| +// Copyright 2016 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.
|
| +
|
| +package org.chromium.chrome.browser.compositor.layouts;
|
| +
|
| +import static org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.AnimatableAnimation.createAnimation;
|
| +
|
| +import android.os.SystemClock;
|
| +import android.test.InstrumentationTestCase;
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +
|
| +import org.chromium.base.test.util.Feature;
|
| +import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable;
|
| +
|
| +/**
|
| + * Unit tests for {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation}.
|
| + */
|
| +public class ChromeAnimationTest extends InstrumentationTestCase
|
| + implements Animatable<ChromeAnimationTest.Property> {
|
| +
|
| + protected enum Property {
|
| + FAST_ANIMATION,
|
| + SLOW_ANIMATION
|
| + }
|
| +
|
| + private static final long FAST_DURATION = 100;
|
| + private static final long SLOW_DURATION = 1000;
|
| +
|
| + private ChromeAnimation<Animatable<?>> mAnimations;
|
| +
|
| + private boolean mHasFinishedFastAnimation;
|
| + private boolean mHasFinishedSlowAnimation;
|
| +
|
| + @Override
|
| + protected void setUp() throws Exception {
|
| + super.setUp();
|
| +
|
| + mHasFinishedFastAnimation = false;
|
| + mHasFinishedSlowAnimation = false;
|
| + }
|
| +
|
| + @Override
|
| + public void setProperty(Property prop, float val) {}
|
| +
|
| + @Override
|
| + public void onPropertyAnimationFinished(Property prop) {
|
| + if (prop == Property.FAST_ANIMATION) {
|
| + mHasFinishedFastAnimation = true;
|
| + } else if (prop == Property.SLOW_ANIMATION) {
|
| + mHasFinishedSlowAnimation = true;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Creates an {@link org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable}
|
| + * and adds it to the animation.
|
| + * Automatically sets the start value at the beginning of the animation.
|
| + *
|
| + * @param <T> The Enum type of the Property being used
|
| + * @param object The object being animated
|
| + * @param prop The property being animated
|
| + * @param start The starting value of the animation
|
| + * @param end The ending value of the animation
|
| + * @param duration The duration of the animation in ms
|
| + * @param startTime The start time in ms
|
| + */
|
| + private <T extends Enum<?>> void addToAnimation(Animatable<T> object, T prop,
|
| + float start, float end, long duration, long startTime) {
|
| + ChromeAnimation.Animation<Animatable<?>> component = createAnimation(
|
| + object, prop, start, end, duration, startTime, false,
|
| + ChromeAnimation.getDecelerateInterpolator());
|
| + addToAnimation(component);
|
| + }
|
| +
|
| + /**
|
| + * Appends an Animation to the current animation set and starts it immediately. If the set is
|
| + * already finished or doesn't exist, the animation set is also started.
|
| + */
|
| + private void addToAnimation(ChromeAnimation.Animation<Animatable<?>> component) {
|
| + if (mAnimations == null || mAnimations.finished()) {
|
| + mAnimations = new ChromeAnimation<>();
|
| + mAnimations.start();
|
| + }
|
| + component.start();
|
| + mAnimations.add(component);
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"ContextualSearch"})
|
| + public void testConcurrentAnimationsFinishSeparately() {
|
| + addToAnimation(this, Property.FAST_ANIMATION, 0.f, 1.f, FAST_DURATION, 0);
|
| + addToAnimation(this, Property.SLOW_ANIMATION, 0.f, 1.f, SLOW_DURATION, 0);
|
| +
|
| + // Update the animation with the current time. This will internally set the initial
|
| + // time of the animation to |now|.
|
| + long now = SystemClock.uptimeMillis();
|
| + mAnimations.update(now);
|
| +
|
| + // Advances time to check that the fast animation will finish first.
|
| + mAnimations.update(now + FAST_DURATION);
|
| + assertTrue(mHasFinishedFastAnimation);
|
| + assertFalse(mHasFinishedSlowAnimation);
|
| +
|
| + // Advances time to check that all animations are finished.
|
| + mAnimations.update(now + SLOW_DURATION);
|
| + assertTrue(mHasFinishedFastAnimation);
|
| + assertTrue(mHasFinishedSlowAnimation);
|
| + }
|
| +}
|
|
|