blob: 810276a1bb1215e2e6606230b2373589b07d4bf0 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.widget.cts;
import static com.android.compatibility.common.util.WidgetTestUtils.sameCharSequence;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import android.app.Activity;
import android.app.Instrumentation;
import android.content.Context;
import android.text.Spannable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Xml;
import android.view.KeyCharacterMap;
import android.widget.DialerFilter;
import android.widget.EditText;
import android.widget.RelativeLayout;
import androidx.test.InstrumentationRegistry;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.SmallTest;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
import com.android.compatibility.common.util.CtsKeyEventUtil;
import com.android.compatibility.common.util.PollingCheck;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.xmlpull.v1.XmlPullParser;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class DialerFilterTest {
private Activity mActivity;
private Instrumentation mInstrumentation;
private DialerFilter mDialerFilter;
@Rule
public ActivityTestRule<DialerFilterCtsActivity> mActivityRule =
new ActivityTestRule<>(DialerFilterCtsActivity.class);
@Before
public void setup() {
mInstrumentation = InstrumentationRegistry.getInstrumentation();
mActivity = mActivityRule.getActivity();
PollingCheck.waitFor(mActivity::hasWindowFocus);
mDialerFilter = (DialerFilter) mActivity.findViewById(R.id.dialer_filter);
}
@UiThreadTest
@Test
public void testConstructor() {
final XmlPullParser parser = mActivity.getResources().getXml(R.layout.dialerfilter_layout);
final AttributeSet attrs = Xml.asAttributeSet(parser);
new DialerFilter(mActivity);
new DialerFilter(mActivity, attrs);
}
@UiThreadTest
@Test
public void testIsQwertyKeyboard() {
// Simply call the method. Return value may depend on the default keyboard.
mDialerFilter.isQwertyKeyboard();
}
@Test
public void testOnKeyUpDown() throws Throwable {
// The exact behavior depends on the implementation of DialerKeyListener and
// TextKeyListener, but even that may be changed. Simply assert basic scenarios.
mActivityRule.runOnUiThread(() -> {
mDialerFilter.setMode(DialerFilter.DIGITS_ONLY);
mDialerFilter.requestFocus();
});
mInstrumentation.waitForIdleSync();
assertTrue(mDialerFilter.hasFocus());
CtsKeyEventUtil.sendString(mInstrumentation, mDialerFilter, "123");
assertEquals("", mDialerFilter.getLetters().toString());
assertEquals("123", mDialerFilter.getDigits().toString());
mActivityRule.runOnUiThread(() -> {
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.LETTERS_ONLY);
});
mInstrumentation.waitForIdleSync();
// 12-key support
KeyCharacterMap keymap
= KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
if (keymap.getKeyboardType() == KeyCharacterMap.NUMERIC) {
// "adg" in case of 12-key(NUMERIC) keyboard
CtsKeyEventUtil.sendString(mInstrumentation, mDialerFilter, "234");
}
else {
CtsKeyEventUtil.sendString(mInstrumentation, mDialerFilter, "adg");
}
assertEquals("ADG", mDialerFilter.getLetters().toString());
assertEquals("", mDialerFilter.getDigits().toString());
mActivityRule.runOnUiThread(() -> {
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
});
mInstrumentation.waitForIdleSync();
// 12-key support
if (keymap.getKeyboardType() == KeyCharacterMap.NUMERIC) {
// "adg" in case of 12-key(NUMERIC) keyboard
CtsKeyEventUtil.sendString(mInstrumentation, mDialerFilter, "234");
}
else {
CtsKeyEventUtil.sendString(mInstrumentation, mDialerFilter, "adg");
}
assertEquals("ADG", mDialerFilter.getLetters().toString());
// A, D, K may map to numbers on some keyboards. Don't test.
mActivityRule.runOnUiThread(() -> {
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
});
mInstrumentation.waitForIdleSync();
CtsKeyEventUtil.sendString(mInstrumentation, mDialerFilter, "123");
// 1, 2, 3 may map to letters on some keyboards. Don't test.
assertEquals("123", mDialerFilter.getDigits().toString());
}
@UiThreadTest
@Test
public void testAccessMode() {
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS_NO_LETTERS);
assertEquals(DialerFilter.DIGITS_AND_LETTERS_NO_LETTERS, mDialerFilter.getMode());
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
assertEquals(DialerFilter.DIGITS_AND_LETTERS, mDialerFilter.getMode());
mDialerFilter.setMode(-1);
assertEquals(-1, mDialerFilter.getMode());
}
@UiThreadTest
@Test
public void testGetLetters() {
assertEquals("", mDialerFilter.getLetters().toString());
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
mDialerFilter.append("ANDROID");
assertEquals("ANDROID", mDialerFilter.getLetters().toString());
}
@UiThreadTest
@Test
public void testGetDigits() {
assertEquals("", mDialerFilter.getDigits().toString());
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
mDialerFilter.append("12345");
assertEquals("12345", mDialerFilter.getDigits().toString());
}
@UiThreadTest
@Test
public void testGetFilterText() {
assertEquals("", mDialerFilter.getFilterText().toString());
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
mDialerFilter.append("CTS12345");
assertEquals("CTS12345", mDialerFilter.getFilterText().toString());
mDialerFilter.setMode(DialerFilter.DIGITS_ONLY);
assertEquals("12345", mDialerFilter.getFilterText().toString());
mDialerFilter.setMode(DialerFilter.LETTERS_ONLY);
assertEquals("CTS12345", mDialerFilter.getFilterText().toString());
}
@UiThreadTest
@Test
public void testAppend() {
mDialerFilter.setMode(DialerFilter.LETTERS_ONLY);
mDialerFilter.append("ANDROID");
assertEquals("ANDROID", mDialerFilter.getLetters().toString());
assertEquals("", mDialerFilter.getDigits().toString());
assertEquals("ANDROID", mDialerFilter.getFilterText().toString());
mDialerFilter.setMode(DialerFilter.DIGITS_ONLY);
mDialerFilter.append("123");
assertEquals("", mDialerFilter.getLetters().toString());
assertEquals("123", mDialerFilter.getDigits().toString());
assertEquals("123", mDialerFilter.getFilterText().toString());
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
mDialerFilter.append("ABC123DEF456GHI789");
assertEquals("ABC123DEF456GHI789", mDialerFilter.getLetters().toString());
assertEquals("123456789", mDialerFilter.getDigits().toString());
assertEquals("ABC123DEF456GHI789", mDialerFilter.getFilterText().toString());
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS_NO_DIGITS);
mDialerFilter.append("ABC123DEF456GHI789");
assertEquals("ABC123DEF456GHI789", mDialerFilter.getLetters().toString());
assertEquals("", mDialerFilter.getDigits().toString());
assertEquals("ABC123DEF456GHI789", mDialerFilter.getFilterText().toString());
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS_NO_LETTERS);
mDialerFilter.append("ABC123DEF456GHI789");
assertEquals("", mDialerFilter.getLetters().toString());
assertEquals("123456789", mDialerFilter.getDigits().toString());
assertEquals("", mDialerFilter.getFilterText().toString());
mDialerFilter.clearText();
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
mDialerFilter.append("");
assertEquals("", mDialerFilter.getLetters().toString());
assertEquals("", mDialerFilter.getDigits().toString());
assertEquals("", mDialerFilter.getFilterText().toString());
}
@UiThreadTest
@Test(expected=NullPointerException.class)
public void testAppendNull() {
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
mDialerFilter.append(null);
}
@UiThreadTest
@Test
public void testClearText() {
assertEquals("", mDialerFilter.getLetters().toString());
assertEquals("", mDialerFilter.getDigits().toString());
mDialerFilter.setMode(DialerFilter.DIGITS_AND_LETTERS);
mDialerFilter.append("CTS12345");
assertEquals("CTS12345", mDialerFilter.getLetters().toString());
assertEquals("12345", mDialerFilter.getDigits().toString());
mDialerFilter.clearText();
assertEquals("", mDialerFilter.getLetters().toString());
assertEquals("", mDialerFilter.getDigits().toString());
assertEquals(DialerFilter.DIGITS_AND_LETTERS, mDialerFilter.getMode());
}
@UiThreadTest
@Test
public void testSetLettersWatcher() {
final TextWatcher mockTextWatcher = mock(TextWatcher.class);
Spannable span = (Spannable) mDialerFilter.getLetters();
assertEquals(-1, span.getSpanStart(mockTextWatcher));
assertEquals(-1, span.getSpanEnd(mockTextWatcher));
mDialerFilter.setMode(DialerFilter.LETTERS_ONLY);
mDialerFilter.setLettersWatcher(mockTextWatcher);
mDialerFilter.append("ANDROID");
verify(mockTextWatcher, times(1)).onTextChanged(sameCharSequence("ANDROID"), eq(0),
eq(0), eq(7));
span = (Spannable) mDialerFilter.getLetters();
assertEquals(0, span.getSpanStart(mockTextWatcher));
assertEquals(mDialerFilter.getLetters().length(), span.getSpanEnd(mockTextWatcher));
assertEquals("ANDROID", span.toString());
reset(mockTextWatcher);
mDialerFilter.setLettersWatcher(mockTextWatcher);
mDialerFilter.append("");
verifyZeroInteractions(mockTextWatcher);
}
@UiThreadTest
@Test(expected=NullPointerException.class)
public void testSetLettersWatcherWithNullAppend() {
final TextWatcher mockTextWatcher = mock(TextWatcher.class);
mDialerFilter.setLettersWatcher(mockTextWatcher);
mDialerFilter.append(null);
}
@UiThreadTest
@Test
public void testSetDigitsWatcher() {
final TextWatcher mockTextWatcher = mock(TextWatcher.class);
Spannable span = (Spannable) mDialerFilter.getDigits();
assertEquals(-1, span.getSpanStart(mockTextWatcher));
assertEquals(-1, span.getSpanEnd(mockTextWatcher));
mDialerFilter.setDigitsWatcher(mockTextWatcher);
assertEquals(0, span.getSpanStart(mockTextWatcher));
assertEquals(mDialerFilter.getDigits().length(), span.getSpanEnd(mockTextWatcher));
mDialerFilter.setMode(DialerFilter.DIGITS_ONLY);
mDialerFilter.append("12345");
verify(mockTextWatcher, times(1)).onTextChanged(sameCharSequence("12345"), eq(0),
eq(0), eq(5));
}
@UiThreadTest
@Test
public void testSetFilterWatcher() {
final TextWatcher mockTextWatcher = mock(TextWatcher.class);
Spannable span = (Spannable) mDialerFilter.getLetters();
assertEquals(-1, span.getSpanStart(mockTextWatcher));
assertEquals(-1, span.getSpanEnd(mockTextWatcher));
mDialerFilter.setMode(DialerFilter.LETTERS_ONLY);
mDialerFilter.setFilterWatcher(mockTextWatcher);
mDialerFilter.append("ANDROID");
verify(mockTextWatcher, times(1)).onTextChanged(sameCharSequence("ANDROID"), eq(0),
eq(0), eq(7));
span = (Spannable) mDialerFilter.getLetters();
assertEquals(0, span.getSpanStart(mockTextWatcher));
assertEquals(mDialerFilter.getLetters().length(), span.getSpanEnd(mockTextWatcher));
mDialerFilter.setMode(DialerFilter.DIGITS_ONLY);
mDialerFilter.setFilterWatcher(mockTextWatcher);
mDialerFilter.append("12345");
verify(mockTextWatcher, times(1)).onTextChanged(sameCharSequence("12345"), eq(0),
eq(0), eq(5));
}
@UiThreadTest
@Test
public void testRemoveFilterWatcher() {
final TextWatcher mockTextWatcher = mock(TextWatcher.class);
Spannable span = (Spannable) mDialerFilter.getLetters();
assertEquals(-1, span.getSpanStart(mockTextWatcher));
assertEquals(-1, span.getSpanEnd(mockTextWatcher));
mDialerFilter.setMode(DialerFilter.LETTERS_ONLY);
mDialerFilter.setFilterWatcher(mockTextWatcher);
mDialerFilter.append("ANDROID");
verify(mockTextWatcher, times(1)).onTextChanged(sameCharSequence("ANDROID"), eq(0),
eq(0), eq(7));
span = (Spannable) mDialerFilter.getLetters();
assertEquals(0, span.getSpanStart(mockTextWatcher));
assertEquals(mDialerFilter.getLetters().length(), span.getSpanEnd(mockTextWatcher));
reset(mockTextWatcher);
mDialerFilter.removeFilterWatcher(mockTextWatcher);
mDialerFilter.append("GOLF");
verifyZeroInteractions(mockTextWatcher);
assertEquals(-1, span.getSpanStart(mockTextWatcher));
assertEquals(-1, span.getSpanEnd(mockTextWatcher));
}
@UiThreadTest
@Test
public void testOnModeChange() {
final MockDialerFilter dialerFilter = createMyDialerFilter();
dialerFilter.onFinishInflate();
assertEquals(0, dialerFilter.getOldMode());
assertEquals(MockDialerFilter.DIGITS_AND_LETTERS, dialerFilter.getNewMode());
dialerFilter.setMode(MockDialerFilter.DIGITS_AND_LETTERS_NO_LETTERS);
assertEquals(MockDialerFilter.DIGITS_AND_LETTERS, dialerFilter.getOldMode());
assertEquals(MockDialerFilter.DIGITS_AND_LETTERS_NO_LETTERS, dialerFilter.getNewMode());
dialerFilter.setMode(MockDialerFilter.DIGITS_AND_LETTERS_NO_DIGITS);
assertEquals(MockDialerFilter.DIGITS_AND_LETTERS_NO_LETTERS, dialerFilter.getOldMode());
assertEquals(MockDialerFilter.DIGITS_AND_LETTERS_NO_DIGITS, dialerFilter.getNewMode());
}
private MockDialerFilter createMyDialerFilter() {
final MockDialerFilter dialerFilter = new MockDialerFilter(mActivity);
final EditText text1 = new EditText(mActivity);
text1.setId(android.R.id.hint);
final EditText text2 = new EditText(mActivity);
text2.setId(android.R.id.primary);
dialerFilter.addView(text1, new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT));
dialerFilter.addView(text2, new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT));
return dialerFilter;
}
/**
* MockDialerFilter for test
*/
private class MockDialerFilter extends DialerFilter {
private int mOldMode = 0;
private int mNewMode = 0;
public MockDialerFilter(Context context) {
super(context);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
}
@Override
protected void onModeChange(final int oldMode, final int newMode) {
super.onModeChange(oldMode, newMode);
mOldMode = oldMode;
mNewMode = newMode;
}
public int getOldMode() {
return mOldMode;
}
public int getNewMode() {
return mNewMode;
}
}
}