/******************************************************************************* * Copyright (c) 2006 The Pampered Chef and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * The Pampered Chef - initial API and implementation ******************************************************************************/ package org.eclipse.nebula.widgets.compositetable.day; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import junit.framework.AssertionFailedError; import junit.framework.TestCase; import org.eclipse.nebula.widgets.compositetable.timeeditor.CalendarableItem; import org.eclipse.nebula.widgets.compositetable.timeeditor.CalendarableModel; /** * @since 3.2 * */ public class CalendarableModel_RefreshResultsTest extends TestCase { // Test fixtures ---------------------------------------------------------- private CMClientFixture cmf; private CalendarableModel cm; /* (non-Javadoc) * @see junit.framework.TestCase#setUp() */ protected void setUp() throws Exception { cmf = new CMClientFixture(); cm = new CalendarableModel(); } private void setupModel(String[][] data) { cmf.setData(data); cm.setTimeBreakdown(data.length, 4); cm.setEventCountProvider(cmf.eventCountProvider); cm.setEventContentProvider(cmf.eventContentProvider); cm.setStartDate(cmf.startDate); verifyModel(cm, data); } private void verifyModel(CalendarableModel cm, String[][] data) { assertEquals("number of days equal", cm.getNumberOfDays(), data.length); for (int day = 0; day < data.length; day++) { List events = cm.getCalendarableItems(day); assertEquals("number of events equal", events.size(), data[day].length); for (int element = 0; element < data[day].length; element++) { assertEquals("Event " + element + ", day " + day + "equal", data[day][element], ((CalendarableItem)events.get(element)).getText()); } } } private void verifyModelShouldFail(CalendarableModel cm, String[][] data) throws AssertionFailedError { try { // This should throw an assertion failed error verifyModel(cm, data); } catch (AssertionFailedError e) { // Make sure we got the correct assertion failure if (e.getMessage().indexOf("number of events equal") == -1) { throw e; } // Success } } private CalendarableModel testModelLoading(String[][] data) { CalendarableModel cm = new CalendarableModel(); setupModel(data); return cm; } private Date getNextDate(Date date) { GregorianCalendar gc = new GregorianCalendar(); gc.setTime(date); gc.add(Calendar.DATE, 1); return gc.getTime(); } private CalendarableItem[] getAllDayEvents(String[][] data) { setupModel(data); CalendarableItem[] allDayEvents = cm.getAllDayCalendarables(0); return allDayEvents; } // Tests ------------------------------------------------------------------ public void testOneDayOneEvent() throws Exception { testModelLoading(new String[][] { {"1"} }); } public void testTwoDaysTwoEvents() throws Exception { testModelLoading(new String[][] { {"1", "2"}, {"3", "4"} }); } public void testOneDayZeroEvents() throws Exception { testModelLoading(new String[][] { {} }); } public void testIncreaseNumberOfEventsInDay() throws Exception { String[][] data = new String[][] { {"1", "2", "3"} }; setupModel(data); data[0] = new String[] {"1", "2", "3", "4", "5"}; cm.refresh(cmf.startDate); verifyModel(cm, data); } public void testDecreaseNumberOfEventsInDay() throws Exception { String[][] data = new String[][] { {"1", "2", "3"} }; setupModel(data); data[0] = new String[] {"1"}; cm.refresh(cmf.startDate); verifyModel(cm, data); } public void testRefreshDateOutsideDisplayedRange() throws Exception { String[][] data = new String[][] { {"1", "2", "3"} }; setupModel(data); data[0] = new String[] {"1"}; cm.refresh(getNextDate(cmf.startDate)); // This refresh should not occur verifyModelShouldFail(cm, data); } public void testRefreshSecondDay() throws Exception { String[][] data = new String[][] { {"1", "2", "3"}, {"0", "3", "6", "9"} }; setupModel(data); data[1] = new String[] {"42"}; cm.refresh(cmf.startDate); // This refresh should do nothing (the data for that day didn't change) verifyModelShouldFail(cm, data); cm.refresh(getNextDate(cmf.startDate)); // This refresh should verifyModel(cm, data); } // Number of all day event row tests -------------------------------------- public void testComputeNumberOfAllDayEventRows_OneAllDayEvent() throws Exception { String[][] data = new String[][] { {"1", "3", "3"}, {"0", "3", "6", "9"} }; setupModel(data); assertEquals("max one event", 1, cm.computeNumberOfAllDayEventRows()); } public void testComputeNumberOfAllDayEventRows_TwoAllDayEvent() throws Exception { String[][] data = new String[][] { {"4", "1", "1"}, {"0", "3", "6", "9"} }; setupModel(data); assertEquals("max two event", 2, cm.computeNumberOfAllDayEventRows()); } public void testComputeNumberOfAllDayEventRows_ThreeAllDayEvent() throws Exception { String[][] data = new String[][] { {"4", "1", "1"}, {"1", "1", "1", "9"} }; setupModel(data); assertEquals("max three event", 3, cm.computeNumberOfAllDayEventRows()); } public void testComputeNumberOfAllDayEventRows_ZeroAllDayEvent() throws Exception { String[][] data = new String[][] { {"0", "2", "4"}, {"0", "3", "5", "9"} }; setupModel(data); assertEquals("no all day events", 0, cm.computeNumberOfAllDayEventRows()); } // Start time ------------------------------------------------------------- public void testComputeStartHour_UsingDefault() throws Exception { String[][] data = new String[][] { {"9", "22", "8"}, {"21", "11", "14", "16"} }; setupModel(data); assertEquals("8 am start", 8, cm.computeStartHour()); } public void testComputeStartHour_Midnight() throws Exception { String[][] data = new String[][] { {"9", "22", "8"}, {"21", "11", "0", "16"} }; setupModel(data); assertEquals("midnight start", 0, cm.computeStartHour()); } public void testComputeStartHour_7am() throws Exception { String[][] data = new String[][] { {"9", "22", "8"}, {"21", "11", "7", "16"} }; setupModel(data); assertEquals("midnight start", 7, cm.computeStartHour()); } public void testComputeStartHour_7amWithAllDayEvents() throws Exception { String[][] data = new String[][] { {"9", "1", "8"}, {"21", "11", "7", "16"} }; setupModel(data); assertEquals("midnight start", 7, cm.computeStartHour()); } // Test all-day event methods --------------------------------------------- public void testGetAllDayEvents_noEvents() throws Exception { String[][] data = new String[][] { {"2", "3"} }; setupModel(data); assertEquals("Should find no all-day events", 0, cm.getAllDayCalendarables(0).length); } public void testGetAllDayEvents_oneEvent() throws Exception { String[][] data = new String[][] { {"1First", "2", "3"} }; CalendarableItem[] allDayEvents = getAllDayEvents(data); assertEquals("Should find one all-day event", 1, allDayEvents.length); assertEquals("Found 1First", "1First", allDayEvents[0].getText()); } public void testGetAllDayEvents_threeEvents() throws Exception { String[][] data = new String[][] { {"0", "1First", "1Second", "2", "1Third"} }; CalendarableItem[] allDayEvents = getAllDayEvents(data); assertEquals("Should find three all-day event", 3, allDayEvents.length); assertEquals("Found 1First", "1First", allDayEvents[0].getText()); assertEquals("Found 1Third", "1Third", allDayEvents[2].getText()); } // Test methods that integrate the eventLayout and everything else -------- public void testFindAllDayCalendarable_ForwardNoData() throws Exception { String[][] data = new String[][] { {"5", "5", "2", "3", "5", "5"} }; setupModel(data); CalendarableItem result = cm.findAllDayCalendarable(0, true, null); assertNull("No calendarables forward", result); } public void testFindAllDayCalendarable_BackwardNoData() throws Exception { String[][] data = new String[][] { {"5", "5", "2", "3", "5", "5"} }; getAllDayEvents(data); CalendarableItem result = cm.findAllDayCalendarable(0, false, null); assertNull("No calendarables forward", result); } public void testFindAllDayCalendarable_BackwardButAtFirst() throws Exception { String[][] data = new String[][] { {"1First", "1Second", "2", "3", "1Third", "1Fourth"} }; CalendarableItem[] allDayEvents = getAllDayEvents(data); CalendarableItem result = cm.findAllDayCalendarable(0, false, allDayEvents[0]); assertNull("No Calendarables backward from first", result); } public void testFindAllDayCalendarable_ForwardAtLast() throws Exception { String[][] data = new String[][] { {"1First", "1Second", "2", "3", "1Third", "1Fourth"} }; CalendarableItem[] allDayEvents = getAllDayEvents(data); CalendarableItem result = cm.findAllDayCalendarable(0, true, allDayEvents[3]); assertNull("No calendarables forward", result); } public void testFindAllDayCalendarable_ForwardWithSelection() throws Exception { String[][] data = new String[][] { {"1First", "1Second", "2", "3", "1Third", "1Fourth"} }; CalendarableItem[] allDayEvents = getAllDayEvents(data); CalendarableItem result = cm.findAllDayCalendarable(0, true, allDayEvents[1]); assertEquals("Should find third event", allDayEvents[2], result); } public void testFindAllDayCalendarable_BackwardWithSelection() throws Exception { String[][] data = new String[][] { {"1First", "1Second", "2", "3", "1Third", "1Fourth"} }; CalendarableItem[] allDayEvents = getAllDayEvents(data); CalendarableItem result = cm.findAllDayCalendarable(0, false, allDayEvents[1]); assertEquals("Should find first event", allDayEvents[0], result); } }