package com.xtremelabs.robolectric.shadows; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; import android.util.AttributeSet; import android.widget.EditText; import com.xtremelabs.robolectric.WithTestDefaultsRunner; @RunWith(WithTestDefaultsRunner.class) public class EditTextTest { @Test public void shouldBeFocusableByDefault() throws Exception { assertTrue(new EditText(null).isFocusable()); assertTrue(new EditText(null).isFocusableInTouchMode()); } @Test public void givenInitializingWithAttributeSet_whenMaxLengthDefined_thenRestrictTextLengthToMaxLength() { int maxLength = anyInteger(); AttributeSet attrs = attributeSetWithMaxLength(maxLength); EditText editText = new EditText(null, attrs); String excessiveInput = stringOfLength(maxLength * 2); editText.setText(excessiveInput); assertThat(editText.getText().toString(), equalTo(excessiveInput.subSequence(0, maxLength))); } @Test public void givenInitializingWithAttributeSet_whenMaxLengthNotDefined_thenTextLengthShouldHaveNoRestrictions() { AttributeSet attrs = attributeSetWithoutMaxLength(); EditText editText = new EditText(null, attrs); String input = anyString(); editText.setText(input); assertThat(editText.getText().toString(), equalTo(input)); } @Test public void whenInitializingWithoutAttributeSet_thenTextLengthShouldHaveNoRestrictions() { EditText editText = new EditText(null); String input = anyString(); editText.setText(input); assertThat(editText.getText().toString(), equalTo(input)); } private String anyString() { return stringOfLength(anyInteger()); } private String stringOfLength(int length) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < length; i++) stringBuilder.append('x'); return stringBuilder.toString(); } private int anyInteger() { return new Random().nextInt(1000) + 1; } private AttributeSet attributeSetWithMaxLength(int maxLength) { AttributeSet attrs = mock(AttributeSet.class); when(attrs.getAttributeIntValue(eq("android"), eq("maxLength"), anyInt())).thenReturn(maxLength); return attrs; } private AttributeSet attributeSetWithoutMaxLength() { AttributeSet attrs = mock(AttributeSet.class); when(attrs.getAttributeIntValue("android", "maxLength", Integer.MAX_VALUE)).thenReturn(Integer.MAX_VALUE); return attrs; } }