/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.v7.tests.server.component.calendar;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.vaadin.v7.data.Container.Indexed;
import com.vaadin.v7.data.Container.Sortable;
import com.vaadin.v7.data.Item;
import com.vaadin.v7.data.Property;
import com.vaadin.v7.data.util.BeanItemContainer;
import com.vaadin.v7.data.util.IndexedContainer;
import com.vaadin.v7.ui.Calendar;
import com.vaadin.v7.ui.components.calendar.ContainerEventProvider;
import com.vaadin.v7.ui.components.calendar.event.BasicEvent;
import com.vaadin.v7.ui.components.calendar.event.CalendarEvent;
public class ContainerDataSourceTest {
private Calendar calendar;
@Before
public void setUp() {
calendar = new Calendar();
}
/**
* Tests adding a bean item container to the Calendar
*/
@Test
public void testWithBeanItemContainer() {
// Create a container to use as a datasource
Indexed container = createTestBeanItemContainer();
// Set datasource
calendar.setContainerDataSource(container);
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.setTime(((CalendarEvent) container.getIdByIndex(0)).getStart());
Date start = cal.getTime();
cal.add(java.util.Calendar.MONTH, 1);
Date end = cal.getTime();
// Test the all events are returned
List<CalendarEvent> events = calendar.getEventProvider()
.getEvents(start, end);
assertEquals(container.size(), events.size());
// Test that a certain range is returned
cal.setTime(((CalendarEvent) container.getIdByIndex(6)).getStart());
end = cal.getTime();
events = calendar.getEventProvider().getEvents(start, end);
assertEquals(6, events.size());
}
/**
* This tests tests that if you give the Calendar an unsorted (== not sorted
* by starting date) container then the calendar should gracefully handle
* it. In this case the size of the container will be wrong. The test is
* exactly the same as {@link #testWithBeanItemContainer()} except that the
* beans has been intentionally sorted by caption instead of date.
*/
@Test
public void testWithUnsortedBeanItemContainer() {
// Create a container to use as a datasource
Indexed container = createTestBeanItemContainer();
// Make the container sorted by caption
((Sortable) container).sort(new Object[] { "caption" },
new boolean[] { true });
// Set data source
calendar.setContainerDataSource(container);
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.setTime(((CalendarEvent) container.getIdByIndex(0)).getStart());
Date start = cal.getTime();
cal.add(java.util.Calendar.MONTH, 1);
Date end = cal.getTime();
// Test the all events are returned
List<CalendarEvent> events = calendar.getEventProvider()
.getEvents(start, end);
assertEquals(container.size(), events.size());
// Test that a certain range is returned
cal.setTime(((CalendarEvent) container.getIdByIndex(6)).getStart());
end = cal.getTime();
events = calendar.getEventProvider().getEvents(start, end);
// The events size is 1 since the getEvents returns the wrong range
assertEquals(1, events.size());
}
/**
* Tests adding a Indexed container to the Calendar
*/
@Test
public void testWithIndexedContainer() {
// Create a container to use as a datasource
Indexed container = createTestIndexedContainer();
// Set datasource
calendar.setContainerDataSource(container, "testCaption",
"testDescription", "testStartDate", "testEndDate", null);
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.setTime((Date) container.getItem(container.getIdByIndex(0))
.getItemProperty("testStartDate").getValue());
Date start = cal.getTime();
cal.add(java.util.Calendar.MONTH, 1);
Date end = cal.getTime();
// Test the all events are returned
List<CalendarEvent> events = calendar.getEventProvider()
.getEvents(start, end);
assertEquals(container.size(), events.size());
// Check that event values are present
CalendarEvent e = events.get(0);
assertEquals("Test 1", e.getCaption());
assertEquals("Description 1", e.getDescription());
assertTrue(e.getStart().compareTo(start) == 0);
// Test that a certain range is returned
cal.setTime((Date) container.getItem(container.getIdByIndex(6))
.getItemProperty("testStartDate").getValue());
end = cal.getTime();
events = calendar.getEventProvider().getEvents(start, end);
assertEquals(6, events.size());
}
@Test
public void testNullLimitsBeanItemContainer() {
// Create a container to use as a datasource
Indexed container = createTestBeanItemContainer();
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.setTime(((CalendarEvent) container.getIdByIndex(0)).getStart());
Date start = cal.getTime();
cal.add(java.util.Calendar.MONTH, 1);
Date end = cal.getTime();
// Set datasource
calendar.setContainerDataSource(container);
// Test null start time
List<CalendarEvent> events = calendar.getEventProvider().getEvents(null,
end);
assertEquals(container.size(), events.size());
// Test null end time
events = calendar.getEventProvider().getEvents(start, null);
assertEquals(container.size(), events.size());
// Test both null times
events = calendar.getEventProvider().getEvents(null, null);
assertEquals(container.size(), events.size());
}
@Test
public void testNullLimitsIndexedContainer() {
// Create a container to use as a datasource
Indexed container = createTestIndexedContainer();
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.setTime((Date) container.getItem(container.getIdByIndex(0))
.getItemProperty("testStartDate").getValue());
Date start = cal.getTime();
cal.add(java.util.Calendar.MONTH, 1);
Date end = cal.getTime();
// Set datasource
calendar.setContainerDataSource(container, "testCaption",
"testDescription", "testStartDate", "testEndDate", null);
// Test null start time
List<CalendarEvent> events = calendar.getEventProvider().getEvents(null,
end);
assertEquals(container.size(), events.size());
// Test null end time
events = calendar.getEventProvider().getEvents(start, null);
assertEquals(container.size(), events.size());
// Test both null times
events = calendar.getEventProvider().getEvents(null, null);
assertEquals(container.size(), events.size());
}
/**
* Tests the addEvent convenience method with the default event provider
*/
@Test
public void testAddEventConvinienceMethod() {
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
Date start = cal.getTime();
cal.add(java.util.Calendar.MONTH, 1);
Date end = cal.getTime();
// Ensure no events
assertEquals(0, calendar.getEvents(start, end).size());
// Add an event
BasicEvent event = new BasicEvent("Test", "Test", start);
calendar.addEvent(event);
// Ensure event exists
List<CalendarEvent> events = calendar.getEvents(start, end);
assertEquals(1, events.size());
assertEquals(events.get(0).getCaption(), event.getCaption());
assertEquals(events.get(0).getDescription(), event.getDescription());
assertEquals(events.get(0).getStart(), event.getStart());
}
/**
* Test the removeEvent convenience method with the default event provider
*/
@Test
public void testRemoveEventConvinienceMethod() {
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
Date start = cal.getTime();
cal.add(java.util.Calendar.MONTH, 1);
Date end = cal.getTime();
// Ensure no events
assertEquals(0, calendar.getEvents(start, end).size());
// Add an event
CalendarEvent event = new BasicEvent("Test", "Test", start);
calendar.addEvent(event);
// Ensure event exists
assertEquals(1, calendar.getEvents(start, end).size());
// Remove event
calendar.removeEvent(event);
// Ensure no events
assertEquals(0, calendar.getEvents(start, end).size());
}
@Test
public void testAddEventConvinienceMethodWithCustomEventProvider() {
// Use a container data source
calendar.setEventProvider(new ContainerEventProvider(
new BeanItemContainer<BasicEvent>(BasicEvent.class)));
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
Date start = cal.getTime();
cal.add(java.util.Calendar.MONTH, 1);
Date end = cal.getTime();
// Ensure no events
assertEquals(0, calendar.getEvents(start, end).size());
// Add an event
BasicEvent event = new BasicEvent("Test", "Test", start);
calendar.addEvent(event);
// Ensure event exists
List<CalendarEvent> events = calendar.getEvents(start, end);
assertEquals(1, events.size());
assertEquals(events.get(0).getCaption(), event.getCaption());
assertEquals(events.get(0).getDescription(), event.getDescription());
assertEquals(events.get(0).getStart(), event.getStart());
}
@Test
public void testRemoveEventConvinienceMethodWithCustomEventProvider() {
// Use a container data source
calendar.setEventProvider(new ContainerEventProvider(
new BeanItemContainer<BasicEvent>(BasicEvent.class)));
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
Date start = cal.getTime();
cal.add(java.util.Calendar.MONTH, 1);
Date end = cal.getTime();
// Ensure no events
assertEquals(0, calendar.getEvents(start, end).size());
// Add an event
BasicEvent event = new BasicEvent("Test", "Test", start);
calendar.addEvent(event);
// Ensure event exists
List<CalendarEvent> events = calendar.getEvents(start, end);
assertEquals(1, events.size());
// Remove event
calendar.removeEvent(event);
// Ensure no events
assertEquals(0, calendar.getEvents(start, end).size());
}
@Test
public void testStyleNamePropertyRetrieved() {
IndexedContainer ic = (IndexedContainer) createTestIndexedContainer();
ic.addContainerProperty("testStyleName", String.class, "");
for (int i = 0; i < 10; i++) {
Item item = ic.getItem(ic.getIdByIndex(i));
@SuppressWarnings("unchecked")
Property<String> itemProperty = item
.getItemProperty("testStyleName");
itemProperty.setValue("testStyle");
}
ContainerEventProvider provider = new ContainerEventProvider(ic);
provider.setCaptionProperty("testCaption");
provider.setDescriptionProperty("testDescription");
provider.setStartDateProperty("testStartDate");
provider.setEndDateProperty("testEndDate");
provider.setStyleNameProperty("testStyleName");
calendar.setEventProvider(provider);
java.util.Calendar cal = java.util.Calendar.getInstance();
Date now = cal.getTime();
cal.add(java.util.Calendar.DAY_OF_MONTH, 20);
Date then = cal.getTime();
List<CalendarEvent> events = calendar.getEventProvider().getEvents(now,
then);
for (CalendarEvent ce : events) {
assertEquals("testStyle", ce.getStyleName());
}
}
@Test
public void testAutomaticScaleVisibleHoursOfDay() {
BeanItemContainer<CalendarEvent> container = new BeanItemContainer<CalendarEvent>(
CalendarEvent.class);
java.util.Calendar start = java.util.Calendar.getInstance();
java.util.Calendar end = java.util.Calendar.getInstance();
start.set(java.util.Calendar.HOUR_OF_DAY, 8);
start.set(java.util.Calendar.MINUTE, 10);
// same start and end time
container.addBean(
new BasicEvent("8:00", "Description 1", start.getTime()));
start.set(java.util.Calendar.HOUR_OF_DAY, 16);
end.set(java.util.Calendar.HOUR_OF_DAY, 18);
end.set(java.util.Calendar.MINUTE, 10);
container.addBean(new BasicEvent("16-18", "Description 2",
start.getTime(), end.getTime())); // 16-18
calendar.setContainerDataSource(container);
calendar.setTimeZone(TimeZone.getDefault());
calendar.setLocale(Locale.getDefault());
calendar.beforeClientResponse(true); // simulate adding to UI
Assert.assertEquals(0, calendar.getFirstVisibleHourOfDay());
Assert.assertEquals(23, calendar.getLastVisibleHourOfDay());
calendar.autoScaleVisibleHoursOfDay();
Assert.assertEquals(8, calendar.getFirstVisibleHourOfDay());
Assert.assertEquals(18, calendar.getLastVisibleHourOfDay());
// reset visible timing to something else, so that the added event is
// not filtered out
calendar.resetVisibleHoursOfDay();
calendar.beforeClientResponse(false); // simulate being attached
Assert.assertEquals(0, calendar.getFirstVisibleHourOfDay());
Assert.assertEquals(23, calendar.getLastVisibleHourOfDay());
start.set(java.util.Calendar.HOUR_OF_DAY, 5);
end.set(java.util.Calendar.HOUR_OF_DAY, 21);
container.addBean(new BasicEvent("05-21", "Description 3",
start.getTime(), end.getTime())); // 05-21
calendar.beforeClientResponse(false); // simulate being attached
calendar.autoScaleVisibleHoursOfDay();
Assert.assertEquals(5, calendar.getFirstVisibleHourOfDay());
Assert.assertEquals(21, calendar.getLastVisibleHourOfDay());
}
private static Indexed createTestBeanItemContainer() {
BeanItemContainer<CalendarEvent> eventContainer = new BeanItemContainer<CalendarEvent>(
CalendarEvent.class);
java.util.Calendar cal = java.util.Calendar.getInstance();
for (int i = 1; i <= 10; i++) {
eventContainer.addBean(new BasicEvent("Test " + i,
"Description " + i, cal.getTime()));
cal.add(java.util.Calendar.DAY_OF_MONTH, 2);
}
return eventContainer;
}
private static Indexed createTestIndexedContainer() {
IndexedContainer container = new IndexedContainer();
container.addContainerProperty("testCaption", String.class, "");
container.addContainerProperty("testDescription", String.class, "");
container.addContainerProperty("testStartDate", Date.class, null);
container.addContainerProperty("testEndDate", Date.class, null);
java.util.Calendar cal = java.util.Calendar.getInstance();
for (int i = 1; i <= 10; i++) {
Item item = container.getItem(container.addItem());
item.getItemProperty("testCaption").setValue("Test " + i);
item.getItemProperty("testDescription")
.setValue("Description " + i);
item.getItemProperty("testStartDate").setValue(cal.getTime());
item.getItemProperty("testEndDate").setValue(cal.getTime());
cal.add(java.util.Calendar.DAY_OF_MONTH, 2);
}
return container;
}
}