blob: 7f2e8e9cceb54b96001037a9e39d0d5edd4f809d [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* 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 com.google.gwt.user.client.ui;
import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
import com.google.gwt.user.datepicker.client.CalendarUtil;
import com.google.gwt.user.datepicker.client.DateBox;
import com.google.gwt.user.datepicker.client.DateBox.Format;
import com.google.gwt.user.datepicker.client.DatePicker;
import java.util.Date;
/**
* Tests {@link DateBox}.
*/
public class DateBoxTest extends WidgetTestBase {
@Override
public String getModuleName() {
return "com.google.gwt.user.User";
}
public void testAccessors() {
DateBox db = new DateBox();
assertFalse(db.isDatePickerShowing());
db.showDatePicker();
assertTrue(db.isDatePickerShowing());
db.hideDatePicker();
assertFalse(db.isDatePickerShowing());
}
private static class MillisStrippedValueChangeTester extends DateValueChangeTester {
public MillisStrippedValueChangeTester(DateBox subject) {
super(subject);
subject.setValue(null); // reset to default
}
@Override
protected void normalizeTime(Date highResolutionDate) {
highResolutionDate.setTime((highResolutionDate.getTime() / 1000) * 1000);
}
}
public void testValueChangeEvent() {
final DateBox db = new DateBox();
RootPanel.get().add(db);
// Checks setValue(date, true). Should preserve precision so getValue returns the exact value
// passed by setValue.
new DateValueChangeTester(db).run();
// Check setting the text directly in the text box.
new MillisStrippedValueChangeTester(db) {
@Override
protected void fire(Date d) {
enterViaTextBox(db, d);
}
}.run();
// Checks that selecting a date from date picker works correctly.
new MillisStrippedValueChangeTester(db) {
@Override
protected void fire(Date d) {
selectViaDatePicker(db, d);
}
}.run();
// Checks that setting the date picker's date works correctly.
new MillisStrippedValueChangeTester(db) {
@Override
protected void fire(Date d) {
setViaDatePicker(db, d);
}
}.run();
}
private static class TimeStrippedValueChangeTester extends DateValueChangeTester {
public TimeStrippedValueChangeTester(DateBox subject) {
super(subject);
subject.setValue(null); // reset to default
}
@Override
protected void normalizeTime(Date highResolutionDate) {
CalendarUtil.resetTime(highResolutionDate);
}
}
public void testValueChangeEventWithCustomFormat() {
Format format = new DateBox.DefaultFormat(DateTimeFormat.getFormat("dd/MM/yyyy"));
final DateBox db = new DateBox(new DatePicker(), null, format);
RootPanel.get().add(db);
// Checks setValue(date, true). Should preserve precision so getValue returns the exact value
// passed by setValue.
new DateValueChangeTester(db).run();
// Check setting the text directly in the text box.
new TimeStrippedValueChangeTester(db) {
@Override
protected void fire(Date d) {
enterViaTextBox(db, d);
}
}.run();
// Checks that setting the date picker's date works correctly.
new TimeStrippedValueChangeTester(db) {
@Override
protected void fire(Date d) {
setViaDatePicker(db, d);
}
}.run();
// Checks that selecting a date from date picker works correctly.
new TimeStrippedValueChangeTester(db) {
@Override
protected void fire(Date d) {
selectViaDatePicker(db, d);
}
}.run();
}
private static void enterViaTextBox(DateBox db, Date d) {
// Intended use of higher resolution formatter to test normalization
db.getTextBox().setText(DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_LONG).format(d));
db.getTextBox().getElement().dispatchEvent(Document.get().createBlurEvent());
}
private static void selectViaDatePicker(final DateBox db, Date d) {
// To mimic selection first show the picker
db.showDatePicker();
db.getDatePicker().setValue(d, true);
}
private static void setViaDatePicker(DateBox db, Date d) {
db.getDatePicker().setValue(d, true);
}
public void testFireNullValues() {
DateBox db = new DateBox();
db.setFireNullValues(true);
assertTrue(db.getFireNullValues());
RootPanel.get().add(db);
@SuppressWarnings("unchecked")
final ValueChangeEvent<Date>[] eventHolder = new ValueChangeEvent[1];
final boolean[] wasCalled = new boolean[1];
db.addValueChangeHandler(new ValueChangeHandler<Date>() {
@Override
public void onValueChange(ValueChangeEvent<Date> event) {
wasCalled[0] = true;
eventHolder[0] = event;
}
});
// test that an empty string fires an event
db.setValue(new Date(1976,1,20));
db.getTextBox().setText("");
NativeEvent e = Document.get().createBlurEvent();
db.getTextBox().getElement().dispatchEvent(e);
assertTrue(wasCalled[0]);
assertNull(eventHolder[0].getValue());
// test that an invalid date string fires an event, and leaves the text in
// the textbox
db.setValue(new Date(1976,1,20));
db.getTextBox().setText("abcd");
e = Document.get().createBlurEvent();
db.getTextBox().getElement().dispatchEvent(e);
assertTrue(wasCalled[0]);
assertNull(eventHolder[0].getValue());
assertEquals("abcd", db.getTextBox().getText());
}
}