blob: fdadc2c5deb71e863af1d598eb2fd6653c58165f [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 com.android.cts.widget.R;
import com.android.internal.util.XmlUtils;
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.os.Parcelable;
import android.test.InstrumentationTestCase;
import android.test.UiThreadTest;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.util.Xml;
import android.view.View;
import android.widget.DatePicker;
/**
* Test {@link DatePicker}.
*/
public class DatePickerTest extends InstrumentationTestCase {
private Context mContext;
@Override
public void setUp() {
mContext = getInstrumentation().getTargetContext();
}
@UiThreadTest
public void testConstructor() {
new DatePicker(mContext);
new DatePicker(mContext, null);
new DatePicker(mContext, getAttributeSet(R.layout.datepicker_layout));
new DatePicker(mContext, getAttributeSet(R.layout.datepicker_layout), 0);
// Test constructor with null Context, in fact, previous two functions will finally invoke
// this version.
try {
// Test with null Context
new DatePicker(null, getAttributeSet(R.layout.datepicker_layout), 0);
fail("should throw NullPointerException");
} catch (Exception e) {
}
}
@UiThreadTest
public void testSetEnabled() {
MockDatePicker datePicker = createDatePicker();
assertTrue(datePicker.isEnabled());
datePicker.setEnabled(false);
assertFalse(datePicker.isEnabled());
datePicker.setEnabled(true);
assertTrue(datePicker.isEnabled());
}
@UiThreadTest
public void testInit() {
MockOnDateChangedListener onDateChangedListener = new MockOnDateChangedListener();
DatePicker datePicker = createDatePicker();
/* The month display uses 1-12 but our internal state stores it
* 0-11 so add one when setting the display.
*/
datePicker.init(2000, 10, 15, onDateChangedListener);
assertEquals(2000, datePicker.getYear());
assertEquals(10, datePicker.getMonth());
assertEquals(15, datePicker.getDayOfMonth());
}
@UiThreadTest
public void testAccessDate() {
DatePicker datePicker = createDatePicker();
/* The month display uses 1-12 but our internal state stores it
* 0-11 so add one when setting the display.
*/
MockOnDateChangedListener onDateChangedListener = new MockOnDateChangedListener();
datePicker.init(2000, 10, 15, onDateChangedListener);
assertEquals(2000, datePicker.getYear());
assertEquals(10, datePicker.getMonth());
assertEquals(15, datePicker.getDayOfMonth());
datePicker.updateDate(1989, 9, 19);
assertEquals(1989, datePicker.getYear());
assertEquals(9, datePicker.getMonth());
assertEquals(19, datePicker.getDayOfMonth());
}
@UiThreadTest
public void testUpdateDate() {
DatePicker datePicker = createDatePicker();
// Test normal input values
/* The month display uses 1-12 but our internal state stores it
* 0-11 so add one when setting the display.
*/
datePicker.updateDate(1989, 9, 19);
assertEquals(1989, datePicker.getYear());
assertEquals(9, datePicker.getMonth());
assertEquals(19, datePicker.getDayOfMonth());
}
@UiThreadTest
public void testOnSaveInstanceState() {
MockDatePicker datePicker = createDatePicker();
datePicker.updateDate(2008, 9, 10);
SparseArray<Parcelable> container = new SparseArray<Parcelable>();
// Test onSaveHierarchyState
assertEquals(View.NO_ID, datePicker.getId());
datePicker.setId(99);
assertFalse(datePicker.hasCalledOnSaveInstanceState());
datePicker.saveHierarchyState(container);
assertEquals(1, datePicker.getChildCount());
assertTrue(datePicker.hasCalledOnSaveInstanceState());
// Test dispatchRestoreInstanceState
datePicker = createDatePicker();
datePicker.setId(99);
assertFalse(datePicker.hasCalledOnRestoreInstanceState());
datePicker.dispatchRestoreInstanceState(container);
assertEquals(2008, datePicker.getYear());
assertEquals(9, datePicker.getMonth());
assertEquals(10, datePicker.getDayOfMonth());
// Test onRestoreInstanceState
assertTrue(datePicker.hasCalledOnRestoreInstanceState());
}
private AttributeSet getAttributeSet(int resourceId) {
final XmlResourceParser parser = mContext.getResources().getXml(resourceId);
try {
XmlUtils.beginDocument(parser, "RelativeLayout");
} catch (Exception e) {
fail("Found unexpected loading process error before invoking generateLayoutParams.");
}
final AttributeSet attr = Xml.asAttributeSet(parser);
assertNotNull(attr);
return attr;
}
private MockDatePicker createDatePicker() {
MockDatePicker datePicker = new MockDatePicker(mContext,
getAttributeSet(R.layout.datepicker_layout));
return datePicker;
}
private class MockDatePicker extends DatePicker {
private boolean mCalledOnSaveInstanceState = false;
private boolean mCalledOnRestoreInstanceState = false;
public MockDatePicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
super.dispatchRestoreInstanceState(container);
}
@Override
protected Parcelable onSaveInstanceState() {
mCalledOnSaveInstanceState = true;
return super.onSaveInstanceState();
}
public boolean hasCalledOnSaveInstanceState() {
return mCalledOnSaveInstanceState;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
mCalledOnRestoreInstanceState = true;
super.onRestoreInstanceState(state);
}
public boolean hasCalledOnRestoreInstanceState() {
return mCalledOnRestoreInstanceState;
}
}
private class MockOnDateChangedListener implements DatePicker.OnDateChangedListener {
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
}
}
}