Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.view.animation.cts;
     18 
     19 import static org.junit.Assert.assertEquals;
     20 import static org.junit.Assert.assertFalse;
     21 import static org.junit.Assert.assertTrue;
     22 
     23 import android.app.Activity;
     24 import android.app.Instrumentation;
     25 import android.content.res.XmlResourceParser;
     26 import android.support.test.InstrumentationRegistry;
     27 import android.support.test.filters.MediumTest;
     28 import android.support.test.rule.ActivityTestRule;
     29 import android.support.test.runner.AndroidJUnit4;
     30 import android.util.AttributeSet;
     31 import android.util.Xml;
     32 import android.view.View;
     33 import android.view.animation.AlphaAnimation;
     34 import android.view.animation.Animation;
     35 import android.view.animation.AnimationUtils;
     36 import android.view.animation.DecelerateInterpolator;
     37 import android.view.animation.Interpolator;
     38 import android.view.animation.Transformation;
     39 import android.view.cts.R;
     40 
     41 import org.junit.Before;
     42 import org.junit.Rule;
     43 import org.junit.Test;
     44 import org.junit.runner.RunWith;
     45 
     46 /**
     47  * Test {@link DecelerateInterpolator}.
     48  */
     49 @MediumTest
     50 @RunWith(AndroidJUnit4.class)
     51 public class DecelerateInterpolatorTest {
     52     private static final float ALPHA_DELTA = 0.001f;
     53 
     54     /** It is defined in R.anim.decelerate_alpha */
     55     private static final long DECELERATE_ALPHA_DURATION = 2000;
     56 
     57     private Instrumentation mInstrumentation;
     58     private Activity mActivity;
     59 
     60     @Rule
     61     public ActivityTestRule<AnimationTestCtsActivity> mActivityRule =
     62             new ActivityTestRule<>(AnimationTestCtsActivity.class);
     63 
     64     @Before
     65     public void setup() {
     66         mInstrumentation = InstrumentationRegistry.getInstrumentation();
     67         mActivity = mActivityRule.getActivity();
     68     }
     69 
     70     @Test
     71     public void testConstructor() {
     72         new DecelerateInterpolator();
     73 
     74         new DecelerateInterpolator(1.0f);
     75 
     76         XmlResourceParser parser = mActivity.getResources().getAnimation(R.anim.decelerate_alpha);
     77         AttributeSet attrs = Xml.asAttributeSet(parser);
     78         new DecelerateInterpolator(mActivity, attrs);
     79     }
     80 
     81     @Test
     82     public void testDecelerateInterpolator() throws Throwable {
     83         final View animWindow = mActivity.findViewById(R.id.anim_window);
     84 
     85         // XML file of R.anim.decelerate_alpha
     86         // <alpha xmlns:android="http://schemas.android.com/apk/res/android"
     87         //      android:interpolator="@android:anim/decelerate_interpolator"
     88         //      android:fromAlpha="0.0"
     89         //      android:toAlpha="1.0"
     90         //      android:duration="2000" />
     91         final Animation anim = AnimationUtils.loadAnimation(mActivity, R.anim.decelerate_alpha);
     92 
     93         assertEquals(DECELERATE_ALPHA_DURATION, anim.getDuration());
     94         assertTrue(anim instanceof AlphaAnimation);
     95 
     96         // factor is 1.0f
     97         Interpolator interpolator = new DecelerateInterpolator(1.0f);
     98         anim.setInterpolator(interpolator);
     99         assertFalse(anim.hasStarted());
    100 
    101         AnimationTestUtils.assertRunAnimation(mInstrumentation, mActivityRule, animWindow, anim);
    102 
    103         Transformation transformation = new Transformation();
    104         long startTime = anim.getStartTime();
    105         anim.getTransformation(startTime, transformation);
    106         float alpha1 = transformation.getAlpha();
    107         assertEquals(0.0f, alpha1, ALPHA_DELTA);
    108 
    109         anim.getTransformation(startTime + 500, transformation);
    110         float alpha2 = transformation.getAlpha();
    111 
    112         anim.getTransformation(startTime + 1000, transformation);
    113         float alpha3 = transformation.getAlpha();
    114 
    115         anim.getTransformation(startTime + 1500, transformation);
    116         float alpha4 = transformation.getAlpha();
    117 
    118         anim.getTransformation(startTime + DECELERATE_ALPHA_DURATION, transformation);
    119         float alpha5 = transformation.getAlpha();
    120         assertEquals(1.0f, alpha5, ALPHA_DELTA);
    121 
    122         // check decelerating delta alpha
    123         float delta1 = alpha2 - alpha1;
    124         float delta2 = alpha3 - alpha2;
    125         float delta3 = alpha4 - alpha3;
    126         float delta4 = alpha5 - alpha4;
    127         assertTrue(delta1 > delta2);
    128         assertTrue(delta2 > delta3);
    129         assertTrue(delta3 > delta4);
    130 
    131         // factor is 1.5f, it starts even faster and ends evens slower than 1.0f
    132         interpolator = new DecelerateInterpolator(1.5f);
    133         anim.setInterpolator(interpolator);
    134 
    135         AnimationTestUtils.assertRunAnimation(mInstrumentation, mActivityRule, animWindow, anim);
    136 
    137         transformation = new Transformation();
    138         startTime = anim.getStartTime();
    139         anim.getTransformation(startTime, transformation);
    140         float alpha6 = transformation.getAlpha();
    141         assertEquals(0.0f, alpha1, ALPHA_DELTA);
    142 
    143         anim.getTransformation(startTime + 500, transformation);
    144         float alpha7 = transformation.getAlpha();
    145 
    146         anim.getTransformation(startTime + 1000, transformation);
    147         float alpha8 = transformation.getAlpha();
    148 
    149         anim.getTransformation(startTime + 1500, transformation);
    150         float alpha9 = transformation.getAlpha();
    151 
    152         anim.getTransformation(startTime + DECELERATE_ALPHA_DURATION, transformation);
    153         float alpha10 = transformation.getAlpha();
    154         assertEquals(1.0f, alpha5, ALPHA_DELTA);
    155 
    156         // check decelerating delta alpha
    157         float delta5 = alpha7 - alpha6;
    158         float delta6 = alpha8 - alpha7;
    159         float delta7 = alpha9 - alpha8;
    160         float delta8 = alpha10 - alpha9;
    161         assertTrue(delta5 > delta6);
    162         assertTrue(delta6 > delta7);
    163         assertTrue(delta7 > delta8);
    164 
    165         // check whether it starts even faster
    166         assertTrue(delta5 > delta1);
    167     }
    168 
    169     @Test
    170     public void testGetInterpolation() {
    171         final float input = 0.25f;
    172         Interpolator interpolator1 = new DecelerateInterpolator(1.0f);
    173         // factor is 2.0f, it starts even faster and ends evens slower than 1.0f
    174         Interpolator interpolator2 = new DecelerateInterpolator(2.0f);
    175 
    176         float delta1 = interpolator1.getInterpolation(input);
    177         float delta2 = interpolator2.getInterpolation(input);
    178 
    179         // check whether it starts even faster
    180         assertTrue(delta2 > delta1);
    181     }
    182 }
    183