AI 145532: am: CL 145524 am: CL 145245 CTS: add test cases for android.widget.TimePicker.
Original author: sus
Merged from: //branches/cupcake/...
Original author: android-build
Automated import of CL 145532
diff --git a/tests/res/layout/timepicker.xml b/tests/res/layout/timepicker.xml
new file mode 100644
index 0000000..352f69b
--- /dev/null
+++ b/tests/res/layout/timepicker.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<TimePicker xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
diff --git a/tests/tests/widget/src/android/widget/cts/TimePickerTest.java b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
new file mode 100644
index 0000000..49e67b7
--- /dev/null
+++ b/tests/tests/widget/src/android/widget/cts/TimePickerTest.java
@@ -0,0 +1,460 @@
+/*
+ * 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 com.android.internal.R;
+
+import dalvik.annotation.TestLevel;
+import dalvik.annotation.TestTargetClass;
+import dalvik.annotation.TestTargetNew;
+import dalvik.annotation.TestTargets;
+import dalvik.annotation.ToBeFixed;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.content.Context;
+import android.os.Parcelable;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.util.AttributeSet;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TimePicker;
+import android.widget.TimePicker.OnTimeChangedListener;
+
+import java.text.DateFormatSymbols;
+import java.util.Calendar;
+
+/**
+ * Test {@link TimePicker}.
+ */
+@TestTargetClass(TimePicker.class)
+public class TimePickerTest extends ActivityInstrumentationTestCase2<StubActivity> {
+ private TimePicker mTimePicker;
+
+ private Activity mActivity;
+
+ private Context mContext;
+
+ private Instrumentation mInstrumentation;
+
+ public TimePickerTest() {
+ super("com.android.cts.stub", StubActivity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mInstrumentation = getInstrumentation();
+ mContext = mInstrumentation.getTargetContext();
+ mActivity = getActivity();
+ }
+
+ @TestTargets({
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "TimePicker",
+ args = {Context.class}
+ ),
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "TimePicker",
+ args = {Context.class, AttributeSet.class}
+ ),
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "TimePicker",
+ args = {Context.class, AttributeSet.class, int.class}
+ )
+ })
+ @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete."
+ + " @throws clause should be added into javadoc of "
+ + "TimePicker#TimePicker(Context), TimePicker#TimePicker(Context, AttributeSet)"
+ + "and TimePicker#TimePicker(Context, AttributeSet, int) when param Context is null")
+ public void testConstructors() {
+ AttributeSet attrs =
+ mContext.getResources().getLayout(com.android.cts.stub.R.layout.timepicker);
+ assertNotNull(attrs);
+
+ new TimePicker(mContext);
+ try {
+ new TimePicker(null);
+ fail("did not throw NullPointerException when param context is null.");
+ } catch (NullPointerException e) {
+ // expected
+ }
+
+ new TimePicker(mContext, attrs);
+ try {
+ new TimePicker(null, attrs);
+ fail("did not throw NullPointerException when param context is null.");
+ } catch (NullPointerException e) {
+ // expected
+ }
+ new TimePicker(mContext, null);
+
+ new TimePicker(mContext, attrs, 0);
+ try {
+ new TimePicker(null, attrs, 0);
+ fail("did not throw NullPointerException when param context is null.");
+ } catch (NullPointerException e) {
+ // expected
+ }
+ new TimePicker(mContext, null, 0);
+ new TimePicker(mContext, attrs, 0);
+ new TimePicker(mContext, attrs, Integer.MIN_VALUE);
+ }
+
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "setEnabled",
+ args = {boolean.class}
+ )
+ public void testSetEnabled() {
+ mTimePicker = new TimePicker(mContext);
+ assertTrue(mTimePicker.isEnabled());
+ assertTrue(mTimePicker.findViewById(R.id.minute).isEnabled());
+ assertTrue(mTimePicker.findViewById(R.id.hour).isEnabled());
+ assertTrue(mTimePicker.findViewById(R.id.amPm).isEnabled());
+
+ mTimePicker.setEnabled(false);
+ assertFalse(mTimePicker.isEnabled());
+ assertFalse(mTimePicker.findViewById(R.id.minute).isEnabled());
+ assertFalse(mTimePicker.findViewById(R.id.hour).isEnabled());
+ assertFalse(mTimePicker.findViewById(R.id.amPm).isEnabled());
+
+ mTimePicker.setEnabled(true);
+ assertTrue(mTimePicker.isEnabled());
+ assertTrue(mTimePicker.findViewById(R.id.minute).isEnabled());
+ assertTrue(mTimePicker.findViewById(R.id.hour).isEnabled());
+ assertTrue(mTimePicker.findViewById(R.id.amPm).isEnabled());
+ }
+
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "setOnTimeChangedListener",
+ args = {OnTimeChangedListener.class}
+ )
+ @UiThreadTest
+ public void testClickTimePicker() {
+ int initialHour = 12;
+ int initialMinute = 50;
+ mTimePicker = new TimePicker(mContext);
+ DateFormatSymbols dfs = new DateFormatSymbols();
+ String[] dfsAmPm = dfs.getAmPmStrings();
+ String amText = dfsAmPm[Calendar.AM];
+ String pmText = dfsAmPm[Calendar.PM];
+ EditText hourText = (EditText) mTimePicker.findViewById(R.id.hour)
+ .findViewById(R.id.timepicker_input);
+ EditText minuteText = (EditText) mTimePicker.findViewById(R.id.minute)
+ .findViewById(R.id.timepicker_input);
+ Button amPmButton = (Button) mTimePicker.findViewById(R.id.amPm);
+
+ mTimePicker.setIs24HourView(false);
+ mTimePicker.setCurrentHour(Integer.valueOf(initialHour));
+ mTimePicker.setCurrentMinute(Integer.valueOf(initialMinute));
+ MockOnTimeChangeListener listener = new MockOnTimeChangeListener();
+ mTimePicker.setOnTimeChangedListener(listener);
+
+ assertEquals(initialHour, Integer.parseInt(hourText.getText().toString()));
+ assertEquals(initialMinute, Integer.parseInt(minuteText.getText().toString()));
+ assertEquals(pmText, amPmButton.getText().toString());
+
+ // layout it
+ mActivity.setContentView(mTimePicker);
+ // increase hour
+ listener.reset();
+ mTimePicker.findViewById(R.id.hour).findViewById(R.id.increment).performClick();
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(1, Integer.parseInt(hourText.getText().toString()));
+ assertEquals(initialMinute, Integer.parseInt(minuteText.getText().toString()));
+ assertEquals(pmText, amPmButton.getText().toString());
+
+ // decrease hour
+ listener.reset();
+ mTimePicker.findViewById(R.id.hour).findViewById(R.id.decrement).performClick();
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(initialHour, Integer.parseInt(hourText.getText().toString()));
+ assertEquals(initialMinute, Integer.parseInt(minuteText.getText().toString()));
+ assertEquals(pmText, amPmButton.getText().toString());
+
+ // increase minute
+ listener.reset();
+ mTimePicker.findViewById(R.id.minute).findViewById(R.id.increment).performClick();
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(initialHour, Integer.parseInt(hourText.getText().toString()));
+ assertEquals(initialMinute + 1, Integer.parseInt(minuteText.getText().toString()));
+ assertEquals(pmText, amPmButton.getText().toString());
+
+ // decrease minute
+ listener.reset();
+ mTimePicker.findViewById(R.id.minute).findViewById(R.id.decrement).performClick();
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(initialHour, Integer.parseInt(hourText.getText().toString()));
+ assertEquals(initialMinute, Integer.parseInt(minuteText.getText().toString()));
+ assertEquals(pmText, amPmButton.getText().toString());
+
+ // change ampm
+ listener.reset();
+ mTimePicker.findViewById(R.id.amPm).performClick();
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(initialHour, Integer.parseInt(hourText.getText().toString()));
+ assertEquals(initialMinute, Integer.parseInt(minuteText.getText().toString()));
+ assertEquals(amText, amPmButton.getText().toString());
+ }
+
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "setOnTimeChangedListener",
+ args = {OnTimeChangedListener.class}
+ )
+ public void testSetOnTimeChangedListener() {
+ int initialHour = 13;
+ int initialMinute = 50;
+ mTimePicker = new TimePicker(mContext);
+ mTimePicker.setCurrentHour(Integer.valueOf(initialHour));
+ mTimePicker.setCurrentMinute(Integer.valueOf(initialMinute));
+ MockOnTimeChangeListener listener = new MockOnTimeChangeListener();
+ mTimePicker.setOnTimeChangedListener(listener);
+
+ // set the same hour as current
+ listener.reset();
+ mTimePicker.setCurrentHour(Integer.valueOf(initialHour));
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(initialHour, listener.getNotifiedHourOfDay());
+ assertEquals(initialMinute, listener.getNotifiedMinute());
+ assertSame(mTimePicker, listener.getNotifiedView());
+
+ listener.reset();
+ mTimePicker.setCurrentHour(Integer.valueOf(initialHour + 1));
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(initialHour + 1, listener.getNotifiedHourOfDay());
+ assertEquals(initialMinute, listener.getNotifiedMinute());
+ assertSame(mTimePicker, listener.getNotifiedView());
+
+ // set the same minute as current
+ listener.reset();
+ mTimePicker.setCurrentMinute(initialMinute);
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(initialHour + 1, listener.getNotifiedHourOfDay());
+ assertEquals(initialMinute, listener.getNotifiedMinute());
+ assertSame(mTimePicker, listener.getNotifiedView());
+
+ listener.reset();
+ mTimePicker.setCurrentMinute(initialMinute + 1);
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(initialHour + 1, listener.getNotifiedHourOfDay());
+ assertEquals(initialMinute + 1, listener.getNotifiedMinute());
+ assertSame(mTimePicker, listener.getNotifiedView());
+
+ // change time picker mode
+ listener.reset();
+ mTimePicker.setIs24HourView( !mTimePicker.is24HourView() );
+ assertTrue(listener.hasCalledOnTimeChanged());
+ assertEquals(initialHour + 1, listener.getNotifiedHourOfDay());
+ assertEquals(initialMinute + 1, listener.getNotifiedMinute());
+ assertSame(mTimePicker, listener.getNotifiedView());
+ }
+
+ @TestTargets({
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "setCurrentHour",
+ args = {Integer.class}
+ ),
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "getCurrentHour",
+ args = {}
+ )
+ })
+ @ToBeFixed(bug = "1695243", explanation = "setCurrentHour should be in range 0~23")
+ public void testAccessCurrentHour() {
+ mTimePicker = new TimePicker(mContext);
+
+ // AM/PM mode
+ mTimePicker.setIs24HourView(false);
+
+ mTimePicker.setCurrentHour(0);
+ assertEquals(Integer.valueOf(0), mTimePicker.getCurrentHour());
+
+ mTimePicker.setCurrentHour(12);
+ assertEquals(Integer.valueOf(12), mTimePicker.getCurrentHour());
+
+ mTimePicker.setCurrentHour(13);
+ assertEquals(Integer.valueOf(13), mTimePicker.getCurrentHour());
+
+ mTimePicker.setCurrentHour(23);
+ assertEquals(Integer.valueOf(23), mTimePicker.getCurrentHour());
+
+ // for 24 hour mode
+ mTimePicker.setIs24HourView(true);
+
+ mTimePicker.setCurrentHour(0);
+ assertEquals(Integer.valueOf(0), mTimePicker.getCurrentHour());
+
+ mTimePicker.setCurrentHour(13);
+ assertEquals(Integer.valueOf(13), mTimePicker.getCurrentHour());
+
+ mTimePicker.setCurrentHour(23);
+ assertEquals(Integer.valueOf(23), mTimePicker.getCurrentHour());
+ }
+
+ @TestTargets({
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "is24HourView",
+ args = {}
+ ),
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "setIs24HourView",
+ args = {java.lang.Boolean.class}
+ )
+ })
+ public void testAccessIs24HourView() {
+ mTimePicker = new TimePicker(mContext);
+ assertFalse(mTimePicker.is24HourView());
+
+ mTimePicker.setIs24HourView(true);
+ assertTrue(mTimePicker.is24HourView());
+
+ mTimePicker.setIs24HourView(false);
+ assertFalse(mTimePicker.is24HourView());
+ }
+
+ @TestTargets({
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "setCurrentMinute",
+ args = {Integer.class}
+ ),
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "getCurrentMinute",
+ args = {}
+ )
+ })
+ public void testAccessCurrentMinute() {
+ mTimePicker = new TimePicker(mContext);
+
+ mTimePicker.setCurrentMinute(0);
+ assertEquals(Integer.valueOf(0), mTimePicker.getCurrentMinute());
+
+ mTimePicker.setCurrentMinute(12);
+ assertEquals(Integer.valueOf(12), mTimePicker.getCurrentMinute());
+
+ mTimePicker.setCurrentMinute(33);
+ assertEquals(Integer.valueOf(33), mTimePicker.getCurrentMinute());
+
+ mTimePicker.setCurrentMinute(59);
+ assertEquals(Integer.valueOf(59), mTimePicker.getCurrentMinute());
+ }
+
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "getBaseline",
+ args = {}
+ )
+ public void testGetBaseline() {
+ mTimePicker = new TimePicker(mContext);
+ assertEquals(-1, mTimePicker.getBaseline());
+ }
+
+ @TestTargets({
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "onSaveInstanceState",
+ args = {}
+ ),
+ @TestTargetNew(
+ level = TestLevel.COMPLETE,
+ method = "onRestoreInstanceState",
+ args = {Parcelable.class}
+ )
+ })
+ public void testOnSaveInstanceStateAndOnRestoreInstanceState() {
+ MyTimePicker source = new MyTimePicker(mContext);
+ MyTimePicker dest = new MyTimePicker(mContext);
+ int expectHour = dest.getCurrentHour() + 10;
+ int expectMinute = dest.getCurrentMinute() + 10;
+ source.setCurrentHour(expectHour);
+ source.setCurrentMinute(expectMinute);
+
+ Parcelable p = source.onSaveInstanceState();
+ dest.onRestoreInstanceState(p);
+
+ assertEquals(Integer.valueOf(expectHour), dest.getCurrentHour());
+ assertEquals(Integer.valueOf(expectMinute), dest.getCurrentMinute());
+ }
+
+ private class MockOnTimeChangeListener implements OnTimeChangedListener {
+ private TimePicker mNotifiedView;
+
+ private boolean mHasCalledOnTimeChanged;
+
+ private int mNotifiedHourOfDay;
+
+ private int mNotifiedMinute;;
+
+ public boolean hasCalledOnTimeChanged() {
+ return mHasCalledOnTimeChanged;
+ }
+
+ public TimePicker getNotifiedView() {
+ return mNotifiedView;
+ }
+
+ public int getNotifiedHourOfDay() {
+ return mNotifiedHourOfDay;
+ }
+
+ public int getNotifiedMinute() {
+ return mNotifiedMinute;
+ }
+
+ public void reset() {
+ mNotifiedView = null;
+ mNotifiedHourOfDay = 0;
+ mNotifiedMinute = 0;
+ mHasCalledOnTimeChanged = false;
+ }
+
+ public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
+ mNotifiedView = view;
+ mNotifiedHourOfDay = hourOfDay;
+ mNotifiedMinute = minute;
+ mHasCalledOnTimeChanged = true;
+ }
+ }
+
+ private class MyTimePicker extends TimePicker {
+ public MyTimePicker(Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ super.onRestoreInstanceState(state);
+ }
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ return super.onSaveInstanceState();
+ }
+ }
+}