diff options
author | Sam Davis | 2012-06-04 22:15:28 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2013-05-08 07:29:28 +0000 |
commit | a3474b6cc09d546b76aee19a21b003d54f8dd782 (patch) | |
tree | bc9142276bee75ec4fa7e99556fea57cca3fbb40 /org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests | |
parent | e83de18edfd3c3538882d1296b7f365cbc3d80ca (diff) | |
download | org.eclipse.mylyn.tasks-a3474b6cc09d546b76aee19a21b003d54f8dd782.tar.gz org.eclipse.mylyn.tasks-a3474b6cc09d546b76aee19a21b003d54f8dd782.tar.xz org.eclipse.mylyn.tasks-a3474b6cc09d546b76aee19a21b003d54f8dd782.zip |
NEW - bug 250865: scheduling information incorrect when local time zone
changes
https://bugs.eclipse.org/bugs/show_bug.cgi?id=250865
Change-Id: I0ae81f95cb228c7966037e9aa89ff5aa23a520f1
Diffstat (limited to 'org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests')
2 files changed, 327 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java index d1ffa1e9e..96a6a9b91 100644 --- a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/AllTasksTests.java @@ -29,6 +29,7 @@ import org.eclipse.mylyn.tasks.tests.data.TaskDataExternalizerTest; import org.eclipse.mylyn.tasks.tests.data.Xml11InputStreamTest; import org.eclipse.mylyn.tasks.tests.ui.AbstractRepositoryConnectorUiTest; import org.eclipse.mylyn.tasks.tests.ui.MultipleTaskHyperlinkDetectorTest; +import org.eclipse.mylyn.tasks.tests.ui.ScheduledTaskContainerTest; import org.eclipse.mylyn.tasks.tests.ui.TaskAttachmentPropertyTesterTest; import org.eclipse.mylyn.tasks.tests.ui.TaskHyperlinkDetectorTest; import org.eclipse.mylyn.tasks.tests.ui.TaskListSynchronizationSchedulerTest; @@ -137,6 +138,7 @@ public class AllTasksTests { suite.addTestSuite(AbstractRepositoryConnectorUiTest.class); suite.addTestSuite(SynchronizeTasksJobTest.class); suite.addTestSuite(TaskAttributeTest.class); + suite.addTestSuite(ScheduledTaskContainerTest.class); return suite; } diff --git a/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/ScheduledTaskContainerTest.java b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/ScheduledTaskContainerTest.java new file mode 100644 index 000000000..916ffa156 --- /dev/null +++ b/org.eclipse.mylyn.tasks.tests/src/org/eclipse/mylyn/tasks/tests/ui/ScheduledTaskContainerTest.java @@ -0,0 +1,325 @@ +/******************************************************************************* + * Copyright (c) 2004, 2010 Tasktop Technologies 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: + * Tasktop Technologies - initial API and implementation + *******************************************************************************/ + +package org.eclipse.mylyn.tasks.tests.ui; + +import java.util.Calendar; +import java.util.TimeZone; + +import junit.framework.TestCase; + +import org.eclipse.mylyn.internal.tasks.core.AbstractTask; +import org.eclipse.mylyn.internal.tasks.core.DateRange; +import org.eclipse.mylyn.internal.tasks.core.DayDateRange; +import org.eclipse.mylyn.internal.tasks.core.LocalTask; +import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer; +import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager; +import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil; +import org.eclipse.mylyn.internal.tasks.core.WeekDateRange; +import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin; +import org.eclipse.mylyn.tasks.core.ITask; +import org.eclipse.mylyn.tasks.core.TaskRepository; +import org.eclipse.mylyn.tasks.tests.TaskTestUtil; +import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector; + +/** + * @author Sam Davis + */ +public class ScheduledTaskContainerTest extends TestCase { + private TaskActivityManager taskActivityManager; + + private long taskID; + + private TaskRepository repository; + + private final long instant = 1334355143000L;// arbitrary fixed point in time + + @Override + protected void setUp() throws Exception { + taskActivityManager = TasksUiPlugin.getTaskActivityManager(); + TaskTestUtil.resetTaskListAndRepositories(); + repository = new TaskRepository(MockRepositoryConnector.CONNECTOR_KIND, MockRepositoryConnector.REPOSITORY_URL); + TasksUiPlugin.getRepositoryManager().addRepository(repository); + } + + @Override + protected void tearDown() throws Exception { + taskActivityManager.clear(); + } + + public void testUSHawaiiDay() { + runDayTest("US/Hawaii"); + } + + public void testCanadaPacificDay() { + runDayTest("Canada/Pacific"); + } + + public void testBrazilWestDay() { + runDayTest("Brazil/West"); + } + + public void testEuropeDublinDay() { + runDayTest("Europe/Dublin"); + } + + public void testGreenwichDay() { + runDayTest("Greenwich"); + } + + public void testPortugalDay() { + runDayTest("Portugal"); + } + + public void testUniversalDay() { + runDayTest("Universal"); + } + + public void testEuropeViennaDay() { + runDayTest("Europe/Vienna"); + } + + public void testAsiaIstanbulDay() { + runDayTest("Asia/Istanbul"); + } + + public void testAsiaDubaiDay() { + runDayTest("Asia/Dubai"); + } + + public void testIndianComoroDay() { + runDayTest("Indian/Comoro"); + } + + public void testAsiaMacauDay() { + runDayTest("Asia/Macau"); + } + + public void testAustraliaSouthDay() { + runDayTest("Australia/South"); + } + + public void testAsiaTokyoDay() { + runDayTest("Asia/Tokyo"); + } + +// public void testPacificFijiDay() { +// // Fails because we cannot distinguish UTC+12 to UTC+14 from UTC-12 to -10 +// runDayTest("Pacific/Fiji"); +// } + + public void testUSHawaiiWeek() { + runWeekTest("US/Hawaii"); + } + + public void testCanadaPacificWeek() { + runWeekTest("Canada/Pacific"); + } + + public void testBrazilWestWeek() { + runWeekTest("Brazil/West"); + } + + public void testEuropeDublinWeek() { + runWeekTest("Europe/Dublin"); + } + + public void testGreenwichWeek() { + runWeekTest("Greenwich"); + } + + public void testPortugalWeek() { + runWeekTest("Portugal"); + } + + public void testUniversalWeek() { + runWeekTest("Universal"); + } + + public void testEuropeViennaWeek() { + runWeekTest("Europe/Vienna"); + } + + public void testAsiaIstanbulWeek() { + runWeekTest("Asia/Istanbul"); + } + + public void testAsiaDubaiWeek() { + runWeekTest("Asia/Dubai"); + } + + public void testIndianComoroWeek() { + runWeekTest("Indian/Comoro"); + } + + public void testAsiaMacauWeek() { + runWeekTest("Asia/Macau"); + } + + public void testAustraliaSouthWeek() { + runWeekTest("Australia/South"); + } + + public void testAsiaTokyoWeek() { + runWeekTest("Asia/Tokyo"); + } + +// public void testPacificFijiWeek() { +// // Fails because we cannot distinguish UTC+12 to UTC+14 from UTC-12 to -10 +// runWeekTest("Pacific/Fiji"); +// } + + /** + * Test day bins + */ + protected void runDayTest(String localTimezone) { + // create scheduled tasks + ITask taskUSHawaii = createTaskScheduledForDay(instant, "US/Hawaii"); + ITask taskCanadaPacific = createTaskScheduledForDay(instant, "Canada/Pacific"); + ITask taskCanadaEastern = createTaskScheduledForDay(instant, "Canada/Eastern"); + ITask taskEuropeWarsaw = createTaskScheduledForDay(instant, "Europe/Warsaw"); + ITask taskIndianComoro = createTaskScheduledForDay(instant, "Indian/Comoro"); + ITask taskAsiaTokyo = createTaskScheduledForDay(instant, "Asia/Tokyo"); + ITask taskAustraliaSydney = createTaskScheduledForDay(instant, "Australia/Sydney"); + // create due tasks + ITask taskUSHawaiiDue = createTaskDueForDay(instant, "US/Hawaii"); + ITask taskCanadaPacificDue = createTaskDueForDay(instant, "Canada/Pacific"); + ITask taskCanadaEasternDue = createTaskDueForDay(instant, "Canada/Eastern"); + ITask taskEuropeWarsawDue = createTaskDueForDay(instant, "Europe/Warsaw"); + ITask taskIndianComoroDue = createTaskDueForDay(instant, "Indian/Comoro"); + ITask taskAsiaTokyoDue = createTaskDueForDay(instant, "Asia/Tokyo"); + ITask taskAustraliaSydneyDue = createTaskDueForDay(instant, "Australia/Sydney"); + ScheduledTaskContainer dayContainer = new ScheduledTaskContainer(taskActivityManager, getDayOf(instant, + localTimezone)); + // check scheduled tasks are contained + assertTrue(dayContainer.getChildren().contains(taskUSHawaii)); + assertTrue(dayContainer.getChildren().contains(taskCanadaPacific)); + assertTrue(dayContainer.getChildren().contains(taskCanadaEastern)); + assertTrue(dayContainer.getChildren().contains(taskEuropeWarsaw)); + assertTrue(dayContainer.getChildren().contains(taskIndianComoro)); + assertTrue(dayContainer.getChildren().contains(taskAsiaTokyo)); + assertTrue(dayContainer.getChildren().contains(taskAustraliaSydney)); + // check due tasks are contained + assertTrue(dayContainer.getChildren().contains(taskUSHawaiiDue)); + assertTrue(dayContainer.getChildren().contains(taskCanadaPacificDue)); + assertTrue(dayContainer.getChildren().contains(taskCanadaEasternDue)); + assertTrue(dayContainer.getChildren().contains(taskEuropeWarsawDue)); + assertTrue(dayContainer.getChildren().contains(taskIndianComoroDue)); + assertTrue(dayContainer.getChildren().contains(taskAsiaTokyoDue)); + assertTrue(dayContainer.getChildren().contains(taskAustraliaSydneyDue)); + // surrounding days should be empty + DayDateRange previousDay = getDayOf(instant, localTimezone); + snapForwardNumDays(previousDay, -1); + ScheduledTaskContainer previousDayContainer = new ScheduledTaskContainer(taskActivityManager, previousDay); + assertTrue(previousDayContainer.getChildren().isEmpty()); + DayDateRange nextDay = getDayOf(instant, localTimezone); + snapForwardNumDays(nextDay, 1); + ScheduledTaskContainer nextDayContainer = new ScheduledTaskContainer(taskActivityManager, nextDay); + assertTrue(nextDayContainer.getChildren().isEmpty()); + } + + /** + * test week bins + */ + protected void runWeekTest(String localTimezone) { + ITask taskUSHawaii = createTaskScheduledForWeek(instant, "US/Hawaii"); + ITask taskCanadaPacific = createTaskScheduledForWeek(instant, "Canada/Pacific"); + ITask taskCanadaEastern = createTaskScheduledForWeek(instant, "Canada/Eastern"); + ITask taskEuropeWarsaw = createTaskScheduledForWeek(instant, "Europe/Warsaw"); + ITask taskIndianComoro = createTaskScheduledForWeek(instant, "Indian/Comoro"); + ITask taskAsiaTokyo = createTaskScheduledForWeek(instant, "Asia/Tokyo"); + ITask taskAustraliaSydney = createTaskScheduledForWeek(instant, "Australia/Sydney"); + ScheduledTaskContainer weekContainer = new ScheduledTaskContainer(taskActivityManager, getWeekOf(instant, + localTimezone)); + assertTrue(weekContainer.getChildren().contains(taskUSHawaii)); + assertTrue(weekContainer.getChildren().contains(taskCanadaPacific)); + assertTrue(weekContainer.getChildren().contains(taskCanadaEastern)); + assertTrue(weekContainer.getChildren().contains(taskEuropeWarsaw)); + assertTrue(weekContainer.getChildren().contains(taskIndianComoro)); + assertTrue(weekContainer.getChildren().contains(taskAsiaTokyo)); + assertTrue(weekContainer.getChildren().contains(taskAustraliaSydney)); + // surrounding days should be empty + DayDateRange previousDay = TaskActivityUtil.getDayOf(weekContainer.getDateRange().getStartDate().getTime()); + snapForwardNumDays(previousDay, -1); + ScheduledTaskContainer previousDayContainer = new ScheduledTaskContainer(taskActivityManager, previousDay); + assertTrue(previousDayContainer.getChildren().isEmpty()); + DayDateRange nextDay = TaskActivityUtil.getDayOf(weekContainer.getDateRange().getEndDate().getTime()); + snapForwardNumDays(nextDay, 1); + ScheduledTaskContainer nextDayContainer = new ScheduledTaskContainer(taskActivityManager, nextDay); + assertTrue(nextDayContainer.getChildren().isEmpty()); + // surrounding weeks should be empty + WeekDateRange previousWeek = TaskActivityUtil.getWeekOf(previousDay.getStartDate().getTime()); + ScheduledTaskContainer previousWeekContainer = new ScheduledTaskContainer(taskActivityManager, previousWeek); + assertTrue(previousWeekContainer.getChildren().isEmpty()); + WeekDateRange nextWeek = TaskActivityUtil.getWeekOf(nextDay.getStartDate().getTime()); + ScheduledTaskContainer nextWeekContainer = new ScheduledTaskContainer(taskActivityManager, nextWeek); + assertTrue(nextWeekContainer.getChildren().isEmpty()); + } + + protected void snapForwardNumDays(DayDateRange previousDay, int num) { + previousDay.getStartDate().add(Calendar.DAY_OF_MONTH, num); + previousDay.getEndDate().add(Calendar.DAY_OF_MONTH, num); + } + + protected AbstractTask createTaskScheduledForDay(long date, String timezone) { + AbstractTask task = new LocalTask(taskID++ + "", "task " + taskID); + taskActivityManager.setScheduledFor(task, getDayOf(date, timezone)); + return task; + } + + protected AbstractTask createTaskDueForDay(long date, String timezone) { + AbstractTask task = new LocalTask(taskID++ + "", "task " + taskID); + taskActivityManager.setDueDate(task, getDayOf(date, timezone).getStartDate().getTime()); + return task; + } + + protected AbstractTask createTaskScheduledForWeek(long date, String timezone) { + AbstractTask task = new LocalTask(taskID++ + "", "task " + taskID); + taskActivityManager.setScheduledFor(task, getWeekOf(date, timezone)); + return task; + } + + protected DateRange getWeekOf(long date, String timezoneString) { + TimeZone timeZone = TimeZone.getTimeZone(timezoneString); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(date); + Calendar start = getSameDayInTimeZone(cal, timeZone); + TaskActivityUtil.snapStartOfWorkWeek(start); + Calendar end = getSameDayInTimeZone(cal, timeZone); + TaskActivityUtil.snapEndOfWeek(end); + WeekDateRange weekInTimezone = new WeekDateRange(start, end); + return weekInTimezone; + } + + protected DayDateRange getDayOf(long date, String timezoneString) { + TimeZone timeZone = TimeZone.getTimeZone(timezoneString); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(date); + Calendar start = getSameDayInTimeZone(cal, timeZone); + Calendar end = getSameDayInTimeZone(cal, timeZone); + TaskActivityUtil.snapEndOfDay(end); + DayDateRange dayInTimezone = new DayDateRange(start, end); + return dayInTimezone; + } + + /** + * use the same y/m/d values but ignore the time + */ + protected Calendar getSameDayInTimeZone(Calendar cal, TimeZone timeZone) { + Calendar day = Calendar.getInstance(timeZone); + day.set(Calendar.YEAR, cal.get(Calendar.YEAR)); + day.set(Calendar.MONTH, cal.get(Calendar.MONTH)); + day.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH)); + TaskActivityUtil.snapStartOfDay(day); + return day; + } + +}
\ No newline at end of file |