package com.premnirmal.Magnet; import android.content.Context; import android.content.res.Resources; import android.util.DisplayMetrics; import android.view.Display; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.ImageView; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static org.mockito.Mockito.verify; import static org.powermock.api.mockito.PowerMockito.doReturn; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.whenNew; import static org.powermock.reflect.Whitebox.setInternalState; @RunWith(PowerMockRunner.class) @PrepareForTest({ RemoveView.class, Magnet.class }) public class MagnetOnTouchTest { private Magnet magnet; private View viewMock; private MotionEvent motionEventMock; private Magnet.MoveAnimator moveAnimatorMock; private RemoveView removeViewMock; @Before public void setUp() throws Exception { Display displayMock = mock(Display.class); Resources resourcesMock = mock(Resources.class); Context contextMock = mock(Context.class); DisplayMetrics displayMetricsMock = mock(DisplayMetrics.class); int initialX = 2; int initialY = 4; displayMetricsMock.widthPixels = initialX; displayMetricsMock.heightPixels = initialY; removeViewMock = mock(RemoveView.class); WindowManager windowManagerMock = mock(WindowManager.class); IconCallback iconCallbackMock = mock(IconCallback.class); ImageView iconViewMock = mock(ImageView.class); LayoutParams paramsMock = mock(LayoutParams.class); doReturn(windowManagerMock).when(contextMock).getSystemService(Context.WINDOW_SERVICE); doReturn(displayMetricsMock).when(resourcesMock).getDisplayMetrics(); doReturn(displayMock).when(windowManagerMock).getDefaultDisplay(); doReturn(resourcesMock).when(contextMock).getResources(); whenNew(RemoveView.class).withArguments(contextMock).thenReturn(removeViewMock); whenNew(DisplayMetrics.class).withNoArguments().thenReturn(displayMetricsMock); whenNew(LayoutParams.class).withAnyArguments().thenReturn(paramsMock); GestureDetector gestureDetectorMock = mock(GestureDetector.class); whenNew(GestureDetector.class).withAnyArguments().thenReturn(gestureDetectorMock); motionEventMock = mock(MotionEvent.class); doReturn(false).when(gestureDetectorMock).onTouchEvent(motionEventMock); moveAnimatorMock = mock(Magnet.MoveAnimator.class); magnet = Magnet.newBuilder(contextMock).setIconView(iconViewMock) .setIconCallback(iconCallbackMock) .setRemoveIconResId(R.drawable.trash) .setRemoveIconShadow(R.drawable.bottom_shadow) .setShouldFlingAway(true) .setShouldStickToWall(true) .setRemoveIconShouldBeResponsive(true) .setInitialPosition(initialX, initialY) .build(); setInternalState(magnet, "mAnimator", moveAnimatorMock); setInternalState(magnet, "mLayoutParams", paramsMock); viewMock = mock(View.class); } @Test public void testOnTouchActionDown() throws Exception { // given doReturn(MotionEvent.ACTION_DOWN).when(motionEventMock).getAction(); // when magnet.onTouch(viewMock, motionEventMock); // then verify(moveAnimatorMock).stop(); } @Test public void testOnTouchActionUp() throws Exception { // given doReturn(MotionEvent.ACTION_UP).when(motionEventMock).getAction(); // when magnet.onTouch(viewMock, motionEventMock); // then verify(moveAnimatorMock).start(0, 0); } @Test public void testOnTouchActionMove() throws Exception { // given setInternalState(magnet, "isBeingDragged", true); doReturn(MotionEvent.ACTION_MOVE).when(motionEventMock).getAction(); // when magnet.onTouch(viewMock, motionEventMock); // then verify(removeViewMock).onMove(0, 0); } }