blob: 11acb414d78e664e9927305ff5f4889b54cae290 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 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
* Manuel Doninger - fixes for bug 349924
*******************************************************************************/
package org.eclipse.mylyn.tasks.tests;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
import org.eclipse.mylyn.commons.net.AuthenticationType;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.DateRange;
import org.eclipse.mylyn.internal.tasks.core.LocalTask;
import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
import org.eclipse.mylyn.internal.tasks.core.TaskList;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.TaskActivationAdapter;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
import org.eclipse.mylyn.tasks.tests.connector.MockTask;
import junit.framework.TestCase;
/**
* @author Shawn Minto
* @author Robert Elves
* @author Manuel Doninger
* @author Steffen Pingel
*/
public class TaskActivityManagerTest extends TestCase {
public static class MockTaskActivationListenerExtension extends TaskActivationAdapter {
public static MockTaskActivationListenerExtension INSTANCE;
public static int INSTANCE_COUNT;
public boolean hasActivated = false;
public boolean hasPreActivated = false;
public boolean hasDeactivated = false;
public boolean hasPreDeactivated = false;
public MockTaskActivationListenerExtension() {
INSTANCE = this;
INSTANCE_COUNT++;
}
public void reset() {
hasActivated = false;
hasPreActivated = false;
hasDeactivated = false;
hasPreDeactivated = false;
}
@Override
public void preTaskActivated(ITask task) {
hasPreActivated = true;
}
@Override
public void preTaskDeactivated(ITask task) {
hasPreDeactivated = true;
}
@Override
public void taskActivated(ITask task) {
hasActivated = true;
}
@Override
public void taskDeactivated(ITask task) {
hasDeactivated = true;
}
}
private class MockTaskActivationListener extends TaskActivationAdapter {
private boolean hasActivated = false;
private boolean hasPreActivated = false;
private boolean hasDeactivated = false;
private boolean hasPreDeactivated = false;
private int timesCalledCanDeactivate;
private final boolean canDeactivate;
public MockTaskActivationListener() {
this(true);
}
public MockTaskActivationListener(boolean canDeactivate) {
this.canDeactivate = canDeactivate;
}
public void reset() {
hasActivated = false;
hasPreActivated = false;
hasDeactivated = false;
hasPreDeactivated = false;
timesCalledCanDeactivate = 0;
}
@Override
public void preTaskActivated(ITask task) {
assertFalse(hasActivated);
hasPreActivated = true;
}
@Override
public void preTaskDeactivated(ITask task) {
assertFalse(hasDeactivated);
hasPreDeactivated = true;
}
@Override
public void taskActivated(ITask task) {
assertTrue(hasPreActivated);
hasActivated = true;
}
@Override
public void taskDeactivated(ITask task) {
assertTrue(hasPreDeactivated);
hasDeactivated = true;
}
@Override
public boolean canDeactivateTask(ITask task) {
timesCalledCanDeactivate++;
return canDeactivate;
}
public void verifyCalledCanDeactivate(int times) {
assertEquals(times, timesCalledCanDeactivate);
}
}
private TaskActivityManager taskActivityManager;
private TaskList taskList;
private TaskRepository repository;
private AbstractTask task1;
private AbstractTask task2;
@Override
protected void setUp() throws Exception {
taskActivityManager = TasksUiPlugin.getTaskActivityManager();
taskActivityManager.deactivateActiveTask();
taskActivityManager.clear();
taskList = TasksUiPlugin.getTaskList();
TaskTestUtil.resetTaskListAndRepositories();
repository = new TaskRepository(MockRepositoryConnector.CONNECTOR_KIND, MockRepositoryConnector.REPOSITORY_URL);
TasksUiPlugin.getRepositoryManager().addRepository(repository);
}
public void testWeekEnd() {
AbstractTask task = new LocalTask("12", "task-12");
assertFalse(taskActivityManager.isScheduledForToday(task));
// test end of next week
Calendar end = TaskActivityUtil.getNextWeek().getEndDate();
Calendar start = TaskActivityUtil.getCalendar();
start.setTimeInMillis(end.getTimeInMillis());
TaskActivityUtil.snapStartOfDay(start);
taskActivityManager.setScheduledFor(task, new DateRange(start, end));
assertTrue(taskActivityManager.isScheduledForNextWeek(task));
taskActivityManager.setScheduledFor(task, TaskActivityUtil.getNextWeek());
assertTrue(taskActivityManager.isScheduledForNextWeek(task));
assertEquals(0, taskActivityManager.getScheduledTasks(new DateRange(start, end)).size());
// test end of two weeks
end = TaskActivityUtil.getNextWeek().next().getEndDate();
start = TaskActivityUtil.getCalendar();
start.setTimeInMillis(end.getTimeInMillis());
TaskActivityUtil.snapStartOfDay(start);
taskActivityManager.setScheduledFor(task, new DateRange(start, end));
assertEquals(1, taskActivityManager.getScheduledTasks(new DateRange(start, end)).size());
assertEquals(1, taskActivityManager.getScheduledTasks(TaskActivityUtil.getNextWeek().next()).size());
}
public void testTaskActivation() {
MockTask task = new MockTask("test:activation");
MockTaskActivationListener listener = new MockTaskActivationListener();
try {
taskActivityManager.addActivationListener(listener);
try {
taskActivityManager.activateTask(task);
assertTrue(listener.hasPreActivated);
assertTrue(listener.hasActivated);
assertFalse(listener.hasPreDeactivated);
assertFalse(listener.hasDeactivated);
listener.reset();
} finally {
taskActivityManager.deactivateTask(task);
}
assertFalse(listener.hasPreActivated);
assertFalse(listener.hasActivated);
assertTrue(listener.hasPreDeactivated);
assertTrue(listener.hasDeactivated);
} finally {
taskActivityManager.removeActivationListener(listener);
}
}
public void testTaskActivationExtension() {
if (MockTaskActivationListenerExtension.INSTANCE != null) {
MockTaskActivationListenerExtension.INSTANCE.reset();
}
MockTask task = new MockTask("test:activation");
try {
taskActivityManager.activateTask(task);
assertNotNull("Expected creation of task activation listener instance",
MockTaskActivationListenerExtension.INSTANCE);
assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasPreActivated);
assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasActivated);
assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasPreDeactivated);
assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasDeactivated);
MockTaskActivationListenerExtension.INSTANCE.reset();
} finally {
taskActivityManager.deactivateTask(task);
}
assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasPreActivated);
assertFalse(MockTaskActivationListenerExtension.INSTANCE.hasActivated);
assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasPreDeactivated);
assertTrue(MockTaskActivationListenerExtension.INSTANCE.hasDeactivated);
}
public void testTaskActivationExtensionInstanceCount() {
MockTask task = new MockTask("test:activation");
try {
taskActivityManager.activateTask(task);
assertNotNull("Expected creation of task activation listener instance",
MockTaskActivationListenerExtension.INSTANCE);
assertEquals(1, MockTaskActivationListenerExtension.INSTANCE_COUNT);
} finally {
taskActivityManager.deactivateTask(task);
}
}
public void testIsActiveToday() {
AbstractTask task = new LocalTask("1", "task-1");
assertFalse(taskActivityManager.isScheduledForToday(task));
task.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday());
assertTrue(taskActivityManager.isScheduledForToday(task));
task.setReminded(true);
assertTrue(taskActivityManager.isScheduledForToday(task));
task.setReminded(true);
// Calendar inAnHour = Calendar.getInstance();
// inAnHour.set(Calendar.HOUR_OF_DAY, inAnHour.get(Calendar.HOUR_OF_DAY) + 1);
// inAnHour.getTime();
// task.setScheduledForDate(inAnHour.getTime());
// Calendar tomorrow = Calendar.getInstance();
// TaskActivityUtil.snapToNextDay(tomorrow);
// assertEquals(-1, inAnHour.compareTo(tomorrow));
// assertTrue(taskActivityManager.isScheduledForToday(task));
}
public void testScheduledForToday() {
AbstractTask task = new LocalTask("1", "task-1");
task.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday());
assertTrue(taskActivityManager.isScheduledForToday(task));
task.setScheduledForDate(TaskActivityUtil.getCurrentWeek().getToday().next());
assertFalse(taskActivityManager.isScheduledForToday(task));
}
public void testSchedulePastEndOfMonth() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, Calendar.SEPTEMBER);
calendar.set(Calendar.DAY_OF_MONTH, 30);
TaskActivityUtil.snapForwardNumDays(calendar, 1);
assertEquals("Should be October", Calendar.OCTOBER, calendar.get(Calendar.MONTH));
}
public void testIsCompletedToday() {
ITask task = new LocalTask("1", "task 1");
task.setCompletionDate(new Date());
assertTrue(taskActivityManager.isCompletedToday(task));
MockTask mockTask = new MockTask("1");
mockTask.setOwner("unknown");
taskList.addTask(mockTask);
mockTask.setCompletionDate(new Date());
assertFalse("completed: " + mockTask.getCompletionDate(), taskActivityManager.isCompletedToday(mockTask));
mockTask = new MockTask("2");
taskList.addTask(mockTask);
mockTask.setCompletionDate(new Date());
mockTask.setOwner("testUser");
repository.setCredentials(AuthenticationType.REPOSITORY, new AuthenticationCredentials("testUser", ""), false);
assertTrue(taskActivityManager.isCompletedToday(mockTask));
}
public void testAllTasksDeactivation() {
initializeTasks();
taskActivityManager.activateTask(task2);
assertEquals(task2, taskActivityManager.getActiveTask());
taskActivityManager.deactivateActiveTask();
assertNull(taskActivityManager.getActiveTask());
}
public void testActivateNonActiveTaskCanDeactivate() {
initializeTasks();
assertActivateNonActiveTaskCanDeactivate(true, task2);
}
public void testActivateNonActiveTaskCannotDeactivate() {
initializeTasks();
assertActivateNonActiveTaskCanDeactivate(false, task1);
}
private void assertActivateNonActiveTaskCanDeactivate(final boolean canDeactivate, ITask expectedActiveTask) {
MockTaskActivationListener listener = new MockTaskActivationListener(canDeactivate);
try {
taskActivityManager.addActivationListener(listener);
taskActivityManager.activateTask(task1);
assertEquals(task1, taskActivityManager.getActiveTask());
taskActivityManager.activateTask(task2);
assertEquals(expectedActiveTask, taskActivityManager.getActiveTask());
listener.verifyCalledCanDeactivate(1);
} finally {
taskActivityManager.removeActivationListener(listener);
}
}
public void testDeactivateTaskCanDeactivate() {
initializeTasks();
assertDeactivateTaskCanDeactivate(true, null);
}
public void testDeactivateTaskCannotDeactivate() {
initializeTasks();
assertDeactivateTaskCanDeactivate(false, task1);
}
private void assertDeactivateTaskCanDeactivate(final boolean canDeactivate, ITask expectedActiveTask) {
MockTaskActivationListener listener = new MockTaskActivationListener(canDeactivate);
try {
taskActivityManager.addActivationListener(listener);
taskActivityManager.activateTask(task1);
assertEquals(task1, taskActivityManager.getActiveTask());
taskActivityManager.deactivateTask(task1);
assertEquals(expectedActiveTask, taskActivityManager.getActiveTask());
listener.verifyCalledCanDeactivate(1);
} finally {
taskActivityManager.removeActivationListener(listener);
}
}
public void testDeactivateTaskOnInactiveTask() {
initializeTasks();
taskActivityManager.deactivateTask(task1);
assertNull(taskActivityManager.getActiveTask());
}
public void testMoveActivity() {
initializeTasks();
Calendar end = TaskActivityUtil.getNextWeek().getEndDate();
Calendar start = TaskActivityUtil.getCalendar();
start.setTimeInMillis(end.getTimeInMillis());
TaskActivityUtil.snapStartOfDay(start);
taskActivityManager.setScheduledFor(task1, new DateRange(start, end));
taskActivityManager.setDueDate(task1, new Date(start.getTimeInMillis() + 1));
assertEquals(Collections.singleton(task1), taskActivityManager.getScheduledTasks(start, end));
assertEquals(Collections.singleton(task1), taskActivityManager.getDueTasks(start, end));
taskActivityManager.activateTask(task1);
taskActivityManager.moveActivity(task1, task2);
assertEquals(Collections.singleton(task2), taskActivityManager.getScheduledTasks(start, end));
assertEquals(Collections.singleton(task2), taskActivityManager.getDueTasks(start, end));
assertTrue(task2.isActive());
assertEquals(task2, taskActivityManager.getActiveTask());
}
private void initializeTasks() {
task1 = new LocalTask("task1", "description1");
task2 = new LocalTask("task2", "description2");
taskList.addTask(task1);
taskList.addTask(task2);
assertNull(taskActivityManager.getActiveTask());
}
}