| /* |
| * 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.Element; |
| import com.google.gwt.dom.client.NativeEvent; |
| import com.google.gwt.junit.client.GWTTestCase; |
| import com.google.gwt.user.datepicker.client.CalendarModel; |
| import com.google.gwt.user.datepicker.client.CalendarView; |
| import com.google.gwt.user.datepicker.client.DatePicker; |
| import com.google.gwt.user.datepicker.client.DefaultMonthSelector; |
| |
| import java.util.ArrayList; |
| import java.util.Date; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * Tests DatePicker's public api. |
| */ |
| @SuppressWarnings("deprecation") |
| // Due to Date |
| public class DatePickerTest extends GWTTestCase { |
| |
| private static class DatePickerWithView extends DatePicker { |
| DatePickerWithView(MockCalendarView view) { |
| super(new DefaultMonthSelector(), view, new CalendarModel()); |
| } |
| |
| // give access to the month selector for testing purpose |
| public DefaultMonthSelector getDefaultMonthSelector() { |
| return (DefaultMonthSelector) super.getMonthSelector(); |
| } |
| |
| public CalendarModel getCalendarModel() { |
| return super.getModel(); |
| } |
| } |
| /** |
| * Mock calendar view pretends to show datesVisibleList from the first of the month to |
| * the 30th day after that. |
| */ |
| private static class MockCalendarView extends CalendarView { |
| Map<Date, Set<String>> dateStyles = new HashMap<Date, Set<String>>(); |
| Set<Date> disabledDates = new HashSet<Date>(); |
| |
| MockCalendarView() { |
| initWidget(new Label()); |
| } |
| |
| @Override |
| public void addStyleToDate(String styleName, Date date) { |
| Set<String> fred = dateStyles.get(date); |
| if (fred == null) { |
| fred = new HashSet<String>(); |
| dateStyles.put(date, fred); |
| } |
| fred.add(styleName); |
| } |
| |
| @Override |
| public Date getFirstDate() { |
| Date thisMonth = getModel().getCurrentMonth(); |
| return new Date(thisMonth.getYear(), thisMonth.getMonth(), 1); |
| } |
| |
| @Override |
| public Date getLastDate() { |
| Date thisMonth = getModel().getCurrentMonth(); |
| return new Date(thisMonth.getYear(), thisMonth.getMonth(), 30); |
| } |
| |
| @Override |
| public boolean isDateEnabled(Date date) { |
| return !disabledDates.contains(date); |
| } |
| |
| @Override |
| public void refresh() { |
| } |
| |
| @Override |
| public void removeStyleFromDate(String styleName, Date date) { |
| Set<String> fred; |
| assertNotNull(fred = dateStyles.get(date)); |
| assertTrue(fred.remove(styleName)); |
| } |
| |
| @Override |
| public void setEnabledOnDate(boolean enabled, Date date) { |
| if (enabled) { |
| disabledDates.remove(date); |
| } else { |
| disabledDates.add(date); |
| } |
| } |
| |
| @Override |
| protected void setup() { |
| } |
| } |
| |
| private static final String STYLE_LATER = "styleLater"; |
| |
| private static final String STYLE = "style1"; |
| |
| private DatePickerWithView mockedDatePicker; |
| private MockCalendarView view; |
| |
| private final Date dateVisible1 = new Date(65, 6, 12); |
| private final Date dateVisible2 = new Date(65, 6, 13); |
| private final Date dateVisible3 = new Date(65, 6, 14); |
| private final Date dateVisible4 = new Date(65, 6, 15); |
| private final Date dateVisible5 = new Date(65, 6, 16); |
| private final List<Date> datesVisibleList = new ArrayList<Date>(); |
| private final Date dateLater1 = |
| new Date(dateVisible1.getYear(), dateVisible1.getMonth() + 1, |
| dateVisible1.getDay()); |
| |
| private final Date dateLater2 = |
| new Date(dateVisible2.getYear(), dateVisible2.getMonth() + 1, |
| dateVisible2.getDay()); |
| private final Date dateLater3 = |
| new Date(dateVisible1.getYear(), dateVisible3.getMonth() + 1, |
| dateVisible3.getDay()); |
| private final Date dateLater4 = |
| new Date(dateVisible2.getYear(), dateVisible4.getMonth() + 1, |
| dateVisible4.getDay()); |
| private final Date dateLater5 = |
| new Date(dateVisible1.getYear(), dateVisible5.getMonth() + 1, |
| dateVisible5.getDay()); |
| private final List<Date> datesLaterList = new ArrayList<Date>(); |
| { |
| datesVisibleList.add(dateVisible4); |
| datesVisibleList.add(dateVisible5); |
| } |
| { |
| datesLaterList.add(dateLater4); |
| datesLaterList.add(dateLater5); |
| } |
| |
| @Override |
| public String getModuleName() { |
| return "com.google.gwt.user.User"; |
| } |
| |
| @Override |
| public void gwtSetUp() throws Exception { |
| super.gwtSetUp(); |
| |
| view = new MockCalendarView(); |
| mockedDatePicker = new DatePickerWithView(view); |
| mockedDatePicker.setCurrentMonth(dateVisible1); |
| } |
| |
| public void testDisabling() { |
| mockedDatePicker.setTransientEnabledOnDates(false, dateVisible1); |
| mockedDatePicker.setTransientEnabledOnDates(false, dateVisible2, |
| dateVisible3); |
| mockedDatePicker.setTransientEnabledOnDates(false, datesVisibleList); |
| |
| assertTrue(view.disabledDates.contains(dateVisible1)); |
| assertTrue(view.disabledDates.contains(dateVisible2)); |
| assertTrue(view.disabledDates.contains(dateVisible3)); |
| assertTrue(view.disabledDates.contains(dateVisible4)); |
| assertTrue(view.disabledDates.contains(dateVisible5)); |
| |
| mockedDatePicker.setTransientEnabledOnDates(true, dateVisible1); |
| mockedDatePicker.setTransientEnabledOnDates(true, dateVisible2, |
| dateVisible3); |
| mockedDatePicker.setTransientEnabledOnDates(true, datesVisibleList); |
| |
| assertFalse(view.disabledDates.contains(dateVisible1)); |
| assertFalse(view.disabledDates.contains(dateVisible2)); |
| assertFalse(view.disabledDates.contains(dateVisible3)); |
| assertFalse(view.disabledDates.contains(dateVisible4)); |
| assertFalse(view.disabledDates.contains(dateVisible5)); |
| } |
| |
| public void testMonthNavigation() { |
| DatePickerWithView dp = new DatePickerWithView(new MockCalendarView()); |
| RootPanel.get().add(dp); |
| |
| Date actualDate = new Date(dp.getCalendarModel().getCurrentMonth().getTime()); |
| Date dateAfterOneMonth = new Date(actualDate.getYear(), actualDate.getMonth() + 1, |
| actualDate.getDate()); |
| |
| clickOnNavigationElement(dp.getDefaultMonthSelector().getForwardButtonElement()); |
| |
| Date currentlyDisplayedDate = dp.getCalendarModel().getCurrentMonth(); |
| assertEquals(dateAfterOneMonth.getMonth(), currentlyDisplayedDate.getMonth()); |
| assertEquals(dateAfterOneMonth.getYear(), currentlyDisplayedDate.getYear()); |
| |
| clickOnNavigationElement(dp.getDefaultMonthSelector().getBackwardButtonElement()); |
| |
| assertEquals(actualDate.getMonth(), currentlyDisplayedDate.getMonth()); |
| assertEquals(actualDate.getYear(), currentlyDisplayedDate.getYear()); |
| } |
| |
| public void testMonthNavigationByDropDown() { |
| DatePickerWithView dp = new DatePickerWithView(new MockCalendarView()); |
| dp.setYearAndMonthDropdownVisible(true); |
| RootPanel.get().add(dp); |
| |
| Date actualDate = new Date(dp.getCalendarModel().getCurrentMonth().getTime()); |
| |
| ListBox monthSelect = dp.getDefaultMonthSelector().getMonthSelectListBox(); |
| int newMonth = (monthSelect.getSelectedIndex() + 6) % 12; |
| monthSelect.setSelectedIndex(newMonth); |
| monthSelect.getElement().dispatchEvent(Document.get().createChangeEvent()); |
| |
| Date dateAfter = new Date(actualDate.getYear(), newMonth, actualDate.getDate()); |
| Date currentlyDisplayedDate = dp.getCalendarModel().getCurrentMonth(); |
| |
| assertEquals(dateAfter.getMonth(), currentlyDisplayedDate.getMonth()); |
| assertEquals(dateAfter.getYear(), currentlyDisplayedDate.getYear()); |
| } |
| |
| public void testMonthYearNotSelectableByDefault() { |
| DatePickerWithView dp = new DatePickerWithView(new MockCalendarView()); |
| RootPanel.get().add(dp); |
| |
| assertFalse(dp.getDefaultMonthSelector().getYearSelectListBox().isAttached()); |
| assertFalse(dp.getDefaultMonthSelector().getMonthSelectListBox().isAttached()); |
| |
| String formattedDate = dp.getCalendarModel().formatCurrentMonthAndYear(); |
| String expectedInnerText = "‹" + formattedDate + "›"; |
| assertEquals(expectedInnerText, dp.getDefaultMonthSelector().getElement().getInnerText()); |
| } |
| |
| public void testStyleSetting() { |
| mockedDatePicker.addStyleToDates(STYLE, dateVisible1); |
| mockedDatePicker.addStyleToDates(STYLE, dateVisible2, dateVisible3); |
| mockedDatePicker.addStyleToDates(STYLE, datesVisibleList); |
| |
| assertViewHasStyleOnVisibleDates(STYLE); |
| assertPickerHasStyleOnVisibleDates(STYLE); |
| |
| // See that styles on an invisible datesVisibleList don't |
| |
| mockedDatePicker.addStyleToDates(STYLE_LATER, dateLater1); |
| mockedDatePicker.addStyleToDates(STYLE_LATER, dateLater2, dateLater3); |
| mockedDatePicker.addStyleToDates(STYLE_LATER, datesLaterList); |
| |
| assertViewHasNoStyleOnHiddenDates(); |
| assertPickerLacksStyleOnHiddenDates(STYLE_LATER); |
| |
| // Remove a style from a visible date, and it should leave the view too |
| mockedDatePicker.removeStyleFromDates(STYLE, dateVisible1); |
| mockedDatePicker.removeStyleFromDates(STYLE, dateVisible2, dateVisible3); |
| mockedDatePicker.removeStyleFromDates(STYLE, datesVisibleList); |
| |
| assertViewLacksStyleOnVisibleDates(STYLE); |
| assertPickerLacksStyleOnVisibleDates(); |
| |
| // Remove a style from an invisible date, and the view should not hear |
| // about it (the mock will explode if asked to remove a style it doesn't |
| // have) |
| mockedDatePicker.removeStyleFromDates(STYLE_LATER, dateLater1); |
| mockedDatePicker.removeStyleFromDates(STYLE_LATER, dateLater2, dateLater3); |
| mockedDatePicker.removeStyleFromDates(STYLE_LATER, datesLaterList); |
| assertPickerHasNoStyleOnInvisibleDates(); |
| } |
| |
| public void testTransientStyles() { |
| mockedDatePicker.addTransientStyleToDates(STYLE, dateVisible1); |
| mockedDatePicker.addTransientStyleToDates(STYLE, dateVisible2, |
| dateVisible3); |
| mockedDatePicker.addTransientStyleToDates(STYLE, datesVisibleList); |
| assertViewHasStyleOnVisibleDates(STYLE); |
| assertPickerLacksStyleOnVisibleDates(); |
| |
| mockedDatePicker.removeStyleFromDates(STYLE, dateVisible1); |
| mockedDatePicker.removeStyleFromDates(STYLE, dateVisible2, dateVisible3); |
| mockedDatePicker.removeStyleFromDates(STYLE, datesVisibleList); |
| assertViewLacksStyleOnVisibleDates(STYLE); |
| assertPickerLacksStyleOnVisibleDates(); |
| } |
| |
| public void testValueChangeEvent() { |
| DatePicker dp = new DatePicker(); |
| RootPanel.get().add(dp); |
| new DateValueChangeTester(dp).run(); |
| } |
| |
| public void testValueStyle() { |
| assertNull(mockedDatePicker.getStyleOfDate(dateVisible4)); |
| |
| mockedDatePicker.setValue(dateVisible4); |
| assertTrue(mockedDatePicker.getStyleOfDate(dateVisible4).contains("datePickerDayIsValue")); |
| assertTrue(view.dateStyles.get(dateVisible4).contains("datePickerDayIsValue")); |
| |
| mockedDatePicker.setValue(dateVisible5); |
| assertNull(mockedDatePicker.getStyleOfDate(dateVisible4)); |
| assertFalse(view.dateStyles.get(dateVisible4).contains("datePickerDayIsValue")); |
| } |
| |
| public void testYearNavigation() { |
| DatePickerWithView dp = new DatePickerWithView(new MockCalendarView()); |
| dp.setYearArrowsVisible(true); |
| RootPanel.get().add(dp); |
| |
| Date actualDate = new Date(dp.getCalendarModel().getCurrentMonth().getTime()); |
| Date dateAfterOneYear = new Date(actualDate.getYear() + 1, actualDate.getMonth(), |
| actualDate.getDate()); |
| |
| clickOnNavigationElement(dp.getDefaultMonthSelector().getYearForwardButtonElement()); |
| |
| Date currentlyDisplayedDate = dp.getCalendarModel().getCurrentMonth(); |
| assertEquals(dateAfterOneYear.getMonth(), currentlyDisplayedDate.getMonth()); |
| assertEquals(dateAfterOneYear.getYear(), currentlyDisplayedDate.getYear()); |
| |
| clickOnNavigationElement(dp.getDefaultMonthSelector().getYearBackwardButtonElement()); |
| |
| assertEquals(actualDate.getMonth(), currentlyDisplayedDate.getMonth()); |
| assertEquals(actualDate.getYear(), currentlyDisplayedDate.getYear()); |
| } |
| |
| public void testYearNavigationByDropDown() { |
| DatePickerWithView dp = new DatePickerWithView(new MockCalendarView()); |
| dp.setYearAndMonthDropdownVisible(true); |
| RootPanel.get().add(dp); |
| |
| Date actualDate = new Date(dp.getCalendarModel().getCurrentMonth().getTime()); |
| |
| ListBox yearSelect = dp.getDefaultMonthSelector().getYearSelectListBox(); |
| int newYear = yearSelect.getSelectedIndex() + 5; |
| yearSelect.setSelectedIndex(newYear); |
| yearSelect.getElement().dispatchEvent(Document.get().createChangeEvent()); |
| |
| Date dateAfter = new Date(actualDate.getYear() + 5, actualDate.getMonth(), actualDate.getDate()); |
| Date currentlyDisplayedDate = dp.getCalendarModel().getCurrentMonth(); |
| |
| assertEquals(dateAfter.getMonth(), currentlyDisplayedDate.getMonth()); |
| assertEquals(dateAfter.getYear(), currentlyDisplayedDate.getYear()); |
| } |
| |
| public void testVisibleYearCount() { |
| DatePickerWithView dp = new DatePickerWithView(new MockCalendarView()); |
| dp.setYearAndMonthDropdownVisible(true); |
| dp.setCurrentMonth(new Date(82, 6, 10)); |
| RootPanel.get().add(dp); |
| |
| ListBox yearSelect = dp.getDefaultMonthSelector().getYearSelectListBox(); |
| |
| assertEquals(21 /* the default */, yearSelect.getItemCount()); |
| assertEquals("1972", yearSelect.getItemText(0)); |
| assertEquals("1982", yearSelect.getItemText(10)); |
| assertEquals("1992", yearSelect.getItemText(20)); |
| |
| dp.setVisibleYearCount(1); |
| assertEquals(1, yearSelect.getItemCount()); |
| assertEquals("1982", yearSelect.getItemText(0)); |
| |
| dp.setVisibleYearCount(2); |
| assertEquals(2, yearSelect.getItemCount()); |
| assertEquals("1982", yearSelect.getItemText(0)); |
| assertEquals("1983", yearSelect.getItemText(1)); |
| |
| dp.setVisibleYearCount(3); |
| assertEquals(3, yearSelect.getItemCount()); |
| assertEquals("1981", yearSelect.getItemText(0)); |
| assertEquals("1982", yearSelect.getItemText(1)); |
| assertEquals("1983", yearSelect.getItemText(2)); |
| |
| dp.setVisibleYearCount(10); |
| assertEquals(10, yearSelect.getItemCount()); |
| assertEquals("1978", yearSelect.getItemText(0)); |
| assertEquals("1982", yearSelect.getItemText(4)); |
| assertEquals("1987", yearSelect.getItemText(9)); |
| |
| dp.setVisibleYearCount(11); |
| assertEquals(11, yearSelect.getItemCount()); |
| assertEquals("1977", yearSelect.getItemText(0)); |
| assertEquals("1982", yearSelect.getItemText(5)); |
| assertEquals("1987", yearSelect.getItemText(10)); |
| } |
| |
| public void testYearArrowsVisibility() { |
| DatePickerWithView dp = new DatePickerWithView(new MockCalendarView()); |
| RootPanel.get().add(dp); |
| |
| assertNull(dp.getDefaultMonthSelector().getYearForwardButtonElement().getParentElement()); |
| assertNull(dp.getDefaultMonthSelector().getYearBackwardButtonElement().getParentElement()); |
| |
| dp.setYearArrowsVisible(true); |
| assertNotNull(dp.getDefaultMonthSelector().getYearForwardButtonElement().getParentElement()); |
| assertNotNull(dp.getDefaultMonthSelector().getYearBackwardButtonElement().getParentElement()); |
| |
| dp.setYearArrowsVisible(false); |
| assertNull(dp.getDefaultMonthSelector().getYearForwardButtonElement().getParentElement()); |
| assertNull(dp.getDefaultMonthSelector().getYearBackwardButtonElement().getParentElement()); |
| } |
| |
| private void assertPickerHasNoStyleOnInvisibleDates() { |
| assertNull(mockedDatePicker.getStyleOfDate(dateLater1)); |
| assertNull(mockedDatePicker.getStyleOfDate(dateLater2)); |
| assertNull(mockedDatePicker.getStyleOfDate(dateLater3)); |
| assertNull(mockedDatePicker.getStyleOfDate(dateLater4)); |
| assertNull(mockedDatePicker.getStyleOfDate(dateLater5)); |
| } |
| |
| private void assertPickerHasStyleOnVisibleDates(String style) { |
| assertTrue(mockedDatePicker.getStyleOfDate(dateVisible1).contains( |
| style)); |
| assertTrue(mockedDatePicker.getStyleOfDate(dateVisible2).contains( |
| style)); |
| assertTrue(mockedDatePicker.getStyleOfDate(dateVisible3).contains( |
| style)); |
| assertTrue(mockedDatePicker.getStyleOfDate(dateVisible4).contains( |
| style)); |
| assertTrue(mockedDatePicker.getStyleOfDate(dateVisible5).contains( |
| style)); |
| } |
| |
| private void assertPickerLacksStyleOnHiddenDates(String styleLater) { |
| assertTrue(mockedDatePicker.getStyleOfDate(dateLater1).contains( |
| styleLater)); |
| assertTrue(mockedDatePicker.getStyleOfDate(dateLater2).contains( |
| styleLater)); |
| assertTrue(mockedDatePicker.getStyleOfDate(dateLater3).contains( |
| styleLater)); |
| assertTrue(mockedDatePicker.getStyleOfDate(dateLater4).contains( |
| styleLater)); |
| assertTrue(mockedDatePicker.getStyleOfDate(dateLater5).contains( |
| styleLater)); |
| } |
| |
| private void assertPickerLacksStyleOnVisibleDates() { |
| assertNull(mockedDatePicker.getStyleOfDate(dateVisible1)); |
| assertNull(mockedDatePicker.getStyleOfDate(dateVisible2)); |
| assertNull(mockedDatePicker.getStyleOfDate(dateVisible3)); |
| assertNull(mockedDatePicker.getStyleOfDate(dateVisible4)); |
| assertNull(mockedDatePicker.getStyleOfDate(dateVisible5)); |
| } |
| |
| private void assertViewHasNoStyleOnHiddenDates() { |
| assertNull(view.dateStyles.get(dateLater1)); |
| assertNull(view.dateStyles.get(dateLater2)); |
| assertNull(view.dateStyles.get(dateLater3)); |
| assertNull(view.dateStyles.get(dateLater4)); |
| assertNull(view.dateStyles.get(dateLater5)); |
| } |
| |
| private void assertViewHasStyleOnVisibleDates(String style) { |
| assertTrue(view.dateStyles.get(dateVisible1).contains(style)); |
| assertTrue(view.dateStyles.get(dateVisible2).contains(style)); |
| assertTrue(view.dateStyles.get(dateVisible3).contains(style)); |
| assertTrue(view.dateStyles.get(dateVisible4).contains(style)); |
| assertTrue(view.dateStyles.get(dateVisible5).contains(style)); |
| } |
| |
| private void assertViewLacksStyleOnVisibleDates(String style) { |
| assertFalse(view.dateStyles.get(dateVisible1).contains(style)); |
| assertFalse(view.dateStyles.get(dateVisible2).contains(style)); |
| assertFalse(view.dateStyles.get(dateVisible3).contains(style)); |
| assertFalse(view.dateStyles.get(dateVisible4).contains(style)); |
| assertFalse(view.dateStyles.get(dateVisible5).contains(style)); |
| } |
| |
| private void clickOnNavigationElement(Element e) { |
| e.dispatchEvent(Document.get().createMouseOverEvent(1, 0, 0, 0, 0, false, false, false, |
| false, NativeEvent.BUTTON_LEFT, null)); |
| e.dispatchEvent(Document.get().createMouseDownEvent(1, 0, 0, 0, 0, false, false, false, |
| false, NativeEvent.BUTTON_LEFT)); |
| e.dispatchEvent(Document.get().createMouseUpEvent(1, 0, 0, 0, 0, false, false, false, false, |
| NativeEvent.BUTTON_LEFT)); |
| } |
| } |