package com.basgeekball.awesomevalidation.validators; import android.content.Context; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import com.basgeekball.awesomevalidation.ValidationHolder; import com.basgeekball.awesomevalidation.utility.ValidationCallback; import com.basgeekball.awesomevalidation.utility.ViewsInfo; import junit.framework.TestCase; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.api.support.membermodification.MemberModifier; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; import java.util.ArrayList; import java.util.regex.Matcher; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(PowerMockRunner.class) @PrepareForTest({UnderlabelValidator.class, AnimationUtils.class}) public class UnderlabelValidatorTest extends TestCase { private UnderlabelValidator mSpiedUnderlabelValidator; private ValidationHolder mMockValidationHolder; private Context mMockContext; @Override protected void setUp() throws Exception { super.setUp(); mSpiedUnderlabelValidator = PowerMockito.spy(new UnderlabelValidator()); mMockValidationHolder = mock(ValidationHolder.class, RETURNS_DEEP_STUBS); mSpiedUnderlabelValidator.mValidationHolderList.add(mMockValidationHolder); mMockContext = mock(Context.class); mSpiedUnderlabelValidator.setContext(mMockContext); } public void testValidationCallbackExecute() throws Exception { ValidationCallback validationCallback = Whitebox.getInternalState(mSpiedUnderlabelValidator, "mValidationCallback"); Whitebox.setInternalState(mSpiedUnderlabelValidator, "mHasFailed", false); TextView mockTextView = mock(TextView.class); Matcher mockMatcher = PowerMockito.mock(Matcher.class); Drawable mockDrawable = mock(Drawable.class); when(mMockValidationHolder.getEditText().getBackground()).thenReturn(mockDrawable); doNothing().when(mockDrawable).setColorFilter(anyInt(), any(PorterDuff.Mode.class)); PowerMockito.doReturn(mockTextView).when(mSpiedUnderlabelValidator, "replaceView", mMockValidationHolder); validationCallback.execute(mMockValidationHolder, mockMatcher); } public void testHalt() throws IllegalAccessException { ViewsInfo mockViewsInfo = mock(ViewsInfo.class); ArrayList<ViewsInfo> viewsInfos = new ArrayList<>(); viewsInfos.add(mockViewsInfo); EditText mockEditText = mock(EditText.class); MemberModifier.field(UnderlabelValidator.class, "mViewsInfos").set(mSpiedUnderlabelValidator, viewsInfos); doNothing().when(mockViewsInfo).restoreViews(); when(mMockValidationHolder.getEditText()).thenReturn(mockEditText); when(mockEditText.requestFocus()).thenReturn(true); mSpiedUnderlabelValidator.halt(); assertTrue(viewsInfos.isEmpty()); } public void testReplaceView() throws Exception { EditText mockEditText = mock(EditText.class); ViewGroup mockViewGroup = mock(ViewGroup.class); LinearLayout mockNewContainer = mock(LinearLayout.class); int mockInt = PowerMockito.mock(Integer.class); TextView mockTextView = mock(TextView.class); PowerMockito.mockStatic(AnimationUtils.class); when(mMockValidationHolder.getEditText()).thenReturn(mockEditText); when(mMockValidationHolder.getErrMsg()).thenReturn(PowerMockito.mock(String.class)); when(mockEditText.getParent()).thenReturn(mockViewGroup); when(mockViewGroup.indexOfChild(mockEditText)).thenReturn(mockInt); when(mockEditText.getPaddingLeft()).thenReturn(PowerMockito.mock(Integer.class)); when(mockEditText.getPaddingRight()).thenReturn(PowerMockito.mock(Integer.class)); PowerMockito.whenNew(LinearLayout.class).withArguments(mMockContext).thenReturn(mockNewContainer); PowerMockito.whenNew(TextView.class).withArguments(mMockContext).thenReturn(mockTextView); PowerMockito.when(AnimationUtils.loadAnimation(any(Context.class), anyInt())).thenReturn(mock(Animation.class)); assertEquals(mockTextView, Whitebox.invokeMethod(mSpiedUnderlabelValidator, "replaceView", mMockValidationHolder)); verify(mockViewGroup).addView(mockNewContainer, mockInt); } }