/* * 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.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()); } } /** * 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); } 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 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")); } 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)); } }