package com.premnirmal.Magnet;
import android.content.Context;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
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 junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.whenNew;
import static org.powermock.reflect.internal.WhiteboxImpl.getInternalState;
@RunWith(PowerMockRunner.class) @PrepareForTest({ RemoveView.class, LayoutInflater.class })
public class RemoveViewTest {
private RemoveView removeView;
private ImageView buttonImageMock;
private View shadowMock;
private SimpleAnimator simpleAnimatorMockFadeIn;
private SimpleAnimator simpleAnimatorMockFadeOut;
private View buttonMock;
private Context contextMock;
private int buttonBottomPaddingTest = 10;
@Before public void setUp() throws Exception {
contextMock = mock(Context.class);
LayoutInflater layoutInflaterMock = mock(LayoutInflater.class);
mockStatic(LayoutInflater.class);
when(LayoutInflater.from(contextMock)).thenReturn(layoutInflaterMock);
View layoutMock = mock(View.class);
buttonMock = mock(View.class);
shadowMock = mock(View.class);
buttonImageMock = mock(ImageView.class);
WindowManager windowManagerMock = mock(WindowManager.class);
SimpleAnimator simpleAnimatorMockShow = mock(SimpleAnimator.class);
SimpleAnimator simpleAnimatorMockHide = mock(SimpleAnimator.class);
simpleAnimatorMockFadeIn = mock(SimpleAnimator.class);
simpleAnimatorMockFadeOut = mock(SimpleAnimator.class);
whenNew(SimpleAnimator.class).withArguments(buttonMock, R.anim.slide_up)
.thenReturn(simpleAnimatorMockShow);
whenNew(SimpleAnimator.class).withArguments(buttonMock, R.anim.slide_down)
.thenReturn(simpleAnimatorMockHide);
whenNew(SimpleAnimator.class).withArguments(shadowMock, android.R.anim.fade_in)
.thenReturn(simpleAnimatorMockFadeIn);
whenNew(SimpleAnimator.class).withArguments(shadowMock, android.R.anim.fade_out)
.thenReturn(simpleAnimatorMockFadeOut);
doReturn(layoutMock).when(layoutInflaterMock).inflate(R.layout.x_button_holder, null);
doReturn(buttonMock).when(layoutMock).findViewById(R.id.xButton);
doReturn(shadowMock).when(layoutMock).findViewById(R.id.shadow);
doReturn(buttonImageMock).when(layoutMock).findViewById(R.id.xButtonImg);
doReturn(windowManagerMock).when(contextMock).getSystemService(Context.WINDOW_SERVICE);
doReturn(buttonBottomPaddingTest).when(buttonMock).getPaddingBottom();
WindowManager.LayoutParams paramsMock = mock(WindowManager.LayoutParams.class);
whenNew(WindowManager.LayoutParams.class).withAnyArguments().thenReturn(paramsMock);
removeView = new RemoveView(contextMock);
}
@Test public void testSetIconResId() {
// given
int iconResId = R.drawable.bottom_shadow;
// when
removeView.setIconResId(iconResId);
// then
verify(buttonImageMock).setImageResource(iconResId);
}
@Test public void testSetShadowBG() {
// given
int bottomShadow = R.drawable.bottom_shadow;
// when
removeView.setShadowBG(bottomShadow);
// then
verify(shadowMock).setBackgroundResource(bottomShadow);
}
@Test public void testShow() {
// when
removeView.show();
// then
verify(simpleAnimatorMockFadeIn).startAnimation();
verify(simpleAnimatorMockFadeOut).startAnimation();
}
@Test public void testOnMoveXBiggerThanZero() {
// given
DisplayMetrics displayMetricsMock = mock(DisplayMetrics.class);
Resources resourcesMock = mock(Resources.class);
doReturn(contextMock).when(buttonMock).getContext();
doReturn(resourcesMock).when(contextMock).getResources();
doReturn(displayMetricsMock).when(resourcesMock).getDisplayMetrics();
displayMetricsMock.widthPixels = 2;
int x = 1;
int xTransformed = Math.abs(x * 100 / (displayMetricsMock.widthPixels / 2));
int bottomPadding = buttonBottomPaddingTest - (xTransformed / 5);
// when
removeView.onMove(x, 1);
// then
verify(buttonMock).setPadding(xTransformed, 0, 0, bottomPadding);
}
@Test public void testOnMoveXSmallerThanZero() {
// given
DisplayMetrics displayMetricsMock = mock(DisplayMetrics.class);
Resources resourcesMock = mock(Resources.class);
doReturn(contextMock).when(buttonMock).getContext();
doReturn(resourcesMock).when(contextMock).getResources();
doReturn(displayMetricsMock).when(resourcesMock).getDisplayMetrics();
displayMetricsMock.widthPixels = 2;
int x = -1;
int xTransformed = Math.abs(x * 100 / (displayMetricsMock.widthPixels / 2));
int bottomPadding = buttonBottomPaddingTest - (xTransformed / 5);
// when
removeView.onMove(x, 1);
// then
verify(buttonMock).setPadding(0, 0, xTransformed, bottomPadding);
}
@Test public void testDestroy() {
// given
assertNotNull("mLayout field musn't be null before destroy method call",
getInternalState(removeView, "mLayout"));
assertNotNull("mWindowManager field musn't be null before destroy method call",
getInternalState(removeView, "mWindowManager"));
// when
removeView.destroy();
// then
assertNull("mLayout field must be set to null after destroy method call",
getInternalState(removeView, "mLayout"));
assertNull("mWindowManager field must be set to null after destroy method call",
getInternalState(removeView, "mWindowManager"));
}
}