package com.plusonelabs.calendar; import android.test.InstrumentationTestCase; import android.util.Log; import com.plusonelabs.calendar.calendar.CalendarEvent; import com.plusonelabs.calendar.calendar.MockCalendarContentProvider; import com.plusonelabs.calendar.widget.CalendarEntry; import com.plusonelabs.calendar.widget.WidgetEntry; import org.joda.time.DateTime; /** * @author yvolk@yurivolkov.com */ public class MultidayEventTest extends InstrumentationTestCase { private static final String TAG = MultidayEventTest.class.getSimpleName(); private static final String ARROW = "→"; private MockCalendarContentProvider provider = null; private EventRemoteViewsFactory factory = null; private int eventId = 0; @Override protected void setUp() throws Exception { super.setUp(); provider = MockCalendarContentProvider.getContentProvider(this); factory = new EventRemoteViewsFactory(provider.getContext(), provider.getWidgetId()); assertTrue(factory.getWidgetEntries().isEmpty()); } @Override protected void tearDown() throws Exception { provider.tearDown(); super.tearDown(); } /** * Issue #206 https://github.com/plusonelabs/calendar-widget/issues/206 */ public void testEventWhichCarryOverToTheNextDay() { DateTime today = DateUtil.now(provider.getSettings().getTimeZone()).withTimeAtStartOfDay(); CalendarEvent event = new CalendarEvent(provider.getContext(), provider.getWidgetId(), provider.getSettings().getTimeZone(), false); event.setEventId(++eventId); event.setTitle("Event that carry over to the next day, show as ending midnight"); event.setStartDate(today.plusHours(19)); event.setEndDate(today.plusDays(1).plusHours(7)); DateUtil.setNow(today.plusHours(10).plusMinutes(33)); provider.addRow(event); factory.onDataSetChanged(); CalendarEntry entry1 = null; CalendarEntry entry2 = null; factory.logWidgetEntries(TAG); for (WidgetEntry item : factory.getWidgetEntries()) { if (item instanceof CalendarEntry) { if (entry1 == null) { entry1 = (CalendarEntry) item; } else { entry2 = (CalendarEntry) item; } } } assertNotNull(entry1); assertFalse("Is not active event", entry1.getEvent().isActive()); assertTrue("Is Part of Multi Day Event", entry1.isPartOfMultiDayEvent()); assertTrue("Is start of Multi Day Event", entry1.isStartOfMultiDayEvent()); assertFalse("Is not an end of Multi Day Event", entry1.isEndOfMultiDayEvent()); assertEquals("Start Time didn't change for today's event", event.getStartDate(), entry1.getStartDate()); assertEquals("Event entry end time is next midnight", today.plusDays(1), entry1.getEndDate()); assertNotNull(entry2); assertFalse("Is not active event", entry2.getEvent().isActive()); assertTrue("Is Part of Multi Day Event", entry2.isPartOfMultiDayEvent()); assertFalse("Is not start of Multi Day Event", entry2.isStartOfMultiDayEvent()); assertTrue("Is end of Multi Day Event", entry2.isEndOfMultiDayEvent()); assertEquals("Start Time of tomorrow's entry is midnight", today.plusDays(1), entry2.getStartDate()); assertEquals("Tomorrow event entry end time is the same as for the event", entry2.getEvent().getEndDate(), entry2.getEndDate()); } /** * https://github.com/plusonelabs/calendar-widget/issues/184#issuecomment-142671469 */ public void testThreeDaysEvent() { DateTime friday = new DateTime(2015, 9, 18, 0, 0, 0, 0, provider.getSettings().getTimeZone()); DateTime sunday = friday.plusDays(2); CalendarEvent event = new CalendarEvent(provider.getContext(), provider.getWidgetId(), provider.getSettings().getTimeZone(), false); event.setEventId(++eventId); event.setTitle("Leader's weekend"); event.setStartDate(friday.plusHours(19)); event.setEndDate(sunday.plusHours(15)); assertSundayEntryAt(event, sunday, friday.plusHours(14)); assertSundayEntryAt(event, sunday, friday.plusDays(1).plusHours(14)); assertSundayEntryAt(event, sunday, friday.plusDays(2).plusHours(14)); } private void assertSundayEntryAt(CalendarEvent event, DateTime sunday, DateTime currentDateTime) { CalendarEntry entry1 = getSundayEntryAt(event, currentDateTime); assertEquals(sunday, entry1.getStartDate()); assertEquals(event.getEndDate(), entry1.getEndDate()); assertEquals(event.getTitle(), entry1.getTitle()); String timeString = entry1.getEventTimeString(); assertTrue(timeString, timeString.contains(ARROW)); assertEquals(timeString, timeString.indexOf(ARROW), timeString.lastIndexOf(ARROW)); } private CalendarEntry getSundayEntryAt(CalendarEvent event, DateTime currentDateTime) { DateUtil.setNow(currentDateTime); provider.clear(); provider.addRow(event); factory.onDataSetChanged(); Log.i(TAG, "getSundayEntryAt " + currentDateTime); factory.logWidgetEntries(TAG); CalendarEntry sundayEntry = null; for (WidgetEntry item : factory.getWidgetEntries()) { if (item instanceof CalendarEntry) { CalendarEntry entry = (CalendarEntry) item; if (entry.getStartDate().getDayOfMonth() == 20) { assertNull(sundayEntry); sundayEntry = entry; } } } assertNotNull(sundayEntry); return sundayEntry; } }