/** * $Id$ * * Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jdesktop.swingx; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import java.awt.Color; import java.awt.ComponentOrientation; import java.awt.Font; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.lang.reflect.InvocationTargetException; import java.text.DateFormatSymbols; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.SortedSet; import java.util.TimeZone; import java.util.TreeSet; import java.util.logging.Logger; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.SwingUtilities; import javax.swing.UIManager; import org.jdesktop.swingx.calendar.CalendarUtils; import org.jdesktop.swingx.calendar.DateSelectionModel; import org.jdesktop.swingx.calendar.DaySelectionModel; import org.jdesktop.swingx.calendar.SingleDaySelectionModel; import org.jdesktop.swingx.calendar.DateSelectionModel.SelectionMode; import org.jdesktop.swingx.event.DateSelectionEvent.EventType; import org.jdesktop.swingx.hyperlink.AbstractHyperlinkAction; import org.jdesktop.swingx.test.DateSelectionReport; import org.jdesktop.test.ActionReport; import org.jdesktop.test.PropertyChangeReport; import org.jdesktop.test.TestUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Test case for <code>JXMonthView</code> * * There's another class with passing unit tests for JXMonthView (JXMonthViewVisualTest) * because this * extended mock while the other extends InteractiveTestCase. Both are expected * to pass. As mock had been removed, they should be merged. * * @author Joshua Outwater */ @RunWith(JUnit4.class) public class JXMonthViewTest extends InteractiveTestCase { private static final Logger LOG = Logger.getLogger(JXMonthViewTest.class .getName()); private Locale componentLocale; // pre-defined reference dates - all relative to current date at around 5 am private Date today; private Date tomorrow; private Date afterTomorrow; private Date yesterday; // calendar default instance init with today private Calendar calendar; private JXMonthView monthView; @Override @Before public void setUp() { calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 5); today = calendar.getTime(); calendar.add(Calendar.DAY_OF_MONTH, -1); yesterday = calendar.getTime(); calendar.add(Calendar.DAY_OF_MONTH, 2); tomorrow = calendar.getTime(); calendar.add(Calendar.DAY_OF_MONTH, 1); afterTomorrow = calendar.getTime(); calendar.setTime(today); //the test is configured for a US defaulted system //the localization tests handle actual localization issues componentLocale = JComponent.getDefaultLocale(); // LOG.info("componentLocale " + componentLocale); // JComponent.setDefaultLocale(Locale.US); monthView = new JXMonthView(); } @Override @After public void tearDown() { JComponent.setDefaultLocale(componentLocale); } public static void main(String[] args) { JXMonthViewTest test = new JXMonthViewTest(); try { test.runInteractiveTests(); } catch (Exception e) { e.printStackTrace(); } } /** * Issue #1318-swingx: NPE in removeNotify * @throws InvocationTargetException * @throws InterruptedException */ @Test public void testTodayTimerNPE() throws InterruptedException, InvocationTargetException { // This test will not work in a headless configuration. if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run ui test - headless environment"); return; } JXMonthView monthView = new JXMonthView(); final JXFrame frame = new JXFrame(); frame.add(monthView); SwingUtilities.invokeAndWait(new Runnable() { public void run() { frame.dispose(); } }); } /** * Issue #1046-swingx: month title not updated when traversing months * (programatically or by navigating in monthView) * Issue #1245-swingx: incorrect month/dayofweek names for non-core-supported Locales. * */ @Test public void testZoomableNameByLocaleProvider() { Locale serbianLatin = getLocal("sh"); if (serbianLatin == null) { LOG.fine("can't run, no service provider for serbian latin" ); return; } JXMonthView monthView = new JXMonthView(); AbstractHyperlinkAction<?> action = (AbstractHyperlinkAction<?>) monthView.getActionMap().get("zoomOut"); assertSame(monthView, action.getTarget()); monthView.setLocale(serbianLatin); String[] monthNames = DateFormatSymbols.getInstance(monthView.getLocale()).getMonths(); Calendar calendar = monthView.getCalendar(); int month = calendar.get(Calendar.MONTH); assertTrue("name must be updated with locale, expected: " + monthNames[month] + " was: " + action.getName(), action.getName().startsWith(monthNames[month])); } /** * @param string * @return */ private Locale getLocal(String language) { Locale[] available = Locale.getAvailableLocales(); for (Locale locale : available) { if (language.equals(locale.getLanguage())) return locale; } return null; } /** * Issue #1143-swingx: NPE after setTimeZone/setModel. */ @Test public void testFirstDisplayedDayAfterTimeZone() { JXMonthView monthView = new JXMonthView(); TimeZone tz = TimeZone.getTimeZone("GMT+4"); if (monthView.getTimeZone().equals(tz)) { tz = TimeZone.getTimeZone("GMT+5"); } monthView.setTimeZone(tz); assertTrue(CalendarUtils.isStartOfDay(monthView.getCalendar())); monthView.setSelectionModel(new SingleDaySelectionModel()); assertTrue(CalendarUtils.isStartOfDay(monthView.getCalendar())); } /** * Issue #1125-swingx: JXMonthView today incorrect. * */ @Test public void testUpdateTodayInAddNotify() { // This test will not work in a headless configuration. if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run ui test - headless environment"); return; } Clock clock = new Clock(); clock.nextDay(); JXMonthView monthView = createMonthViewWithClock(clock); assertEquals("sanity: monthView takes clock current initially", CalendarUtils.startOfDay(monthView.getCalendar(), clock.getCurrentDate()), monthView.getToday()); // increment clock clock.nextDay(); // realize monthView showInFrame(monthView, ""); assertEquals(" monthView must update today in addNotify", CalendarUtils.startOfDay(monthView.getCalendar(), clock.getCurrentDate()), monthView.getToday()); } /** * Creates and returns a JXMonthView which uses the given time source for current. * * @param clock the time source used by monthView. */ public static JXMonthView createMonthViewWithClock(final Clock clock) { JXMonthView monthView = new JXMonthView() { @Override Date getCurrentDate() { return clock.getCurrentDate(); } }; return monthView; } /** * Quick class to inject a current time source. */ public static class Clock { private static int millisPerDay = 24 * 60 * 60 * 1000; private Date current; /** * Instantiates a time source with default current. */ public Clock() { this(null); } /** * Instantiates a time source with the given date as current. If null, uses * System.currentTimeMillis(). * * @param date the current date. */ public Clock(Date date) { this.current = date != null ? date : new Date(System.currentTimeMillis()); } /** * Returns the current time. * * @return current time. */ public Date getCurrentDate() { return current; } /** * Increments current by one day. */ public void nextDay() { current = new Date(current.getTime() + millisPerDay); } } /** * Issue #1072-swingx: nav icons incorrect for RToL if zoomable */ @Test public void testNavigationIconsUpdatedWithCO() { Action action = monthView.getActionMap().get("nextMonth"); if (monthView.getComponentOrientation().isLeftToRight()) { Icon icon = (Icon) action.getValue(Action.SMALL_ICON); assertNotNull("sanity: the decorated month nav action has an icon", icon); assertEquals(UIManager.getIcon("JXMonthView.monthUpFileName"), icon); monthView.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); // assertNotSame(icon, action.getValue(Action.SMALL_ICON)); assertEquals(action.getValue(Action.SMALL_ICON), UIManager.getIcon("JXMonthView.monthDownFileName")); } else { } } /** * Issue #1046-swingx: month title not updated when traversing months * (programatically or by navigating in monthView) */ @Test public void testZoomableNameOnMonthChange() { JXMonthView monthView = new JXMonthView(); AbstractHyperlinkAction<?> action = (AbstractHyperlinkAction<?>) monthView.getActionMap().get("zoomOut"); assertSame(monthView, action.getTarget()); String[] monthNames = DateFormatSymbols.getInstance(monthView.getLocale()).getMonths(); Calendar calendar = monthView.getCalendar(); int month = calendar.get(Calendar.MONTH); assertTrue(action.getName().startsWith(monthNames[month])); calendar.add(Calendar.MONTH, 1); monthView.setFirstDisplayedDay(calendar.getTime()); int nextMonth = calendar.get(Calendar.MONTH); assertTrue("month changed: old/new " + month + "/" + nextMonth, nextMonth != month); assertTrue("name must be updated, expected: " + monthNames[nextMonth] + " was: " + action.getName() , action.getName().startsWith(monthNames[nextMonth])); } /** * Issue #1046-swingx: month title not updated when traversing months * (programatically or by navigating in monthView) */ @Test public void testZoomableNameOnLocaleChange() { JXMonthView monthView = new JXMonthView(); AbstractHyperlinkAction<?> action = (AbstractHyperlinkAction<?>) monthView.getActionMap().get("zoomOut"); assertSame(monthView, action.getTarget()); Locale locale = Locale.FRENCH; if (locale.equals(monthView.getLocale())) { locale = Locale.GERMAN; } monthView.setLocale(locale); String[] monthNames = DateFormatSymbols.getInstance(monthView.getLocale()).getMonths(); Calendar calendar = monthView.getCalendar(); int month = calendar.get(Calendar.MONTH); assertTrue("name must be updated with locale, expected: " + monthNames[month] + " was: " + action.getName(), action.getName().startsWith(monthNames[month])); } /** * Issue #1046-swingx: month title not updated when traversing months * (programatically or by navigating in monthView) * * Test that zoomOutActin is installed for zoomable. */ @Test public void testZoomableZoomOutAction() { JXMonthView monthView = new JXMonthView(); assertNotNull("monthView must have zoomOutAction", monthView.getActionMap().get("zoomOut")); monthView.setZoomable(true); assertNotNull("monthView must have zoomOutAction", monthView.getActionMap().get("zoomOut")); } /** * Test that navigational actions are installed */ @Test public void testNavigationActionsInstalled() { JXMonthView monthView = new JXMonthView(); assertActionInstalled(monthView, "scrollToNextMonth"); assertActionInstalled(monthView, "scrollToPreviousMonth"); // actions mapped by CalendarHeaderHandler assertActionInstalled(monthView, "nextMonth"); assertActionInstalled(monthView, "previousMonth"); } /** * @param monthView * @param actionKey */ private void assertActionInstalled(JXMonthView monthView, String actionKey) { assertNotNull("ui must have installed action for " + actionKey, monthView.getActionMap().get(actionKey)); } /** * Test that navigational actions are working as expected. */ @Test public void testNavigationActionsWorking() { assertActionPerformed(new JXMonthView(), "scrollToNextMonth", Calendar.MONTH, 1); assertActionPerformed(new JXMonthView(), "nextMonth", Calendar.MONTH, 1); assertActionPerformed(new JXMonthView(), "scrollToPreviousMonth", Calendar.MONTH, -1); assertActionPerformed(new JXMonthView(), "previousMonth", Calendar.MONTH, -1); } private void assertActionPerformed(JXMonthView monthView, String actionKey, int calendarField, int amount) { Calendar calendar = monthView.getCalendar(); calendar.add(calendarField, amount); Action action = monthView.getActionMap().get(actionKey); action.actionPerformed(null); assertEquals(calendar.getTime(), monthView.getFirstDisplayedDay()); } @Test public void testZoomableProperty() { assertFalse("default zoomable is off", monthView.isZoomable()); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setZoomable(true); TestUtils.assertPropertyChangeEvent(report, "zoomable", false, true); assertTrue("traversable follows zoomable", monthView.isTraversable()); } /** * Issue #932-swingx: ui overwrites custom settings. * test daysoftheweekforeground property. * */ @Test public void testDaysOfTheWeekForegroundUpdateUI() { Color old = monthView.getDaysOfTheWeekForeground(); Color color = Color.PINK; if (color.equals(old)) { color = Color.MAGENTA; } monthView.setDaysOfTheWeekForeground(color); monthView.updateUI(); assertEquals(color, monthView.getDaysOfTheWeekForeground()); } /** * Issue #??-swingx: test accaptable values in setDayForeground. * Doc'ed to accept Calendar.SUNDAY - Calendar.SATURDAY, but not * enforced. * */ @Test(expected=IllegalArgumentException.class) public void testDayForegroundBeforeSunday() { monthView.setDayForeground(Calendar.SUNDAY - 1, Color.RED); } /** * Issue #??-swingx: test accaptable values in setDayForeground. * Doc'ed to accept Calendar.SUNDAY - Calendar.SATURDAY, but not * enforced. * */ @Test(expected=IllegalArgumentException.class) public void testDayForegroundAfterSaturday() { monthView.setDayForeground(Calendar.SATURDAY + 1, Color.RED); } /** * Issue #931-swingx: missing change notification. * test setting monthStringInsets property. * */ @Test public void testPreferredRowCount() { int old = monthView.getPreferredRowCount(); int color = old + 20; PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setPreferredRowCount(color); assertEquals(color, monthView.getPreferredRowCount()); TestUtils.assertPropertyChangeEvent(report, "preferredRowCount", old, color); } /** * Issue #931-swingx: missing change notification. * test setting monthStringInsets property. * */ @Test public void testPreferredColumnCount() { int old = monthView.getPreferredColumnCount(); int color = old + 20; PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setPreferredColumnCount(color); assertEquals(color, monthView.getPreferredColumnCount()); TestUtils.assertPropertyChangeEvent(report, "preferredColumnCount", old, color); } /** * Issue #931-swingx: missing change notification. * test setting monthStringInsets property. * */ @Test public void testMonthStringInsets() { Insets old = monthView.getMonthStringInsets(); Insets color = new Insets(21, 22, 23, 24); assertFalse("sanity: the new insets are not equals", color.equals(old)); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setMonthStringInsets(color); assertEquals(color, monthView.getMonthStringInsets()); TestUtils.assertPropertyChangeEvent(report, "monthStringInsets", old, color); } /** * Issue #931-swingx: missing change notification. * test setting monthStringBackground property. * */ @Test public void testTodayBackground() { Color old = monthView.getTodayBackground(); Color color = Color.PINK; if (color.equals(old)) { color = Color.MAGENTA; } PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setTodayBackground(color); assertEquals(color, monthView.getTodayBackground()); TestUtils.assertPropertyChangeEvent(report, "todayBackground", old, color); } /** * Issue #931-swingx: missing change notification. * test setting monthStringBackground property. * */ @Test public void testMonthStringBackground() { Color old = monthView.getMonthStringBackground(); Color color = Color.PINK; if (color.equals(old)) { color = Color.MAGENTA; } PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setMonthStringBackground(color); assertEquals(color, monthView.getMonthStringBackground()); TestUtils.assertPropertyChangeEvent(report, "monthStringBackground", old, color); } /** * Issue #931-swingx: missing change notification. * test setting monthStringForeground property. * */ @Test public void testMonthStringForeground() { Color old = monthView.getMonthStringForeground(); Color color = Color.PINK; if (color.equals(old)) { color = Color.MAGENTA; } PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setMonthStringForeground(color); assertEquals(color, monthView.getMonthStringForeground()); TestUtils.assertPropertyChangeEvent(report, "monthStringForeground", old, color); } /** * Issue #931-swingx: missing change notification. * test setting font property - was fired twice due to unneeded * override of setFont (removed). * */ @Test public void testFont() { Font old = monthView.getFont(); Font padding = old.deriveFont(old.getSize2D() * 2); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setFont(padding); assertEquals(padding, monthView.getFont()); TestUtils.assertPropertyChangeEvent(report, "font", old, padding); } /** * Issue #931-swingx: missing change notification. * test setting boxPaddingY property. * */ @Test public void testBoxPaddingY() { int old = monthView.getBoxPaddingY(); int padding = old + 2; PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setBoxPaddingY(padding); assertEquals(padding, monthView.getBoxPaddingY()); TestUtils.assertPropertyChangeEvent(report, "boxPaddingY", old, padding); } /** * Issue #931-swingx: missing change notification. * test setting boxPaddingX property. * */ @Test public void testBoxPaddingX() { int old = monthView.getBoxPaddingX(); int padding = old + 2; PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setBoxPaddingX(padding); assertEquals(padding, monthView.getBoxPaddingX()); TestUtils.assertPropertyChangeEvent(report, "boxPaddingX", old, padding); } /** * Issue #931-swingx: missing change notification. * test setting selectionBackground property. * */ @Test public void testDaysOfTheWeekForeground() { Color old = monthView.getDaysOfTheWeekForeground(); Color color = Color.PINK; if (color.equals(old)) { color = Color.MAGENTA; } PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setDaysOfTheWeekForeground(color); assertEquals(color, monthView.getDaysOfTheWeekForeground()); TestUtils.assertPropertyChangeEvent(report, "daysOfTheWeekForeground", old, color); } /** * Issue #931-swingx: missing change notification. * test setting selectionBackground property. * */ @Test public void testFlaggedDayForeground() { Color old = monthView.getFlaggedDayForeground(); Color color = Color.PINK; if (color.equals(old)) { color = Color.MAGENTA; } PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setFlaggedDayForeground(color); assertEquals(color, monthView.getFlaggedDayForeground()); TestUtils.assertPropertyChangeEvent(report, "flaggedDayForeground", old, color); } /** * Issue #931-swingx: missing change notification. * test setting selectionBackground property. * */ @Test public void testSelectionForeground() { Color old = monthView.getSelectionForeground(); Color color = Color.PINK; if (color.equals(old)) { color = Color.MAGENTA; } PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setSelectionForeground(color); assertEquals(color, monthView.getSelectionForeground()); TestUtils.assertPropertyChangeEvent(report, "selectionForeground", old, color); } /** * Issue #931-swingx: missing change notification. * test setting selectionBackground property. * */ @Test public void testSelectionBackground() { Color old = monthView.getSelectionBackground(); Color color = Color.PINK; if (color.equals(old)) { color = Color.MAGENTA; } PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setSelectionBackground(color); assertEquals(color, monthView.getSelectionBackground()); TestUtils.assertPropertyChangeEvent(report, "selectionBackground", old, color); } @Test public void testInitialOpaque() { assertTrue(monthView.isOpaque()); } @Test public void testInitialBoxPadding() { assertTrue(monthView.getBoxPaddingX() > 0); assertEquals(UIManager.getInt("JXMonthView.boxPaddingX"), monthView.getBoxPaddingX()); assertTrue(monthView.getBoxPaddingY() > 0); assertEquals(UIManager.getInt("JXMonthView.boxPaddingY"), monthView.getBoxPaddingY()); } /** * Issue #752-swingx: custom daysOfWeek lost in updateUI */ @Test public void testDaysOfWeekUpdateUI() { JXMonthView monthView = new JXMonthView(); String[] days = {"S", "M", "D", "M", "D", "F", "S"}; monthView.setDaysOfTheWeek(days); assertEquals(Arrays.asList(days), Arrays.asList(monthView.getDaysOfTheWeek())); monthView.updateUI(); assertEquals(Arrays.asList(days), Arrays.asList(monthView.getDaysOfTheWeek())); } /** * Issue #752-swingx: custom daysOfWeek lost in updateUI */ @Test public void testDaysOfWeekUpdateUIAllowNull() { JXMonthView monthView = new JXMonthView(); String[] days = null; monthView.setDaysOfTheWeek(days); assertNotNull("daysOfTheWeek must not be null", monthView.getDaysOfTheWeek()); } /** * Issue #752-swingx: custom daysOfWeek lost in updateUI */ @Test public void testDaysOfWeekInitial() { JXMonthView monthView = new JXMonthView(); assertNotNull("daysOfTheWeek must not be null", monthView.getDaysOfTheWeek()); } /** * Issue #752-swingx: custom daysOfWeek lost in updateUI */ @Test public void testDaysOfWeekCopied() { JXMonthView monthView = new JXMonthView(); assertNotSame(monthView.getDaysOfTheWeek(), monthView.getDaysOfTheWeek()); } /** * Issue #752-swingx: custom daysOfWeek lost in updateUI */ @Test public void testDaysOfWeekReset() { JXMonthView monthView = new JXMonthView(); // start off with ui-provided dates String[] uiDays = monthView.getDaysOfTheWeek(); String[] days = {"S", "M", "D", "M", "D", "F", "S"}; // set the custom monthView.setDaysOfTheWeek(days); // sanity assertEquals(Arrays.asList(days), Arrays.asList(monthView.getDaysOfTheWeek())); monthView.setDaysOfTheWeek(null); assertEquals("use ui-provided daysOfWeek after reset", Arrays.asList(uiDays), Arrays.asList(monthView.getDaysOfTheWeek())); } /** * Issue #751-swingx: property naming violations */ @Test public void testShowingLeadingNotification() { JXMonthView monthView = new JXMonthView(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); boolean showing = monthView.isShowingLeadingDays(); monthView.setShowingLeadingDays(!showing); TestUtils.assertPropertyChangeEvent(report, "showingLeadingDays", showing, !showing); } /** * Issue #751-swingx: property naming violations */ @Test public void testShowingLeadingNoNotification() { JXMonthView monthView = new JXMonthView(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); boolean showing = monthView.isShowingLeadingDays(); monthView.setShowingLeadingDays(showing); assertEquals(0, report.getEventCount("showingLeadingDates")); } /** * Issue #751-swingx: property naming violations */ @Test public void testShowingTrailingNotification() { JXMonthView monthView = new JXMonthView(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); boolean showing = monthView.isShowingTrailingDays(); monthView.setShowingTrailingDays(!showing); TestUtils.assertPropertyChangeEvent(report, "showingTrailingDays", showing, !showing); } /** * Issue #751-swingx: property naming violations */ @Test public void testShowingTrailingNoNotification() { JXMonthView monthView = new JXMonthView(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); boolean showing = monthView.isShowingTrailingDays(); monthView.setShowingTrailingDays(showing); assertEquals(0, report.getEventCount("showingTrailingDays")); } /** * Issue #751-swingx: property naming violations */ @Test public void testShowingWeekNumbersNotification() { JXMonthView monthView = new JXMonthView(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); boolean showing = monthView.isShowingWeekNumber(); monthView.setShowingWeekNumber(!showing); TestUtils.assertPropertyChangeEvent(report, "showingWeekNumber", showing, !showing); } /** * Issue #751-swingx: property naming violations */ @Test public void testShowingWeekNumbersNoNotification() { JXMonthView monthView = new JXMonthView(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); boolean showing = monthView.isShowingWeekNumber(); monthView.setShowingWeekNumber(showing); assertEquals(0, report.getEventCount("showingWeekNumber")); } /** * Issue #751-swingx: property naming violations */ @Test public void testTraversableNotification() { JXMonthView monthView = new JXMonthView(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); boolean showing = monthView.isTraversable(); monthView.setTraversable(!showing); TestUtils.assertPropertyChangeEvent(report, "traversable", showing, !showing); } /** * Issue #751-swingx: property naming violations */ @Test public void testTraversableNoNotification() { JXMonthView monthView = new JXMonthView(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); boolean showing = monthView.isTraversable(); monthView.setTraversable(showing); assertEquals(0, report.getEventCount("traversable")); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: test that model settings are respected in constructor - minimaldays. */ @Test public void testCalendarsContructorUnchangedFirstDayOfWeek() { DateSelectionModel model = new DaySelectionModel(); int first = model.getFirstDayOfWeek() + 1; model.setFirstDayOfWeek(first); JXMonthView monthView = new JXMonthView(new Date(), model); assertEquals("model's calendar properties must be unchanged: minimalDays", first, model.getFirstDayOfWeek()); // sanity: taken in monthView assertEquals("monthView's calendar properties must be synched", first, monthView.getFirstDayOfWeek()); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: test that monthView is updated to model after setSelectionModel. */ @Test public void testCalendarsSetModel() { JXMonthView monthView = new JXMonthView(); int firstDayOfWeek = monthView.getFirstDayOfWeek(); Locale locale = Locale.UK; if (locale.equals(monthView.getLocale())) { locale = Locale.FRENCH; } TimeZone tz = TimeZone.getTimeZone("GMT+4"); if (monthView.getTimeZone().equals(tz)) { tz = TimeZone.getTimeZone("GMT+5"); } DateSelectionModel model = new DaySelectionModel(locale); model.setTimeZone(tz); int modelMinimal = model.getMinimalDaysInFirstWeek(); monthView.setSelectionModel(model); assertEquals("timeZone must be updated from model", tz, monthView.getTimeZone()); // Issue 1143 assertTrue("firstDisplayedDay must be updated to start of day", CalendarUtils.isStartOfDay(monthView.getCalendar())); assertEquals("Locale must be updated from model", locale, monthView.getLocale()); // be aware if it makes no sense to assert if (firstDayOfWeek != model.getFirstDayOfWeek()) { assertEquals("firstDayOfWeek must be updated from model", model.getFirstDayOfWeek(), monthView.getFirstDayOfWeek()); } else { LOG.info("cannot assert firstDayOfWeek - was same"); } // @KEEP - this is an open issue: monthView must not change the // model settings but minimalDaysInFirstWeek > 1 confuse the // BasicMonthViewUI - remove if passing in xIssues assertEquals("model minimals must not be changed", modelMinimal, model.getMinimalDaysInFirstWeek()); } /** * Issue #736-swingx: model and monthView cal not synched. * * Here: test that model settings are respected in constructor - minimaldays. */ @SuppressWarnings("unused") @Test public void testCalendarsContructorUnchangedMinimalDaysOfModel() { DateSelectionModel model = new DaySelectionModel(); int first = model.getMinimalDaysInFirstWeek() + 1; model.setMinimalDaysInFirstWeek(first); JXMonthView monthView = new JXMonthView(new Date(), model); assertEquals("model's calendar properties must be unchanged: minimalDays", first, model.getMinimalDaysInFirstWeek()); } /** * Issue #736-swingx: model and monthView cal not synched. * * Here: test that model settings are respected in setModel - minimaldays. * * Model must not reset minimalDaysInfirstWeek, but Locales with values * > 1 confuse the BasicDatePickerUI - need to track down and solve there. */ @Test public void testCalendarsSetModelUnchangedMinimalDaysInFirstWeek() { JXMonthView monthView = new JXMonthView(); DateSelectionModel model = new DaySelectionModel(); int first = model.getMinimalDaysInFirstWeek() + 1; model.setMinimalDaysInFirstWeek(first); monthView.setSelectionModel(model); assertEquals("model minimals must not be changed", first, model.getMinimalDaysInFirstWeek()); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: minimal days of first week. */ @Test public void testCalendarsMinimalDaysOfFirstWeekModelChanged() { JXMonthView monthView = new JXMonthView(); int first = monthView.getCalendar().getMinimalDaysInFirstWeek() + 1; assertTrue(first <= Calendar.SATURDAY); monthView.getSelectionModel().setMinimalDaysInFirstWeek(first); assertEquals(first, monthView.getCalendar().getMinimalDaysInFirstWeek()); } /** * Issue #733-swingx: TimeZone in model and monthView not synched. * * Test that the selected is normalized in the monthView's timezone. */ @Test public void testCalendarsTimeZoneNormalizedDate() { JXMonthView monthView = new JXMonthView(); // config with a known timezone TimeZone tz = TimeZone.getTimeZone("GMT+4"); if (tz.equals(monthView.getTimeZone())) { tz = TimeZone.getTimeZone("GMT+5"); } monthView.setTimeZone(tz); monthView.setSelectionDate(new Date()); Date selected = monthView.getSelectionDate(); Calendar calendar = monthView.getCalendar(); assertEquals(selected, CalendarUtils.startOfDay(calendar, selected)); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: timezone of flagged dates not synched. * This was introduced by moving the control of flagged dates into * a internal model. Need to synch that model as well. */ @Test public void testFlaggedDatesTimeZone() { JXMonthView monthView = new JXMonthView(); // config with a known timezone and date TimeZone tz = TimeZone.getTimeZone("GMT+4"); if (tz.equals(monthView.getTimeZone())) { tz = TimeZone.getTimeZone("GMT+5"); } monthView.setTimeZone(tz); monthView.setFlaggedDates(today); Date flagged = monthView.getFlaggedDates().first(); assertEquals(flagged, CalendarUtils.startOfDay(monthView.getCalendar(), flagged)); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: setting the timezone clears the flagged dates, must notify of change. */ @Test public void testFlaggedDatesTimeZoneNotifyOnChange() { JXMonthView monthView = new JXMonthView(); monthView.setFlaggedDates(today); SortedSet<Date> flagged = monthView.getFlaggedDates(); // config with a known timezone and date TimeZone tz = TimeZone.getTimeZone("GMT+4"); if (tz.equals(monthView.getTimeZone())) { tz = TimeZone.getTimeZone("GMT+5"); } PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setTimeZone(tz); TestUtils.assertPropertyChangeEvent(report, "flaggedDates", flagged, monthView.getFlaggedDates(), false); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: setting the timezone clears the flagged dates, must notify of change. */ @Test public void testFlaggedDatesTimeZoneNotNotifyWithoutChange() { JXMonthView monthView = new JXMonthView(); // config with a known timezone and date TimeZone tz = TimeZone.getTimeZone("GMT+4"); if (tz.equals(monthView.getTimeZone())) { tz = TimeZone.getTimeZone("GMT+5"); } PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setTimeZone(tz); assertEquals("no change in flaggedDates must not fire", 0, report.getEventCount("flaggedDates")); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: Locale changed in monthView. */ @Test public void testCalendarsLocaleChangedMonthView() { JXMonthView monthView = new JXMonthView(); Locale locale = Locale.UK; if (locale.equals(monthView.getLocale())) { locale = Locale.FRENCH; } monthView.setLocale(locale); assertEquals("locale set in monthView must be passed to model", locale, monthView.getSelectionModel().getLocale()); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: Locale changed in selection model. */ @Test public void testCalendarsLocaleChangedModel() { JXMonthView monthView = new JXMonthView(); Locale locale = Locale.UK; if (locale.equals(monthView.getLocale())) { locale = Locale.FRENCH; } monthView.getSelectionModel().setLocale(locale); assertEquals("locale set in model must be passed to monthView", locale, monthView.getLocale()); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: Locale changed in monthView. */ @Test public void testCalendarsLocaleContructor() { Locale locale = Locale.UK; if (locale.equals(JComponent.getDefaultLocale())) { locale = Locale.FRENCH; } JXMonthView monthView = new JXMonthView(locale); assertEquals("initial locale in constructor must be passed to model", locale, monthView.getSelectionModel().getLocale()); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: set first day of week in monthView. */ @Test public void testCalendarsFirstDayOfWeekMonthView() { JXMonthView monthView = new JXMonthView(); int first = monthView.getFirstDayOfWeek() + 1; // sanity assertTrue(first <= Calendar.SATURDAY); monthView.setFirstDayOfWeek(first); assertEquals(first, monthView.getFirstDayOfWeek()); assertEquals(first, monthView.getCalendar().getFirstDayOfWeek()); assertEquals(first, monthView.getSelectionModel().getFirstDayOfWeek()); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: set first day of week in model. */ @Test public void testCalendarsFirstDayOfWeekModel() { JXMonthView monthView = new JXMonthView(); int first = monthView.getFirstDayOfWeek() + 1; // sanity assertTrue(first <= Calendar.SATURDAY); monthView.getSelectionModel().setFirstDayOfWeek(first); assertEquals(first, monthView.getFirstDayOfWeek()); assertEquals(first, monthView.getCalendar().getFirstDayOfWeek()); assertEquals(first, monthView.getSelectionModel().getFirstDayOfWeek()); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: first day of week. */ @Test public void testCalendarsFirstDayOfWeekInitial() { JXMonthView monthView = new JXMonthView(); assertEquals(monthView.getFirstDayOfWeek(), monthView.getSelectionModel().getFirstDayOfWeek()); } /** * Issue #733-swingx: model and monthView cal not synched. * * Here: minimal days of first week. */ @Test public void testCalendarsMinimalDaysOfFirstWeekInitial() { JXMonthView monthView = new JXMonthView(); int first = monthView.getCalendar().getMinimalDaysInFirstWeek(); assertEquals(first, monthView.getSelectionModel().getMinimalDaysInFirstWeek()); } /** * Issue ??-swingx: selection related properties must be independent * of way-of setting. * * View must delegate to model, so asking view or model with same * parameters must return the same result. * * Here: isSelected * */ @Test public void testMonthViewSameAsSelectionModelIsSelected() { JXMonthView monthView = new JXMonthView(); // guard against accidental startofday calendar.set(Calendar.HOUR_OF_DAY, 5); Date date = calendar.getTime(); monthView.setSelectionDate(date); assertTrue(monthView.isSelected(date)); assertTrue(monthView.getSelectionModel().isSelected(date)); } /** * Issue ??-swingx: selection related properties must be independent * of way-of setting. * * View must delegate to model, so asking view or model with same * parameters must return the same result. * * Here: isSelected * */ @Test public void testMonthViewSameAsSelectionModelSelectedDate() { JXMonthView monthView = new JXMonthView(); // guard against accidental startofday calendar.set(Calendar.HOUR_OF_DAY, 5); Date date = calendar.getTime(); monthView.setSelectionDate(date); assertEquals(monthView.getSelectionDate(), monthView.getSelectionModel().getFirstSelectionDate()); } /** * Issue ??-swingx: selection related properties must be independent * of way-of setting. * * View must delegate to model, so asking view or model with same * parameters must return the same result. * * Here: isSelected * */ @Test public void testMonthViewSameAsSelectionModelIsUnselectable() { JXMonthView monthView = new JXMonthView(); // guard against accidental startofday calendar.set(Calendar.HOUR_OF_DAY, 5); Date date = calendar.getTime(); monthView.setUnselectableDates(date); assertTrue(monthView.isUnselectableDate(date)); assertTrue(monthView.getSelectionModel().isUnselectableDate(date)); } /** * Issue ??-swingx: selection related properties must be independent * of way-of setting. * * View must delegate to model, so asking view or model with same * parameters must return the same result. * * Here: set unselectables on model * */ @Test public void testSelectionModelSameAsMonthViewIsUnselectableDate() { JXMonthView monthView = new JXMonthView(); // guard against accidental startofday calendar.set(Calendar.HOUR_OF_DAY, 5); Date date = calendar.getTime(); SortedSet<Date> unselectables = new TreeSet<Date>(); unselectables.add(date); monthView.getSelectionModel().setUnselectableDates(unselectables); assertTrue(monthView.getSelectionModel().isUnselectableDate(date)); assertTrue(monthView.isUnselectableDate(date)); } /** * Issue ??-swingx: selection related properties must be independent * of way-of setting. * * View must delegate to model, so asking view or model with same * parameters must return the same result. * * Here: set selected on model * */ @Test public void testSelectionModelSameAsMonthViewIsSelected() { JXMonthView monthView = new JXMonthView(); // guard against accidental startofday calendar.set(Calendar.HOUR_OF_DAY, 5); Date date = calendar.getTime(); monthView.getSelectionModel().setSelectionInterval(date, date); assertTrue(monthView.getSelectionModel().isSelected(date)); assertTrue(monthView.isSelected(date)); } /** * Issue ??-swingx: selection related properties must be independent * of way-of setting. * * View must delegate to model, so asking view or model with same * parameters must return the same result. * * Here: set selected on model, ask for selected date * */ @Test public void testSelectionModelSameAsMonthViewSelectedDate() { JXMonthView monthView = new JXMonthView(); // guard against accidental startofday calendar.set(Calendar.HOUR_OF_DAY, 5); Date date = calendar.getTime(); monthView.getSelectionModel().setSelectionInterval(date, date); assertEquals(monthView.getSelectionModel().getFirstSelectionDate(), monthView.getSelectionDate()); } /** * #703-swingx: set date to first of next doesn't update the view. * * Behaviour is consistent with core components, must not update * */ @Test public void testAutoScrollOnSelection() { JXMonthView us = new JXMonthView(); final Calendar today = Calendar.getInstance(); CalendarUtils.endOfMonth(today); us.setSelectionDate(today.getTime()); Date first = us.getFirstDisplayedDay(); today.add(Calendar.DAY_OF_MONTH, 2); us.setSelectionDate(today.getTime()); assertEquals(first, us.getFirstDisplayedDay()); } /** * #705-swingx: revalidate must not reset first firstDisplayed. * * */ @Test public void testAutoScrollOnSelectionRevalidate() throws InterruptedException, InvocationTargetException { // This test will not work in a headless configuration. if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run test - headless environment"); return; } final JXMonthView us = new JXMonthView(); final Calendar today = Calendar.getInstance(); CalendarUtils.endOfMonth(today); us.setSelectionDate(today.getTime()); final JXFrame frame = new JXFrame(); frame.add(us); final Date first = us.getFirstDisplayedDay(); today.add(Calendar.DAY_OF_MONTH, 2); us.setSelectionDate(today.getTime()); SwingUtilities.invokeAndWait(new Runnable() { public void run() { us.revalidate(); // need to validate frame - why? frame.validate(); assertEquals("firstDisplayed must not be changed on revalidate", first, us.getFirstDisplayedDay()); // assertEquals(first, us.getFirstDisplayedDate()); // fail("weird (threading issue?): the firstDisplayed is changed in layoutContainer - not testable here"); } }); } /** * Issue 711-swingx: today is notify-only property. * Today is start of day. */ @Test public void testTodayInitial() { JXMonthView monthView = new JXMonthView(); CalendarUtils.startOfDay(calendar); assertEquals(calendar.getTime(), monthView.getToday()); } /** * Issue 711-swingx: today is notify-only property. * Increment sets to start of day of tomorrow. */ @Test public void testTodayIncrement() { JXMonthView monthView = new JXMonthView(); calendar.add(Calendar.DAY_OF_MONTH, 1); CalendarUtils.startOfDay(calendar); monthView.incrementToday(); assertEquals(calendar.getTime(), monthView.getToday()); } /** * Issue 711-swingx: today is notify-only property. * SetToday should */ @Test public void testTodaySetNotification() { JXMonthView monthView = new JXMonthView(); Date today = monthView.getToday(); // tomorrow calendar.add(Calendar.DAY_OF_MONTH, 1); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setToday(calendar.getTime()); CalendarUtils.startOfDay(calendar); TestUtils.assertPropertyChangeEvent(report, "today", today, calendar.getTime()); } /** * Issue 711-swingx: today is notify-only property. * SetToday should */ @Test public void testTodaySet() { JXMonthView monthView = new JXMonthView(); // tomorrow calendar.add(Calendar.DAY_OF_MONTH, 1); monthView.setToday(calendar.getTime()); CalendarUtils.startOfDay(calendar); assertEquals(calendar.getTime(), monthView.getToday()); } /** * For safety, getToday should return a clone. */ @Test public void testTodayCopy() { JXMonthView monthView = new JXMonthView(); Date today = monthView.getToday(); Date other = monthView.getToday(); assertNotNull(today); assertNotSame(today, other); } /** * Issue #708-swingx: updateUI changes state. * * Here: test that today is unchanged. */ @Test public void testUpdateUIToday() { JXMonthView monthView = new JXMonthView(); Date first = monthView.getToday(); monthView.updateUI(); assertEquals(first, monthView.getToday()); }; /** * Issue #711-swingx: remove fake property change notification. * * Here: test that ensureVisibleDate fires once only. */ @Test public void testEnsureVisibleDateNofication() { JXMonthView monthView = new JXMonthView(); Date firstDisplayedDate = monthView.getFirstDisplayedDay(); // previous month calendar.add(Calendar.MONTH, -1); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.ensureDateVisible(calendar.getTime()); CalendarUtils.startOfMonth(calendar); TestUtils.assertPropertyChangeEvent(report, "firstDisplayedDay", firstDisplayedDate, calendar.getTime(), false); } /** * Issue #711-swingx: remove fake property change notification. * * Here: test that setFirstDisplayedDate fires once only. */ @Test public void testFirstDisplayedDateNofication() { JXMonthView monthView = new JXMonthView(); Date firstDisplayedDate = monthView.getFirstDisplayedDay(); // previous month calendar.add(Calendar.MONTH, -1); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setFirstDisplayedDay(calendar.getTime()); CalendarUtils.startOfMonth(calendar); TestUtils.assertPropertyChangeEvent(report, "firstDisplayedDay", firstDisplayedDate, calendar.getTime(), false); } /** * Issue #708-swingx * * test update of lastDisplayedDate if resized. */ @Test public void testLastDisplayedOnResize() { // This test will not work in a headless configuration. if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run test - headless environment"); return; } // get a reference width so we can simulate a one-month resize JXMonthView compare = new JXMonthView(); compare.setPreferredColumnCount(2); JXMonthView monthView = new JXMonthView(); JXFrame frame = new JXFrame(); frame.add(monthView); frame.pack(); Date last = monthView.getLastDisplayedDay(); // set a size that should guarantee the same number of columns as the compare monthView frame.setSize(compare.getPreferredSize().width + 50, monthView.getPreferredSize().height + 50); frame.validate(); // build a date corresponding to the expected end of next month calendar.setTime(last); // next month calendar.add(Calendar.DAY_OF_MONTH, 1); CalendarUtils.endOfMonth(calendar); assertEquals(calendar.getTime(), monthView.getLastDisplayedDay()); } /** * Issue #708-swingx: updateUI changes state. * * Here: test that firstDisplayedDate is unchanged. */ @Test public void testUpdateUIFirst() { final JXMonthView monthView = new JXMonthView(); Date first = monthView.getFirstDisplayedDay(); monthView.updateUI(); assertEquals(first, monthView.getFirstDisplayedDay()); }; /** * Issue #708-swingx: updateUI changes state. * * Here: test that lastDisplayedDate is unchanged. */ @Test public void testUpdateUILast() { final JXMonthView monthView = new JXMonthView(); Date first = monthView.getLastDisplayedDay(); monthView.updateUI(); assertEquals(first, monthView.getLastDisplayedDay()); }; /** * Issue #659-swingx: lastDisplayedDate must be synched. * test that lastDisplayed from monthView is same as lastDisplayed from ui. * * Here: initial packed size - one month shown. * * @throws InvocationTargetException * @throws InterruptedException */ @Test public void testLastDisplayedDateUIInitial() throws InterruptedException, InvocationTargetException { if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run lastDisplayedDate - headless"); return; } final JXMonthView monthView = new JXMonthView(); final JXFrame frame = wrapInFrame(monthView, ""); frame.setVisible(true); SwingUtilities.invokeAndWait(new Runnable() { public void run() { Date uiLast = monthView.getUI().getLastDisplayedDay(); Date viewLast = monthView.getLastDisplayedDay(); assertEquals(uiLast, viewLast); } }); } /** * * Issue #659-swingx: lastDisplayedDate must be synched. * * test that lastDisplayed from monthView is same as lastDisplayed from ui. * * Here: change the size of the view which allows the ui to display more * columns/rows. * * @throws InvocationTargetException * @throws InterruptedException */ @Test public void testLastDisplayedDateSizeChanged() throws InterruptedException, InvocationTargetException { if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run lastDisplayedDate - headless"); return; } final JXMonthView monthView = new JXMonthView(); final JXFrame frame = wrapInFrame(monthView, ""); frame.setVisible(true); frame.setSize(frame.getWidth() * 3, frame.getHeight() * 2); // force a revalidate frame.invalidate(); frame.validate(); SwingUtilities.invokeAndWait(new Runnable() { public void run() { Date uiLast = monthView.getUI().getLastDisplayedDay(); Date viewLast = monthView.getLastDisplayedDay(); assertEquals(uiLast, viewLast); } }); } /** * * Issue #659-swingx: lastDisplayedDate must be synched. * * test that ensureDateVisible works as doc'ed if multiple months shown: * if the new date is in the * month following the last visible then the first must be set in a manner that * the date must be visible in the last month. * * @throws InvocationTargetException * @throws InterruptedException */ @Test public void testLastDisplayedDateSizeChangedEnsureVisible() throws InterruptedException, InvocationTargetException { if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run lastDisplayedDate - headless"); return; } final JXMonthView monthView = new JXMonthView(); final JXFrame frame = wrapInFrame(monthView, ""); frame.setVisible(true); frame.setSize(frame.getWidth() * 3, frame.getHeight() * 2); // force a revalidate frame.invalidate(); frame.validate(); SwingUtilities.invokeAndWait(new Runnable() { public void run() { Calendar calendar = Calendar.getInstance(); calendar.setTime(monthView.getFirstDisplayedDay()); int firstMonth = calendar.get(Calendar.MONTH); Date uiLast = monthView.getUI().getLastDisplayedDay(); calendar.setTime(uiLast); int lastMonth = calendar.get(Calendar.MONTH); // sanity: more than one month shown assertFalse(firstMonth == lastMonth); // first day of next month calendar.add(Calendar.DATE, 1); // sanity int newLastMonth = calendar.get(Calendar.MONTH); assertFalse(lastMonth == newLastMonth); monthView.ensureDateVisible(calendar.getTime()); CalendarUtils.endOfMonth(calendar); Date newUILast = monthView.getUI().getLastDisplayedDay(); assertEquals(newUILast, monthView.getLastDisplayedDay()); calendar.setTime(newUILast); // LOG.info("first/last: " + new Date(monthView.getFirstDisplayedDate()) + // "/" + new Date(newUILast)); assertEquals(newLastMonth, calendar.get(Calendar.MONTH)); } }); } /** * Issue #660-swingx: JXMonthView must protect its calendar. * Client manipulation on calendar must not change internal state. * * This is guaranteed by returning a clone instead of the life object. */ @Test public void testMonthViewCalendarInvariant() { JXMonthView monthView = new JXMonthView(); TimeZone tz = monthView.getTimeZone(); Calendar calendar = monthView.getCalendar(); calendar.setTimeZone(getTimeZone(tz, CalendarUtils.THREE_HOURS)); assertEquals("monthView must protect its calendar", tz, monthView.getTimeZone()); } /** * Issue #660-swingx: JXMonthView must protect its calendar. * * Added invariant to the monthView's getCalender: clone and * config to firstDisplayDate. * * The various tests are various contexts which broke the * expectation before fixing the issue. * Here the context is: select. */ @Test public void testMonthViewCalendarInvariantOnSetSelection() { JXMonthView monthView = new JXMonthView(); assertEquals(1, monthView.getCalendar().get(Calendar.DATE)); Date first = monthView.getFirstDisplayedDay(); assertEquals("monthViews calendar represents the first day of the month", first, monthView.getCalendar().getTime()); Calendar cal = Calendar.getInstance(); // add one day, now we are on the second cal.setTime(first); cal.add(Calendar.DATE, 1); Date date = cal.getTime(); monthView.addSelectionInterval(date , date); assertEquals("selection must not change the calendar", first, monthView.getCalendar().getTime()); } /** * Issue #660-swingx: JXMonthView must protect its calendar. * * Added invariant to the monthView's getCalender: clone and * config to firstDisplayDate. * * The various tests are various contexts which broke the * expectation before fixing the issue. * Here the context is: check for selection. */ @Test public void testMonthViewCalendarInvariantOnQuerySelectioon() { JXMonthView monthView = new JXMonthView(); assertEquals(1, monthView.getCalendar().get(Calendar.DATE)); Date first = monthView.getFirstDisplayedDay(); assertEquals("monthViews calendar represents the first day of the month", first, monthView.getCalendar().getTime()); Calendar cal = Calendar.getInstance(); // add one day, now we are on the second cal.setTime(first); cal.add(Calendar.DATE, 1); Date date = cal.getTime(); monthView.isSelected(date); assertEquals("query selection must not change the calendar", first, monthView.getCalendar().getTime()); } /** * Issue #660-swingx: JXMonthView must protect its calendar. * * Added invariant to the monthView's getCalender: clone and * config to firstDisplayDate. * * The various tests are various contexts which broke the * expectation before fixing the issue. * Here the context is: set first displayed date (formerly left * the calendar at the last displayed date). */ @Test public void testMonthViewCalendarInvariantOnSetFirstDisplayedDate() { JXMonthView monthView = new JXMonthView(); Date first = monthView.getFirstDisplayedDay(); Calendar cal = Calendar.getInstance(); // add one day, now we are on the second cal.setTime(first); cal.add(Calendar.MONTH, 1); Date next = cal.getTime(); monthView.setFirstDisplayedDay(next); assertEquals("monthViews calendar represents the first day of the month", next, monthView.getCalendar().getTime()); } /** * safety net: add api ensureDateVisible with Date parameter */ @Test public void testEnsureDateVisibleDateParamNextYear() { JXMonthView monthView = new JXMonthView(); Calendar temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); // sanity assertEquals("sanity...", temp.getTime(), monthView.getFirstDisplayedDay()); calendar.add(Calendar.YEAR, 1); Date nextYear = calendar.getTime(); temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); monthView.ensureDateVisible(nextYear); assertEquals("must be scrolled to next year", temp.getTime(), monthView.getFirstDisplayedDay()); } /** * safety net: add api ensureDateVisible with Date parameter */ @Test public void testEnsureDateVisibleDateParamNextMonth() { JXMonthView monthView = new JXMonthView(); Calendar temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); assertEquals("sanity..", temp.getTime(), monthView.getFirstDisplayedDay()); calendar.add(Calendar.MONTH, 1); Date nextMonth = calendar.getTime(); temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); monthView.ensureDateVisible(nextMonth); assertEquals("must be scrolled to next month", temp.getTime(), monthView.getFirstDisplayedDay()); } /** * safety net: add api ensureDateVisible with Date parameter */ @Test public void testEnsureDateVisibleDateParamThisMonth() { JXMonthView monthView = new JXMonthView(); Calendar temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); Date first = monthView.getFirstDisplayedDay(); assertEquals("sanity...", temp.getTime(), first); CalendarUtils.endOfMonth(calendar); Date thisMonth = calendar.getTime(); monthView.ensureDateVisible(thisMonth); assertEquals("same month, nothing changed", first, monthView.getFirstDisplayedDay()); } /** * safety net: refactor ensureDateVisible */ @Test public void testEnsureDateVisibleNextYear() { JXMonthView monthView = new JXMonthView(); Calendar temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); assertEquals("sanity...", temp.getTime(), monthView.getFirstDisplayedDay()); calendar.add(Calendar.YEAR, 1); Date nextYear = calendar.getTime(); temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); monthView.ensureDateVisible(nextYear); assertEquals("must be scrolled to next year", temp.getTime(), monthView.getFirstDisplayedDay()); } /** * safety net: refactor ensureDateVisible */ @Test public void testEnsureDateVisibleNextMonth() { JXMonthView monthView = new JXMonthView(); Calendar temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); assertEquals("sanity ...", temp.getTime(), monthView.getFirstDisplayedDay()); calendar.add(Calendar.MONTH, 1); Date nextMonth = calendar.getTime(); temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); monthView.ensureDateVisible(nextMonth); assertEquals("must be scrolled to next month", temp.getTime(), monthView.getFirstDisplayedDay()); } /** * safety net: refactor ensureDateVisible */ @Test public void testEnsureDateVisibleThisMonth() { JXMonthView monthView = new JXMonthView(); Calendar temp = (Calendar) calendar.clone(); CalendarUtils.startOfMonth(temp); Date first = monthView.getFirstDisplayedDay(); assertEquals("sanity ...", temp.getTime(), first); CalendarUtils.endOfMonth(calendar); Date thisMonth = calendar.getTime(); monthView.ensureDateVisible(thisMonth); assertEquals("same month, nothing changed", first, monthView.getFirstDisplayedDay()); } /** * safety net: move responsibility for lastDisplayedDate completely into ui. */ @Test public void testLastDisplayedDateInitial() { JXMonthView monthView = new JXMonthView(); calendar.setTime(monthView.getFirstDisplayedDay()); CalendarUtils.endOfMonth(calendar); assertEquals(calendar.getTime(), monthView.getLastDisplayedDay()); } /** * Issue #618-swingx: JXMonthView displays problems with non-default * timezones. * * Selected dates are "start of day" in the timezone they had been * selected. As such they make no sense in a new timezone: must * either be adjusted or cleared. Currently we clear the selection. */ @Test public void testTimeZoneChangeClearSelection() { JXMonthView monthView = new JXMonthView(); Date date = new Date(); monthView.setSelectionDate(date); // sanity assertTrue(monthView.isSelected(date)); monthView.setTimeZone(getTimeZone(monthView.getTimeZone(), CalendarUtils.THREE_HOURS)); // accidentally passes - because it is meaningful only in the timezone // it was set ... assertFalse(monthView.isSelected(date)); assertTrue("selection must have been cleared", monthView.isSelectionEmpty()); } /** * Issue #618-swingx: JXMonthView displays problems with non-default * timezones. * * Bound dates are "start of day" in the timezone they had been * set. As such they make no sense in a new timezone: must * either be adjusted or cleared. Currently we clear the bound. */ @Test public void testTimeZoneChangeResetLowerBound() { JXMonthView monthView = new JXMonthView(); monthView.setLowerBound(yesterday); monthView.setTimeZone(getTimeZone(monthView.getTimeZone(), CalendarUtils.THREE_HOURS)); assertEquals("lowerBound must have been reset", null, monthView.getLowerBound()); } /** * Issue #618-swingx: JXMonthView displays problems with non-default * timezones. * * Bound dates are "start of day" in the timezone they had been * set. As such they make no sense in a new timezone: must * either be adjusted or cleared. Currently we clear the bound. */ @Test public void testTimeZoneChangeResetUpperBound() { JXMonthView monthView = new JXMonthView(); monthView.setUpperBound(yesterday); monthView.setTimeZone(getTimeZone(monthView.getTimeZone(), CalendarUtils.THREE_HOURS)); assertEquals("upperbound must have been reset", null, monthView.getUpperBound()); } /** * Issue #618-swingx: JXMonthView displays problems with non-default * timezones. * * Flagged dates are "start of day" in the timezone they had been * set. As such they make no sense in a new timezone: must * either be adjusted or cleared. Currently we clear them. */ @Test public void testTimeZoneChangeResetFlaggedDates() { JXMonthView monthView = new JXMonthView(); monthView.setFlaggedDates(new Date[] {yesterday}); monthView.setTimeZone(getTimeZone(monthView.getTimeZone(), CalendarUtils.THREE_HOURS)); // accidentally passes - because it is meaningful only in the timezone // it was set ... assertFalse(monthView.isFlaggedDate(yesterday)); // missing api // assertEquals(0, monthView.getFlaggedDates().size()); assertFalse("flagged dates must have been cleared", monthView.hasFlaggedDates()); } /** * Issue #618-swingx: JXMonthView displays problems with non-default * timezones. * * Unselectable dates are "start of day" in the timezone they had been * set. As such they make no sense in a new timezone: must * either be adjusted or cleared. Currently we clear them. */ @Test public void testTimeZoneChangeResetUnselectableDates() { JXMonthView monthView = new JXMonthView(); monthView.setUnselectableDates(yesterday); monthView.setTimeZone(getTimeZone(monthView.getTimeZone(), CalendarUtils.THREE_HOURS)); // accidentally passes - because it is meaningful only in the timezone // it was set ... assertFalse(monthView.isUnselectableDate(yesterday)); // missing api on JXMonthView assertEquals("unselectable dates must have been cleared", 0, monthView.getSelectionModel().getUnselectableDates().size()); } /** * test anchor: set to param as passed int setFirstDisplayedDate */ @Test public void testAnchorDateInitial() { JXMonthView monthView = new JXMonthView(); // sometime next month calendar.add(Calendar.MONTH, 1); monthView.setFirstDisplayedDay(calendar.getTime()); assertEquals(calendar.getTime(), monthView.getAnchorDate()); CalendarUtils.startOfMonth(calendar); assertEquals(calendar.getTime(), monthView.getFirstDisplayedDay()); } /** * Issue #618-swingx: JXMonthView displays problems with non-default * timezones. * * Here: test anchor invariant to time zone change */ @Test public void testTimeZoneChangeAnchorInvariant() { JXMonthView monthView = new JXMonthView(); Date anchor = monthView.getAnchorDate(); TimeZone timeZone = monthView.getTimeZone(); // just interested in a different timezone, no quantification intended monthView.setTimeZone(getTimeZone(timeZone, CalendarUtils.THREE_HOURS)); assertEquals("anchor must be invariant to timezone change", anchor, monthView.getAnchorDate()); } /** * Issue #618-swingx: JXMonthView displays problems with non-default * timezones. * * Here: test that the first displayed date is offset by offset diff of * timezones. Configure the monthView with a fixed timezone to clear up the * mist ... * * This did fail on the server on 31mar2008, us/pacific timezone, en_US * locale. Trying to sim the context then. * * Failed again at Tue Sep 30 10:12:31 PDT 2008, en_US locale. Next * (testTimeZoneChangeOffsetFirstDisplayedDate) failed at the same time, */ @Test public void testTimeZoneChangeToday() { JXMonthView monthView = new JXMonthView(); // config with a known timezone and date TimeZone tz = TimeZone.getTimeZone("GMT+4"); monthView.setTimeZone(tz); Calendar calendar = Calendar.getInstance(tz); Date today = calendar.getTime(); monthView.setFirstDisplayedDay(today); Date anchor = monthView.getAnchorDate(); assertEquals(today, anchor); Date firstDisplayed = monthView.getFirstDisplayedDay(); calendar.setTime(firstDisplayed); assertTrue(CalendarUtils.isStartOfMonth(calendar)); // get another timezone with known offset TimeZone tzOther = TimeZone.getTimeZone("GMT+7"); // newOffset minus oldOffset (real time, adjusted to DST) int oldOffset = tz.getOffset(anchor.getTime()); int newOffset = tzOther.getOffset(anchor.getTime()); int realOffset = oldOffset - newOffset; monthView.setTimeZone(tzOther); Calendar otherCalendar = Calendar.getInstance(tzOther); otherCalendar.setTime(monthView.getFirstDisplayedDay()); assertTrue(CalendarUtils.isStartOfMonth(otherCalendar)); // PENDING JW: sure this is the correct direction of the shift? // yeah, think so: the anchor is fixed, moving the timezone results // in a shift into the opposite direction of the offset Calendar localCal = Calendar.getInstance(); String server = "server locale: " + Locale.getDefault() + "\n server timezone: " + localCal.getTimeZone() + "\n server local time: " + localCal.getTime(); String timeZones = "first timeZone " + tz + "\n first timezone offset / min " + oldOffset / (1000 * 60) + "\n second timezone " + tzOther + "\n second timezone offset / min " + newOffset / (1000 * 60); String monthViewProps = "monthView locale: " + monthView.getLocale() + "\n monthView anchor " + anchor + "\n monthView firstDisplayed " + monthView.getFirstDisplayedDay(); assertEquals( "first displayed must be offset by real offset " + "\n ********** spurious failure - so try extensiv debug output:" + "\n " + server + "\n " + timeZones + "\n " + monthViewProps, (realOffset) / (1000 * 60), (monthView.getFirstDisplayedDay().getTime() - firstDisplayed.getTime()) / (1000 * 60)); /* * The output of failure: * * junit.framework.AssertionFailedError: first displayed must be offset by real offset ********** spurious failure - so try extensiv debug output: server locale: en_US server timezone: sun.util.calendar.ZoneInfo[id="US/Pacific",offset=-28800000,dstSavings=3600000,useDaylight=true,transitions=185, lastRule=java.util.SimpleTimeZone[id=US/Pacific,offset=-28800000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]] server local time: Tue Sep 30 10:12:31 PDT 2008 first timeZone sun.util.calendar.ZoneInfo[id="GMT+04:00",offset=14400000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] first timezone offset / min 240 second timezone sun.util.calendar.ZoneInfo[id="GMT+07:00",offset=25200000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] second timezone offset / min 420 monthView locale: en_US monthView anchor Tue Sep 30 10:12:31 PDT 2008 monthView firstDisplayed Tue Sep 30 10:00:00 PDT 2008 expected:<-180> but was:<43020> at org.jdesktop.swingx.JXMonthViewTest.testTimeZoneChangeToday(JXMonthViewTest.java:1385) at org.jmock.core.VerifyingTestCase.runBare(VerifyingTestCase.java:39) */ } /** * Issue #618-swingx: JXMonthView displays problems with non-default * timezones. * * Here: test that the first displayed date is offset by offset diff of * timezones. * Configure the monthView with a fixed timezone to clear up the mist ... * * failed along with previous test, (Tue Sep 30 10:12:31 PDT 2008, en_US locale) * error out: * first displayed must be offset by real offset expected: * <-10800000> but was:<2581200000> * */ @Test public void testTimeZoneChangeOffsetFirstDisplayedDate() { JXMonthView monthView = new JXMonthView(); // config with a known timezone and date TimeZone tz = TimeZone.getTimeZone("GMT+4"); monthView.setTimeZone(tz); Calendar calendar = Calendar.getInstance(tz); Date today = calendar.getTime(); monthView.setFirstDisplayedDay(today); Date anchor = monthView.getAnchorDate(); assertEquals(today, anchor); Date firstDisplayed = monthView.getFirstDisplayedDay(); calendar.setTime(firstDisplayed); assertTrue(CalendarUtils.isStartOfMonth(calendar)); // get another timezone with known offset TimeZone tzOther = TimeZone.getTimeZone("GMT+7"); // newOffset minus oldOffset (real time, adjusted to DST) int oldOffset = tz.getOffset(anchor.getTime()); int newOffset = tzOther.getOffset(anchor.getTime()); int realOffset = oldOffset - newOffset; monthView.setTimeZone(tzOther); Calendar otherCalendar = Calendar.getInstance(tzOther); otherCalendar.setTime(monthView.getFirstDisplayedDay()); assertTrue(CalendarUtils.isStartOfMonth(otherCalendar)); // PENDING JW: sure this is the correct direction of the shift? // yeah, think so: the anchor is fixed, moving the timezone results // in a shift into the opposite direction of the offset assertEquals("first displayed must be offset by real offset", realOffset, monthView.getFirstDisplayedDay().getTime() - firstDisplayed.getTime()); } /** * Returns a timezone with a rawoffset with a different offset. * * * PENDING: this is acutally for european time, not really thought of * negative/rolling +/- problem? * * @param timeZone the timezone to start with * @param diffRawOffset the raw offset difference. * @return */ private TimeZone getTimeZone(TimeZone timeZone, int diffRawOffset) { int offset = timeZone.getRawOffset(); int newOffset = offset < 0 ? offset + diffRawOffset : offset - diffRawOffset; String[] availableIDs = TimeZone.getAvailableIDs(newOffset); TimeZone newTimeZone = TimeZone.getTimeZone(availableIDs[0]); return newTimeZone; } /** * Issue #618-swingx: JXMonthView displays problems with non-default * timezones. * * Here: test timezone fire */ @Test public void testTimeZoneChangeNotification() { JXMonthView monthView = new JXMonthView(); TimeZone timezone = monthView.getTimeZone(); int offset = timezone.getRawOffset(); int oneHour = 60 * 1000 * 60; int newOffset = offset < 0 ? offset + oneHour : offset - oneHour; String[] availableIDs = TimeZone.getAvailableIDs(newOffset); TimeZone newTimeZone = TimeZone.getTimeZone(availableIDs[0]); // sanity assertFalse(timezone.equals(newTimeZone)); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setTimeZone(newTimeZone); TestUtils.assertPropertyChangeEvent(report, "timeZone", timezone, newTimeZone, false); } /** * Issue #563-swingx: keybindings active if not focused. * Test that the bindings are dynamically installed when * shown in popup and de-installed if shown not in popup. */ @Test public void testComponentInputMapEnabledControlsFocusedKeyBindings() { JXMonthView monthView = new JXMonthView(); // initial: no bindings assertEquals("monthView must not have in-focused keyBindings", 0, monthView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).size()); monthView.setComponentInputMapEnabled(true); // setting the flag installs bindings assertTrue("monthView must have in-focused keyBindings after showing in popup", monthView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).size() > 0); monthView.setComponentInputMapEnabled(false); // resetting the flag uninstalls the bindings assertEquals("monthView must not have in-focused keyBindings", 0, monthView.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).size()); } /** * Test default value and property change notificateion of * the componentInputMapEnabled property. * */ @Test public void testComponentInputMapEnabled() { JXMonthView monthView = new JXMonthView(); assertFalse("the default value must be false", monthView.isComponentInputMapEnabled()); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setComponentInputMapEnabled(true); TestUtils.assertPropertyChangeEvent(report, "componentInputMapEnabled", false, true, false); report.clear(); monthView.setComponentInputMapEnabled(false); TestUtils.assertPropertyChangeEvent(report, "componentInputMapEnabled", true, false, false); } /** * test doc'ed behaviour: model must not be null. * */ @Test public void testSetModelNull() { JXMonthView monthView = new JXMonthView(); assertNotNull(monthView.getSelectionModel()); try { monthView.setSelectionModel(null); fail("null model must not be accepted"); } catch (NullPointerException ex) { // expected - but how do we test fail-fast implemented } } /** * Enhanced commit/cancel. * * test that actions resets model.adjusting to false. */ @Test public void testCommitCancelResetsAdjusting() { JXMonthView monthView = new JXMonthView(); monthView.getSelectionModel().setAdjusting(true); monthView.commitSelection(); assertFalse("commit must reset adjusting", monthView.getSelectionModel().isAdjusting()); monthView.getSelectionModel().setAdjusting(true); monthView.cancelSelection(); assertFalse("cancel must reset adjusting", monthView.getSelectionModel().isAdjusting()); } /** * Enhanced commit/cancel. * * test that actions fire as expected. * */ @Test public void testCommitCancelAPIFires() { JXMonthView picker = new JXMonthView(); ActionReport report = new ActionReport(); picker.addActionListener(report); picker.commitSelection(); assertEquals(1, report.getEventCount()); assertEquals(JXMonthView.COMMIT_KEY, report.getLastActionCommand()); report.clear(); picker.cancelSelection(); assertEquals(1, report.getEventCount()); assertEquals(JXMonthView.CANCEL_KEY, report.getLastActionCommand()); } /** * Enhanced commit/cancel. * * test that actions fire as expected. * */ @Test public void testCommitCancelActionsFire() { JXMonthView picker = new JXMonthView(); Action commitAction = picker.getActionMap().get(JXMonthView.COMMIT_KEY); ActionReport report = new ActionReport(); picker.addActionListener(report); commitAction.actionPerformed(null); assertEquals(1, report.getEventCount()); assertEquals(JXMonthView.COMMIT_KEY, report.getLastActionCommand()); report.clear(); Action cancelAction = picker.getActionMap().get(JXMonthView.CANCEL_KEY); cancelAction.actionPerformed(null); assertEquals(1, report.getEventCount()); assertEquals(JXMonthView.CANCEL_KEY, report.getLastActionCommand()); } /** * Enhanced commit/cancel. * * test that actions are registered. * */ @Test public void testCommitCancelActionExist() { JXMonthView picker = new JXMonthView(); assertNotNull(picker.getActionMap().get(JXMonthView.CANCEL_KEY)); assertNotNull(picker.getActionMap().get(JXMonthView.COMMIT_KEY)); } /** * Enhanced commit/cancel. * * test that actions are the same for new/old cancel/accept. * */ @Test public void testCommitCancelSameAsOld() { JXMonthView picker = new JXMonthView(); assertSame(picker.getActionMap().get("cancelSelection"), picker.getActionMap().get(JXMonthView.CANCEL_KEY)); assertSame(picker.getActionMap().get("acceptSelection"), picker.getActionMap().get(JXMonthView.COMMIT_KEY)); } /** * BasicMonthViewUI: use adjusting api in keyboard actions. * Here: test reset in cancel action. */ @Test public void testAdjustingResetOnCancel() { JXMonthView view = new JXMonthView(); Action select = view.getActionMap().get("selectNextDay"); select.actionPerformed(null); DateSelectionReport report = new DateSelectionReport(view.getSelectionModel()); Action cancel = view.getActionMap().get("cancelSelection"); cancel.actionPerformed(null); assertFalse("ui keyboard action must have stopped model adjusting", view.getSelectionModel().isAdjusting()); assertEquals(2, report.getEventCount()); } /** * BasicMonthViewUI: use adjusting api in keyboard actions. * Here: test reset in accept action. */ @Test public void testAdjustingResetOnAccept() { JXMonthView view = new JXMonthView(); Action select = view.getActionMap().get("selectNextDay"); select.actionPerformed(null); DateSelectionReport report = new DateSelectionReport(view.getSelectionModel()); Action cancel = view.getActionMap().get("acceptSelection"); cancel.actionPerformed(null); assertFalse("ui keyboard action must have stopped model adjusting", view.getSelectionModel().isAdjusting()); assertEquals(1, report.getEventCount()); assertEquals(EventType.ADJUSTING_STOPPED, report.getLastEvent().getEventType()); } /** * BasicMonthViewUI: use adjusting api in keyboard actions. * Here: test set selection action. */ @Test public void testAdjustingSetOnSelect() { JXMonthView view = new JXMonthView(); DateSelectionReport report = new DateSelectionReport(view.getSelectionModel()); Action select = view.getActionMap().get("selectNextDay"); select.actionPerformed(null); assertTrue("ui keyboard action must have started model adjusting", view.getSelectionModel().isAdjusting()); assertEquals(2, report.getEventCount()); // assert that the adjusting is fired before the set assertEquals(EventType.DATES_SET, report.getLastEvent().getEventType()); } /** * BasicMonthViewUI: use adjusting api in keyboard actions. * Here: test add selection action. */ @Test public void testAdjustingSetOnAdd() { JXMonthView view = new JXMonthView(); // otherwise the add action isn't called view.setSelectionMode(SelectionMode.SINGLE_INTERVAL_SELECTION); DateSelectionReport report = new DateSelectionReport(view.getSelectionModel()); Action select = view.getActionMap().get("adjustSelectionNextDay"); select.actionPerformed(null); assertTrue("ui keyboard action must have started model adjusting", view.getSelectionModel().isAdjusting()); assertEquals(2, report.getEventCount()); // assert that the adjusting is fired before the add // only: the type a set instead or the expected added - bug or feature? // assertEquals(EventType.DATES_ADDED, report.getLastEvent().getEventType()); // for now we are only interested in the adjusting (must not be the last) // so go for what's actually fired instead of what's expected assertEquals(EventType.DATES_SET, report.getLastEvent().getEventType()); } /** * Issue #557-swingx: always fire actionEvent after esc/enter. * * test fire after accept. */ @Test public void testFireOnKeyboardAccept() { JXMonthView monthView = new JXMonthView(); Date date = new Date(); monthView.setSelectionInterval(date, date); ActionReport report = new ActionReport(); monthView.addActionListener(report); Action accept = monthView.getActionMap().get("acceptSelection"); accept.actionPerformed(null); assertEquals(1, report.getEventCount()); } /** * Issue #557-swingx: always fire actionEvent after esc/enter. * * test fire after cancel. */ @Test public void testFireOnKeyboardCancel() { JXMonthView monthView = new JXMonthView(); Date date = new Date(); monthView.setSelectionInterval(date, date); ActionReport report = new ActionReport(); monthView.addActionListener(report); Action accept = monthView.getActionMap().get("cancelSelection"); accept.actionPerformed(null); assertEquals(1, report.getEventCount()); } /** * expose more selection constraint methods in JXMonthView * */ @Test public void testUpperBound() { JXMonthView view = new JXMonthView(); view.setUpperBound(today); assertEquals(startOfDay(today), view.getUpperBound()); // remove again view.setUpperBound(null); assertEquals(null, view.getUpperBound()); } /** * expose more selection constraint methods in JXMonthView * */ @Test public void testLowerBound() { JXMonthView view = new JXMonthView(); view.setLowerBound(today); assertEquals(startOfDay(today), view.getLowerBound()); // remove again view.setLowerBound(null); assertEquals(null, view.getLowerBound()); } /** * test unselectable: use methods with Date. * */ @Test public void testUnselectableDate() { JXMonthView monthView = new JXMonthView(); // initial assertFalse(monthView.isUnselectableDate(today)); // set unselectable today monthView.setUnselectableDates(today); assertTrue("raqw today must be unselectable", monthView.isUnselectableDate(today)); assertTrue("start of today must be unselectable", monthView.isUnselectableDate(startOfDay(today))); assertTrue("end of today must be unselectable", monthView.isUnselectableDate(endOfDay(today))); monthView.setUnselectableDates(); assertFalse(monthView.isUnselectableDate(today)); assertFalse(monthView.isUnselectableDate(startOfDay(today))); assertFalse(monthView.isUnselectableDate(endOfDay(today))); } /** * test unselectable: use methods with Date. * test NPE as doc'ed. */ @Test public void testUnselectableDatesNPE() { JXMonthView monthView = new JXMonthView(); try { monthView.setUnselectableDates((Date[])null); fail("null array must throw NPE"); } catch (NullPointerException e) { // expected } try { monthView.setUnselectableDates(new Date[] {new Date(), null}); fail("null elements must throw NPE"); } catch (NullPointerException e) { // expected } } /** * Issue #494-swingx: JXMonthView changed all passed-in dates * */ @Test public void testCleanupCopyDate() { JXMonthView monthView = new JXMonthView(); Date copy = new Date(today.getTime()); monthView.setSelectionInterval(today, today); assertEquals("the date used for selection must be unchanged", copy, today); } /** * test cover method: isSelectedDate * */ @Test public void testIsSelectedDate() { JXMonthView monthView = new JXMonthView(); monthView.setSelectionDate(today); assertTrue(monthView.isSelected(today)); assertTrue(monthView.isSelected(startOfDay(today))); } /** * Sanity: test against regression * test cover method: isSelectedDate * */ @Test public void testIsSelectedDate494() { JXMonthView monthView = new JXMonthView(); Date copy = new Date(today.getTime()); monthView.setSelectionDate(today); // use today monthView.isSelected(today); assertEquals("date must not be changed in isSelected", copy, today); } /** * test cover method: setSelectedDate * */ @Test public void testSetSelectedDate() { JXMonthView monthView = new JXMonthView(); Date copy = new Date(today.getTime()); monthView.setSelectionDate(today); // sanity: date unchanged assertEquals(copy, today); assertEquals(startOfDay(today), monthView.getSelectionDate()); monthView.setSelectionDate(null); assertTrue(monthView.isSelectionEmpty()); } /** * test new (convenience) api on JXMonthView * */ @Test public void testGetSelected() { JXMonthView monthView = new JXMonthView(); assertNull(monthView.getSelectionDate()); monthView.setSelectionInterval(today, today); assertEquals("same day", startOfDay(today), monthView.getSelectionDate()); // clear selection monthView.clearSelection(); assertNull(monthView.getSelectionDate()); } @Test public void testDefaultConstructor() { JXMonthView monthView = new JXMonthView(Locale.US); assertTrue(monthView.isSelectionEmpty()); assertTrue(SelectionMode.SINGLE_SELECTION == monthView.getSelectionMode()); assertTrue(Calendar.SUNDAY == monthView.getFirstDayOfWeek()); } @Test public void testLocale() { Locale[] locales = Locale.getAvailableLocales(); for (Locale l : locales) { JComponent.setDefaultLocale(l); JXMonthView monthView = new JXMonthView(); Locale locale = monthView.getLocale(); Calendar cal = Calendar.getInstance(locale); int expectedFirstDayOfWeek = cal.getFirstDayOfWeek(); assertTrue(expectedFirstDayOfWeek == monthView.getFirstDayOfWeek()); } } @Test public void testEmptySelectionInitial() { JXMonthView monthView = new JXMonthView(); assertTrue(monthView.isSelectionEmpty()); SortedSet<Date> selection = monthView.getSelection(); assertTrue(selection.isEmpty()); } @Test public void testEmptySelectionClear() { JXMonthView monthView = new JXMonthView(); monthView.setSelectionInterval(today, today); // sanity assertTrue(1 == monthView.getSelection().size()); monthView.clearSelection(); assertTrue(monthView.isSelectionEmpty()); assertTrue(monthView.getSelection().isEmpty()); } @Test public void testSelectionModes() { JXMonthView monthView = new JXMonthView(); assertEquals(SelectionMode.SINGLE_SELECTION, monthView .getSelectionMode()); for (SelectionMode mode : SelectionMode.values()) { monthView.setSelectionMode(mode); assertEquals(mode, monthView.getSelectionModel().getSelectionMode()); assertEquals(mode, monthView.getSelectionMode()); } } @Test public void testSingleSelection() { JXMonthView monthView = new JXMonthView(); monthView.setSelectionMode(SelectionMode.SINGLE_SELECTION); monthView.setSelectionInterval(yesterday, yesterday); assertTrue(1 == monthView.getSelection().size()); assertEquals(startOfDay(yesterday), monthView.getFirstSelectionDate()); monthView.setSelectionInterval(yesterday, afterTomorrow); assertTrue(1 == monthView.getSelection().size()); assertEquals(startOfDay(yesterday), monthView.getFirstSelectionDate()); } @Test public void testSingleIntervalSelection() { JXMonthView monthView = new JXMonthView(); monthView.setSelectionMode(SelectionMode.SINGLE_INTERVAL_SELECTION); monthView.setSelectionInterval(yesterday, yesterday); assertTrue(1 == monthView.getSelection().size()); assertEquals(startOfDay(yesterday), monthView.getFirstSelectionDate()); monthView.setSelectionInterval(yesterday, tomorrow); assertTrue(3 == monthView.getSelection().size()); assertEquals(startOfDay(yesterday), monthView.getFirstSelectionDate()); assertEquals(startOfDay(tomorrow), monthView.getLastSelectionDate()); } @Test public void testMultipleIntervalSelection() { JXMonthView monthView = new JXMonthView(); monthView.setSelectionMode(SelectionMode.MULTIPLE_INTERVAL_SELECTION); monthView.setSelectionInterval(yesterday, yesterday); monthView.addSelectionInterval(afterTomorrow, afterTomorrow); assertEquals(2, monthView.getSelection().size()); assertEquals(startOfDay(yesterday), monthView.getFirstSelectionDate()); assertEquals(startOfDay(afterTomorrow), monthView.getLastSelectionDate()); } @Test public void testDateSelectionListener() { JXMonthView monthView = new JXMonthView(); DateSelectionReport listener = new DateSelectionReport(); monthView.getSelectionModel().addDateSelectionListener(listener); Date date = new Date(); monthView.setSelectionInterval(date, date); assertThat(listener.getEventCount(), is(1)); assertThat(listener.getLastEvent().getEventType(), is(EventType.DATES_SET)); } /** * test setting/checking flagged dates (api with Date) */ @Test public void testFlaggedDateRemoveNotify() { JXMonthView monthView = new JXMonthView(); monthView.setFlaggedDates(tomorrow, yesterday); SortedSet<Date> oldFlagged = monthView.getFlaggedDates(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.removeFlaggedDates(tomorrow); TestUtils.assertPropertyChangeEvent(report, "flaggedDates", oldFlagged, monthView.getFlaggedDates()); } /** * test setting/checking flagged dates (api with Date) */ @Test public void testFlaggedDateRemove() { JXMonthView monthView = new JXMonthView(); monthView.addFlaggedDates(tomorrow, yesterday); assertEquals(2, monthView.getFlaggedDates().size()); monthView.removeFlaggedDates(tomorrow); assertTrue(monthView.isFlaggedDate(yesterday)); assertFalse(monthView.isFlaggedDate(tomorrow)); } /** * test setting/checking flagged dates (api with Date) */ @Test public void testFlaggedDateClear() { JXMonthView monthView = new JXMonthView(); monthView.addFlaggedDates(tomorrow, yesterday); assertEquals(2, monthView.getFlaggedDates().size()); monthView.clearFlaggedDates(); assertFalse("flagged dates must be cleared", monthView.hasFlaggedDates()); } /** * test setting/checking flagged dates (api with Date) */ @Test public void testFlaggedDateClearNotify() { JXMonthView monthView = new JXMonthView(); monthView.setFlaggedDates(tomorrow, yesterday); SortedSet<Date> oldFlagged = monthView.getFlaggedDates(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.clearFlaggedDates(); TestUtils.assertPropertyChangeEvent(report, "flaggedDates", oldFlagged, monthView.getFlaggedDates()); } /** * test setting/checking flagged dates (api with Date) */ @Test public void testFlaggedDateAdd() { JXMonthView monthView = new JXMonthView(); monthView.setFlaggedDates(yesterday); monthView.addFlaggedDates(tomorrow); assertEquals(2, monthView.getFlaggedDates().size()); assertTrue(monthView.isFlaggedDate(yesterday)); assertTrue(monthView.isFlaggedDate(tomorrow)); } /** * test setting/checking flagged dates (api with Date) */ @Test public void testFlaggedDateAddNotify() { JXMonthView monthView = new JXMonthView(); monthView.setFlaggedDates(yesterday); SortedSet<Date> oldFlagged = monthView.getFlaggedDates(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.addFlaggedDates(tomorrow); TestUtils.assertPropertyChangeEvent(report, "flaggedDates", oldFlagged, monthView.getFlaggedDates()); } /** * test setting/checking flagged dates (api with Date) */ @Test public void testFlaggedDateSet() { JXMonthView monthView = new JXMonthView(); monthView.setFlaggedDates(today); assertTrue(monthView.isFlaggedDate(today)); monthView.setFlaggedDates(); assertFalse(monthView.isFlaggedDate(today)); } /** * test setting/checking flagged dates (api with Date) */ @Test public void testFlaggedDateNotification() { JXMonthView monthView = new JXMonthView(); SortedSet<Date> oldFlagged = monthView.getFlaggedDates(); PropertyChangeReport report = new PropertyChangeReport(); monthView.addPropertyChangeListener(report); monthView.setFlaggedDates(today); TestUtils.assertPropertyChangeEvent(report, "flaggedDates", oldFlagged, monthView.getFlaggedDates()); } /** * test setting/checking flagged dates (api with Date) */ @Test public void testFlaggedDateGet() { JXMonthView monthView = new JXMonthView(); Date date = new Date(); SortedSet<Date> set = new TreeSet<Date>(); set.add(monthView.getSelectionModel().getNormalizedDate(date)); monthView.setFlaggedDates(date); assertEquals(set, monthView.getFlaggedDates()); } @Test public void testShowLeadingDates() { JXMonthView monthView = new JXMonthView(); assertFalse(monthView.isShowingLeadingDays()); monthView.setShowingLeadingDays(true); assertTrue(monthView.isShowingLeadingDays()); } @Test public void testShowTrailingDates() { JXMonthView monthView = new JXMonthView(); assertFalse(monthView.isShowingTrailingDays()); monthView.setShowingTrailingDays(true); assertTrue(monthView.isShowingTrailingDays()); } private Date startOfDay(Date date) { return CalendarUtils.startOfDay(calendar, date); } private Date endOfDay(Date date) { return CalendarUtils.endOfDay(calendar, date); } }