1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.systemui.qs; 16 17 import android.support.test.runner.AndroidJUnit4; 18 import android.test.suitebuilder.annotation.SmallTest; 19 import android.view.View; 20 import com.android.systemui.qs.TouchAnimator.Listener; 21 import com.android.systemui.SysuiTestCase; 22 import org.junit.Before; 23 import org.junit.runner.RunWith; 24 import org.junit.Test; 25 import org.mockito.Mockito; 26 27 import static junit.framework.Assert.assertEquals; 28 29 @SmallTest 30 @RunWith(AndroidJUnit4.class) 31 public class TouchAnimatorTest extends SysuiTestCase { 32 33 private Listener mTouchListener; 34 private View mTestView; 35 36 @Before 37 public void setUp() throws Exception { 38 mTestView = new View(getContext()); 39 mTouchListener = Mockito.mock(Listener.class); 40 } 41 42 @Test 43 public void testSetValueFloat() { 44 TouchAnimator animator = new TouchAnimator.Builder() 45 .addFloat(mTestView, "x", 0, 50) 46 .build(); 47 48 animator.setPosition(0); 49 assertEquals(0f, mTestView.getX()); 50 51 animator.setPosition(.5f); 52 assertEquals(25f, mTestView.getX()); 53 54 animator.setPosition(1); 55 assertEquals(50f, mTestView.getX()); 56 } 57 58 @Test 59 public void testSetValueInt() { 60 TouchAnimator animator = new TouchAnimator.Builder() 61 .addInt(mTestView, "top", 0, 50) 62 .build(); 63 64 animator.setPosition(0); 65 assertEquals(0, mTestView.getTop()); 66 67 animator.setPosition(.5f); 68 assertEquals(25, mTestView.getTop()); 69 70 animator.setPosition(1); 71 assertEquals(50, mTestView.getTop()); 72 } 73 74 @Test 75 public void testStartDelay() { 76 TouchAnimator animator = new TouchAnimator.Builder() 77 .addFloat(mTestView, "x", 0, 50) 78 .setStartDelay(.5f) 79 .build(); 80 81 animator.setPosition(0); 82 assertEquals(0f, mTestView.getX()); 83 84 animator.setPosition(.5f); 85 assertEquals(0f, mTestView.getX()); 86 87 animator.setPosition(.75f); 88 assertEquals(25f, mTestView.getX()); 89 90 animator.setPosition(1); 91 assertEquals(50f, mTestView.getX()); 92 } 93 94 @Test 95 public void testEndDelay() { 96 TouchAnimator animator = new TouchAnimator.Builder() 97 .addFloat(mTestView, "x", 0, 50) 98 .setEndDelay(.5f) 99 .build(); 100 101 animator.setPosition(0); 102 assertEquals(0f, mTestView.getX()); 103 104 animator.setPosition(.25f); 105 assertEquals(25f, mTestView.getX()); 106 107 animator.setPosition(.5f); 108 assertEquals(50f, mTestView.getX()); 109 110 animator.setPosition(1); 111 assertEquals(50f, mTestView.getX()); 112 } 113 114 @Test 115 public void testOnAnimationAtStartCallback() { 116 TouchAnimator animator = new TouchAnimator.Builder() 117 .setListener(mTouchListener) 118 .build(); 119 120 // Called on init. 121 animator.setPosition(0); 122 verifyOnAnimationAtStart(1); 123 124 // Not called from same state. 125 animator.setPosition(0); 126 verifyOnAnimationAtStart(1); 127 128 // Called after starting and moving back to start. 129 animator.setPosition(.5f); 130 animator.setPosition(0); 131 verifyOnAnimationAtStart(2); 132 133 // Called when move from end to end. 134 animator.setPosition(1); 135 animator.setPosition(0); 136 verifyOnAnimationAtStart(3); 137 } 138 139 @Test 140 public void testOnAnimationAtEndCallback() { 141 TouchAnimator animator = new TouchAnimator.Builder() 142 .setListener(mTouchListener) 143 .build(); 144 145 // Called on init. 146 animator.setPosition(1); 147 verifyOnAnimationAtEnd(1); 148 149 // Not called from same state. 150 animator.setPosition(1); 151 verifyOnAnimationAtEnd(1); 152 153 // Called after starting and moving back to end. 154 animator.setPosition(.5f); 155 animator.setPosition(1); 156 verifyOnAnimationAtEnd(2); 157 158 // Called when move from end to end. 159 animator.setPosition(0); 160 animator.setPosition(1); 161 verifyOnAnimationAtEnd(3); 162 } 163 164 @Test 165 public void testOnAnimationStartedCallback() { 166 TouchAnimator animator = new TouchAnimator.Builder() 167 .setListener(mTouchListener) 168 .build(); 169 170 // Called on init. 171 animator.setPosition(.5f); 172 verifyOnAnimationStarted(1); 173 174 // Not called from same state. 175 animator.setPosition(.6f); 176 verifyOnAnimationStarted(1); 177 178 // Called after going to end then moving again. 179 animator.setPosition(1); 180 animator.setPosition(.5f); 181 verifyOnAnimationStarted(2); 182 183 // Called after moving to start then moving again. 184 animator.setPosition(0); 185 animator.setPosition(.5f); 186 verifyOnAnimationStarted(3); 187 } 188 189 // TODO: Add test for interpolator. 190 191 private void verifyOnAnimationAtStart(int times) { 192 Mockito.verify(mTouchListener, Mockito.times(times)).onAnimationAtStart(); 193 } 194 195 private void verifyOnAnimationAtEnd(int times) { 196 Mockito.verify(mTouchListener, Mockito.times(times)).onAnimationAtEnd(); 197 } 198 199 private void verifyOnAnimationStarted(int times) { 200 Mockito.verify(mTouchListener, Mockito.times(times)).onAnimationStarted(); 201 } 202 } 203