diff options
| author | 2020-11-26 21:17:12 +0800 | |
|---|---|---|
| committer | 2020-12-03 14:49:20 +0800 | |
| commit | d9061364e3b18d22e32f9c80011e853699cb6037 (patch) | |
| tree | afdd0401e0c6bbb1bfa7b90f73af5fe966bd66cd | |
| parent | 30cadee758a9a1af5aa41496ae99f69049a35b18 (diff) | |
refactor MagnificationModeSwitchTest
We did following change in the refactor.
1. use the spy object instead of mock object if possble to
reduce stubbing unexpected value.
2. Not to use ArgumentCaptor to get TouchListener.
3. set down time to all motion events and recyle them in #tearDown().
4. divide some tests to assert the condition clearly.
Bug: 173159759
Test: atest MagnificationModeSwitchTest
Change-Id: I2218d983541d5b6d2ea1ee7686770ba7fd4dac26
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java | 171 |
1 files changed, 101 insertions, 70 deletions
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java index a0ae35ffef00..11150432f757 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java @@ -29,20 +29,23 @@ import static com.android.systemui.accessibility.MagnificationModeSwitch.FADING_ import static com.android.systemui.accessibility.MagnificationModeSwitch.getIconResId; import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyFloat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.ActivityInfo; +import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; import android.testing.AndroidTestingRunner; @@ -60,15 +63,18 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.util.ArrayList; +import java.util.List; + @SmallTest @RunWith(AndroidTestingRunner.class) public class MagnificationModeSwitchTest extends SysuiTestCase { @@ -81,11 +87,10 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { private AccessibilityManager mAccessibilityManager; @Mock private WindowManager mWindowManager; - @Mock private ViewPropertyAnimator mViewPropertyAnimator; private MagnificationModeSwitch mMagnificationModeSwitch; - @Captor - private ArgumentCaptor<View.OnTouchListener> mTouchListenerCaptor; + private View.OnTouchListener mTouchListener; + private List<MotionEvent> mMotionEvents = new ArrayList<>(); @Before public void setUp() throws Exception { @@ -97,9 +102,23 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { mContext.addMockSystemService(Context.WINDOW_SERVICE, mWindowManager); mContext.addMockSystemService(Context.ACCESSIBILITY_SERVICE, mAccessibilityManager); mSpyImageView = Mockito.spy(new ImageView(mContext)); - resetMockImageViewAndAnimator(); - + mViewPropertyAnimator = Mockito.spy(mSpyImageView.animate()); + resetAndStubMockImageViewAndAnimator(); + doAnswer((invocation) -> { + mTouchListener = invocation.getArgument(0); + return null; + }).when(mSpyImageView).setOnTouchListener( + any(View.OnTouchListener.class)); mMagnificationModeSwitch = new MagnificationModeSwitch(mContext, mSpyImageView); + assertNotNull(mTouchListener); + } + + @After + public void tearDown() { + for (MotionEvent event:mMotionEvents) { + event.recycle(); + } + mMotionEvents.clear(); } @Test @@ -124,7 +143,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { } @Test - public void showMagnificationButton_a11yTimeout_autoFadeOut() { + public void showMagnificationButton_setA11yTimeout_postDelayedAnimationWithA11yTimeout() { final int a11yTimeout = 12345; when(mAccessibilityManager.getRecommendedTimeoutMillis(anyInt(), anyInt())).thenReturn( a11yTimeout); @@ -134,14 +153,21 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { verify(mAccessibilityManager).getRecommendedTimeoutMillis( DEFAULT_FADE_OUT_ANIMATION_DELAY_MS, AccessibilityManager.FLAG_CONTENT_ICONS | AccessibilityManager.FLAG_CONTENT_CONTROLS); - final ArgumentCaptor<Runnable> fadeOutCaptor = ArgumentCaptor.forClass(Runnable.class); - final ArgumentCaptor<Long> fadeOutDelay = ArgumentCaptor.forClass(Long.class); - verify(mSpyImageView).postOnAnimationDelayed(fadeOutCaptor.capture(), - fadeOutDelay.capture()); - assertEquals(a11yTimeout, (long) fadeOutDelay.getValue()); + verify(mSpyImageView).postOnAnimationDelayed(any(Runnable.class), eq((long) a11yTimeout)); + } + + @Test + public void showMagnificationButton_windowMode_verifyAnimationEndAction() { + // Execute the runnable immediately to run the animation. + doAnswer((invocation) -> { + final Runnable action = invocation.getArgument(0); + action.run(); + return null; + }).when(mSpyImageView).postOnAnimationDelayed(any(Runnable.class), anyLong()); + + mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); // Verify the end action after fade-out. - fadeOutCaptor.getValue().run(); final ArgumentCaptor<Runnable> endActionCaptor = ArgumentCaptor.forClass(Runnable.class); verify(mViewPropertyAnimator).withEndAction(endActionCaptor.capture()); @@ -154,7 +180,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { @Test public void onConfigurationChanged_buttonIsShowing_setImageResource() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); - resetMockImageViewAndAnimator(); + resetAndStubMockImageViewAndAnimator(); mMagnificationModeSwitch.onConfigurationChanged(ActivityInfo.CONFIG_DENSITY); @@ -165,42 +191,46 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { @Test public void performSingleTap_fullscreenMode_removeViewAndChangeSettingsValue() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); - resetMockImageViewAndAnimator(); + resetAndStubMockImageViewAndAnimator(); // Perform a single-tap - final View.OnTouchListener listener = mTouchListenerCaptor.getValue(); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, 0, ACTION_DOWN, 100, 100, 0)); + final long downTime = SystemClock.uptimeMillis(); + mTouchListener.onTouch(mSpyImageView, + obtainMotionEvent(downTime, 0, ACTION_DOWN, 100, 100)); + verify(mViewPropertyAnimator).cancel(); - resetMockImageViewAndAnimator(); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, ViewConfiguration.getTapTimeout(), ACTION_UP, 100, 100, 0)); + resetAndStubMockImageViewAndAnimator(); + mTouchListener.onTouch(mSpyImageView, + obtainMotionEvent(downTime, downTime, ACTION_UP, 100, 100)); + verifyTapAction(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); } @Test - public void showMagnificationButton_performDragging_updateViewLayout() { + public void performDragging_showMagnificationButton_updateViewLayout() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); - resetMockImageViewAndAnimator(); - - // Perform dragging - final View.OnTouchListener listener = mTouchListenerCaptor.getValue(); - final int offset = ViewConfiguration.get(mContext).getScaledTouchSlop(); + resetAndStubMockImageViewAndAnimator(); final int previousMode = Settings.Secure.getIntForUser(mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, 0, UserHandle.USER_CURRENT); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, 0, ACTION_DOWN, 100, 100, 0)); + + // Perform dragging + final int offset = ViewConfiguration.get(mContext).getScaledTouchSlop() + 10; + final long downTime = SystemClock.uptimeMillis(); + mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( + downTime, 0, ACTION_DOWN, 100, 100)); verify(mViewPropertyAnimator).cancel(); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, ViewConfiguration.getTapTimeout(), ACTION_MOVE, 100 + offset, 100, 0)); + mTouchListener.onTouch(mSpyImageView, + obtainMotionEvent(downTime, downTime, ACTION_MOVE, 100 + offset, + 100)); verify(mWindowManager).updateViewLayout(eq(mSpyImageView), any(WindowManager.LayoutParams.class)); - resetMockImageViewAndAnimator(); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, ViewConfiguration.getTapTimeout() + 10, ACTION_UP, 100 + offset, 100, 0)); + resetAndStubMockImageViewAndAnimator(); + mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( + downTime, downTime, ACTION_UP, 100 + offset, 100)); + assertModeUnchanged(previousMode); assertShowFadingAnimation(FADE_OUT_ALPHA); } @@ -208,18 +238,17 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { @Test public void performSingleTapActionCanceled_showButtonAnimation() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); - resetMockImageViewAndAnimator(); - - // Perform single tap - final View.OnTouchListener listener = mTouchListenerCaptor.getValue(); + resetAndStubMockImageViewAndAnimator(); final int previousMode = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, 0); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, 0, ACTION_DOWN, 100, 100, 0)); - resetMockImageViewAndAnimator(); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, ViewConfiguration.getTapTimeout(), ACTION_CANCEL, 100, 100, 0)); + final long downTime = SystemClock.uptimeMillis(); + mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( + downTime, downTime, ACTION_DOWN, 100, 100)); + resetAndStubMockImageViewAndAnimator(); + mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( + downTime, downTime, ACTION_CANCEL, 100, 100)); + assertModeUnchanged(previousMode); assertShowFadingAnimation(FADE_OUT_ALPHA); } @@ -227,21 +256,21 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { @Test public void performDraggingActionCanceled_showButtonAnimation() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); - resetMockImageViewAndAnimator(); - - // Perform dragging - final View.OnTouchListener listener = mTouchListenerCaptor.getValue(); - final int offset = ViewConfiguration.get(mContext).getScaledTouchSlop(); + resetAndStubMockImageViewAndAnimator(); final int previousMode = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, 0); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, 0, ACTION_DOWN, 100, 100, 0)); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, ViewConfiguration.getTapTimeout(), ACTION_MOVE, 100 + offset, 100, 0)); - - resetMockImageViewAndAnimator(); - listener.onTouch(mSpyImageView, MotionEvent.obtain( - 0, ViewConfiguration.getTapTimeout(), ACTION_CANCEL, 100 + offset, 100, 0)); + + // Perform dragging + final long downTime = SystemClock.uptimeMillis(); + final int offset = ViewConfiguration.get(mContext).getScaledTouchSlop() + 10; + mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( + 0, 0, ACTION_DOWN, 100, 100)); + mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( + downTime, downTime, ACTION_MOVE, 100 + offset, 100)); + resetAndStubMockImageViewAndAnimator(); + mTouchListener.onTouch(mSpyImageView, obtainMotionEvent( + downTime, downTime, ACTION_CANCEL, 100 + offset, 100)); + assertModeUnchanged(previousMode); assertShowFadingAnimation(FADE_OUT_ALPHA); } @@ -266,7 +295,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { @Test public void performA11yActions_showWindowModeButton_verifyTapAction() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW); - resetMockImageViewAndAnimator(); + resetAndStubMockImageViewAndAnimator(); mSpyImageView.performAccessibilityAction( ACTION_CLICK.getId(), null); @@ -278,7 +307,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { public void showButton_showFadeOutAnimation_fadeOutAnimationCanceled() { mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); assertShowFadingAnimation(FADE_OUT_ALPHA); - resetMockImageViewAndAnimator(); + resetAndStubMockImageViewAndAnimator(); mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); @@ -327,7 +356,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { } else { // Fade-out verify(mSpyImageView).postOnAnimationDelayed(runnableCaptor.capture(), anyLong()); } - resetMockAnimator(); + resetAndStubMockAnimator(); runnableCaptor.getValue().run(); @@ -336,20 +365,15 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { verify(mViewPropertyAnimator).start(); } - private void resetMockImageViewAndAnimator() { + private void resetAndStubMockImageViewAndAnimator() { + resetAndStubMockAnimator(); Mockito.reset(mSpyImageView); - doAnswer(invocation -> null).when(mSpyImageView).setOnTouchListener( - mTouchListenerCaptor.capture()); - resetMockAnimator(); + doReturn(mViewPropertyAnimator).when(mSpyImageView).animate(); } - private void resetMockAnimator() { + private void resetAndStubMockAnimator() { Mockito.reset(mViewPropertyAnimator); - when(mViewPropertyAnimator.setDuration(anyLong())).thenReturn(mViewPropertyAnimator); - when(mViewPropertyAnimator.alpha(anyFloat())).thenReturn(mViewPropertyAnimator); - when(mViewPropertyAnimator.withEndAction(any(Runnable.class))).thenReturn( - mViewPropertyAnimator); - when(mSpyImageView.animate()).thenReturn(mViewPropertyAnimator); + doNothing().when(mViewPropertyAnimator).start(); } /** @@ -366,4 +390,11 @@ public class MagnificationModeSwitchTest extends SysuiTestCase { Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE, 0, UserHandle.USER_CURRENT); assertEquals(expectedMode, actualMode); } + + private MotionEvent obtainMotionEvent(long downTime, long eventTime, int action, float x, + float y) { + MotionEvent event = MotionEvent.obtain(downTime, eventTime, action, x, y, 0); + mMotionEvents.add(event); + return event; + } } |