1 /* 2 * Copyright (C) 2008 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 android.app.Activity; 20 import android.content.res.XmlResourceParser; 21 import android.test.ActivityInstrumentationTestCase2; 22 import android.util.AttributeSet; 23 import android.util.Xml; 24 import android.view.View; 25 import android.view.animation.AlphaAnimation; 26 import android.view.animation.Animation; 27 import android.view.animation.AnimationUtils; 28 import android.view.animation.CycleInterpolator; 29 import android.view.animation.Interpolator; 30 import android.view.animation.Transformation; 31 32 import com.android.cts.stub.R; 33 34 import dalvik.annotation.TestLevel; 35 import dalvik.annotation.TestTargetClass; 36 import dalvik.annotation.TestTargetNew; 37 import dalvik.annotation.TestTargets; 38 39 /** 40 * Test {@link CycleInterpolator}. 41 */ 42 @TestTargetClass(CycleInterpolator.class) 43 public class CycleInterpolatorTest 44 extends ActivityInstrumentationTestCase2<AnimationTestStubActivity> { 45 46 private Activity mActivity; 47 48 /** It is defined in R.anim.cycle_alpha */ 49 private static final long CYCLE_ALPHA_DURATION = 2000; 50 private static final float ALPHA_DELTA = 0.001f; 51 52 public CycleInterpolatorTest() { 53 super("com.android.cts.stub", AnimationTestStubActivity.class); 54 } 55 56 @Override 57 protected void setUp() throws Exception { 58 super.setUp(); 59 mActivity = getActivity(); 60 } 61 62 @TestTargets({ 63 @TestTargetNew( 64 level = TestLevel.COMPLETE, 65 method = "CycleInterpolator", 66 args = {float.class} 67 ), 68 @TestTargetNew( 69 level = TestLevel.COMPLETE, 70 method = "CycleInterpolator", 71 args = {android.content.Context.class, android.util.AttributeSet.class} 72 ) 73 }) 74 public void testConstructors() { 75 new CycleInterpolator(1.0f); 76 77 XmlResourceParser parser = mActivity.getResources().getAnimation(R.anim.cycle_alpha); 78 AttributeSet attrs = Xml.asAttributeSet(parser); 79 new CycleInterpolator(mActivity, attrs); 80 } 81 82 public void testCycyleInterpolator() { 83 final View animWindow = mActivity.findViewById(R.id.anim_window); 84 final Animation anim = AnimationUtils.loadAnimation(mActivity, R.anim.cycle_alpha); 85 assertEquals(CYCLE_ALPHA_DURATION, anim.getDuration()); 86 assertTrue(anim instanceof AlphaAnimation); 87 88 // cycle only once. 89 Interpolator interpolator = new CycleInterpolator(1.0f); 90 anim.setInterpolator(interpolator); 91 assertFalse(anim.hasStarted()); 92 93 AnimationTestUtils.assertRunAnimation(getInstrumentation(), animWindow, anim); 94 95 Transformation transformation = new Transformation(); 96 long startTime = anim.getStartTime(); 97 anim.getTransformation(startTime, transformation); 98 final float alpha1 = transformation.getAlpha(); 99 assertEquals(0.0f, alpha1, ALPHA_DELTA); 100 101 anim.getTransformation(startTime + 500, transformation); 102 final float alpha2 = transformation.getAlpha(); 103 assertEquals(1.0f, alpha2, ALPHA_DELTA); 104 105 anim.getTransformation(startTime + 1000, transformation); 106 final float alpha3 = transformation.getAlpha(); 107 108 anim.getTransformation(startTime + 1500, transformation); 109 final float alpha4 = transformation.getAlpha(); 110 assertEquals(-1.0f, alpha4, ALPHA_DELTA); 111 112 anim.getTransformation(startTime + CYCLE_ALPHA_DURATION, transformation); 113 final float alpha5 = transformation.getAlpha(); 114 assertEquals(0.0f, alpha5, ALPHA_DELTA); 115 116 // check cycle sinusoidal delta alpha 117 final float delta1 = alpha2 - alpha1; 118 final float delta2 = alpha3 - alpha2; 119 final float delta3 = alpha4 - alpha3; 120 final float delta4 = alpha5 - alpha4; 121 assertEquals(alpha1, alpha3, ALPHA_DELTA); 122 assertEquals(alpha3, alpha5, ALPHA_DELTA); 123 assertEquals(alpha2, -alpha4, ALPHA_DELTA); 124 assertEquals(delta1, -delta2, ALPHA_DELTA); 125 assertEquals(delta2, delta3, ALPHA_DELTA); 126 assertEquals(delta3, -delta4, ALPHA_DELTA); 127 128 // cycle twice. 129 interpolator = new CycleInterpolator(2.0f); 130 anim.setInterpolator(interpolator); 131 132 AnimationTestUtils.assertRunAnimation(getInstrumentation(), animWindow, anim); 133 134 transformation = new Transformation(); 135 startTime = anim.getStartTime(); 136 anim.getTransformation(startTime, transformation); 137 final float alpha6 = transformation.getAlpha(); 138 assertEquals(0.0f, alpha1, ALPHA_DELTA); 139 140 anim.getTransformation(startTime + 250, transformation); 141 final float alpha7 = transformation.getAlpha(); 142 assertEquals(1.0f, alpha7, ALPHA_DELTA); 143 144 anim.getTransformation(startTime + 500, transformation); 145 final float alpha8 = transformation.getAlpha(); 146 147 anim.getTransformation(startTime + 750, transformation); 148 final float alpha9 = transformation.getAlpha(); 149 assertEquals(-1.0f, alpha9, ALPHA_DELTA); 150 151 anim.getTransformation(startTime + 1000, transformation); 152 final float alpha10 = transformation.getAlpha(); 153 154 anim.getTransformation(startTime + 1250, transformation); 155 final float alpha11 = transformation.getAlpha(); 156 157 anim.getTransformation(startTime + 1500, transformation); 158 final float alpha12 = transformation.getAlpha(); 159 160 anim.getTransformation(startTime + 1750, transformation); 161 final float alpha13 = transformation.getAlpha(); 162 163 anim.getTransformation(startTime + CYCLE_ALPHA_DURATION, transformation); 164 final float alpha14 = transformation.getAlpha(); 165 assertEquals(0.0f, alpha14, ALPHA_DELTA); 166 167 // check cycle sinusoidal delta alpha 168 final float delta5 = alpha7 - alpha6; 169 final float delta6 = alpha8 - alpha7; 170 final float delta7 = alpha9 - alpha8; 171 final float delta8 = alpha10 - alpha9; 172 final float delta9 = alpha11 - alpha10; 173 final float delta10 = alpha12 - alpha11; 174 final float delta11 = alpha13 - alpha12; 175 final float delta12 = alpha14 - alpha13; 176 assertEquals(alpha6, alpha8, ALPHA_DELTA); 177 assertEquals(alpha8, alpha10, ALPHA_DELTA); 178 assertEquals(alpha10, alpha12, ALPHA_DELTA); 179 assertEquals(alpha12, alpha14, ALPHA_DELTA); 180 assertEquals(alpha7, -alpha9, ALPHA_DELTA); 181 assertEquals(alpha9, -alpha11, ALPHA_DELTA); 182 assertEquals(alpha11, -alpha13, ALPHA_DELTA); 183 assertEquals(delta6, -delta5, ALPHA_DELTA); 184 assertEquals(delta7, delta6, ALPHA_DELTA); 185 assertEquals(delta8, -delta7, ALPHA_DELTA); 186 assertEquals(delta9, delta8, ALPHA_DELTA); 187 assertEquals(delta10, -delta9, ALPHA_DELTA); 188 assertEquals(delta11, delta10, ALPHA_DELTA); 189 assertEquals(delta12, -delta11, ALPHA_DELTA); 190 191 // check whether it cycle the same 192 assertEquals(alpha6, alpha1, ALPHA_DELTA); 193 assertEquals(alpha7, alpha2, ALPHA_DELTA); 194 assertEquals(alpha8, alpha3, ALPHA_DELTA); 195 assertEquals(alpha9, alpha4, ALPHA_DELTA); 196 assertEquals(alpha10, alpha5, ALPHA_DELTA); 197 assertEquals(alpha10, alpha1, ALPHA_DELTA); 198 assertEquals(alpha11, alpha2, ALPHA_DELTA); 199 assertEquals(alpha12, alpha3, ALPHA_DELTA); 200 assertEquals(alpha13, alpha4, ALPHA_DELTA); 201 assertEquals(alpha14, alpha5, ALPHA_DELTA); 202 assertEquals(delta5, delta1, ALPHA_DELTA); 203 assertEquals(delta6, delta2, ALPHA_DELTA); 204 assertEquals(delta7, delta3, ALPHA_DELTA); 205 assertEquals(delta8, delta4, ALPHA_DELTA); 206 assertEquals(delta9, delta1, ALPHA_DELTA); 207 assertEquals(delta10, delta2, ALPHA_DELTA); 208 assertEquals(delta11, delta3, ALPHA_DELTA); 209 assertEquals(delta12, delta4, ALPHA_DELTA); 210 } 211 212 @TestTargetNew( 213 level = TestLevel.COMPLETE, 214 method = "getInterpolation", 215 args = {float.class} 216 ) 217 public void testGetInterpolation() { 218 CycleInterpolator cycleInterpolator = new CycleInterpolator(2.0f); 219 final float out1 = cycleInterpolator.getInterpolation(0.0f); 220 final float out2 = cycleInterpolator.getInterpolation(0.125f); 221 final float out3 = cycleInterpolator.getInterpolation(0.25f); 222 final float out4 = cycleInterpolator.getInterpolation(0.375f); 223 final float out5 = cycleInterpolator.getInterpolation(0.5f); 224 final float out6 = cycleInterpolator.getInterpolation(0.625f); 225 final float out7 = cycleInterpolator.getInterpolation(0.75f); 226 final float out8 = cycleInterpolator.getInterpolation(0.875f); 227 final float out9 = cycleInterpolator.getInterpolation(1.0f); 228 final float delta1 = out2 - out1; 229 final float delta2 = out3 - out2; 230 final float delta3 = out4 - out3; 231 final float delta4 = out5 - out4; 232 final float delta5 = out6 - out5; 233 final float delta6 = out7 - out6; 234 final float delta7 = out8 - out7; 235 final float delta8 = out9 - out8; 236 assertEquals(out1, out3, ALPHA_DELTA); 237 assertEquals(out3, out5, ALPHA_DELTA); 238 assertEquals(out5, out7, ALPHA_DELTA); 239 assertEquals(out7, out9, ALPHA_DELTA); 240 assertEquals(delta1, -delta2, ALPHA_DELTA); 241 assertEquals(delta2, delta3, ALPHA_DELTA); 242 assertEquals(delta3, -delta4, ALPHA_DELTA); 243 assertEquals(delta4, delta5, ALPHA_DELTA); 244 assertEquals(delta5, -delta6, ALPHA_DELTA); 245 assertEquals(delta6, delta7, ALPHA_DELTA); 246 assertEquals(delta7, -delta8, ALPHA_DELTA); 247 248 final float timeDelta = 0.015f; 249 assertEquals(cycleInterpolator.getInterpolation(0.0f + timeDelta), 250 cycleInterpolator.getInterpolation(0.5f + timeDelta), ALPHA_DELTA); 251 assertEquals(cycleInterpolator.getInterpolation(0.25f + timeDelta), 252 cycleInterpolator.getInterpolation(0.75f + timeDelta), ALPHA_DELTA); 253 } 254 } 255