/******************************************************************************* * Copyright (c) 2006, 2016 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ua.tests.cheatsheet.composite; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.eclipse.ui.internal.cheatsheets.composite.model.AbstractTask; import org.eclipse.ui.internal.cheatsheets.composite.model.CompositeCheatSheetModel; import org.eclipse.ui.internal.cheatsheets.composite.model.EditableTask; import org.eclipse.ui.internal.cheatsheets.composite.model.TaskGroup; import org.eclipse.ui.internal.cheatsheets.composite.model.TaskStateUtilities; import org.eclipse.ui.internal.provisional.cheatsheets.ICompositeCheatSheetTask; import org.eclipse.ui.internal.provisional.cheatsheets.ITaskGroup; import org.junit.Before; import org.junit.Test; /** * Tests for the functions which determine the state of tasks */ public class TestState { private CompositeCheatSheetModel model; @Before public void setUp() throws Exception { model = new CompositeCheatSheetModel("name", "description", "explorerId"); } private void skip(ICompositeCheatSheetTask task) { ((AbstractTask)task).setState(ICompositeCheatSheetTask.SKIPPED); } @Test public void testNoParent() { EditableTask task = new EditableTask(model, "id", "name", "ua.junit"); assertNull(TaskStateUtilities.findSkippedAncestor(task)); assertNull(TaskStateUtilities.findCompletedAncestor(task)); assertNull(TaskStateUtilities.findBlockedAncestor(task)); } @Test public void testSelfSkip() { EditableTask task = new EditableTask(model, "id", "name", "ua.junit"); skip(task); assertNull(TaskStateUtilities.findSkippedAncestor(task)); assertNull(TaskStateUtilities.findCompletedAncestor(task)); assertNull(TaskStateUtilities.findBlockedAncestor(task)); } @Test public void testSkippedParent() { TaskGroup root = new TaskGroup(model, "root", "rname", ITaskGroup.SEQUENCE); TaskGroup group = new TaskGroup(model, "group", "gname", ITaskGroup.SEQUENCE); EditableTask task = new EditableTask(model, "id", "name", "ua.junit"); root.addSubtask(group); group.addSubtask(task); skip(root); skip(group); assertEquals(group, TaskStateUtilities.findSkippedAncestor(task)); assertNull(TaskStateUtilities.findBlockedAncestor(task)); } @Test public void testSkippedGrandparent() { TaskGroup root = new TaskGroup(model, "root", "rname", ITaskGroup.SEQUENCE); TaskGroup group = new TaskGroup(model, "group", "gname", ITaskGroup.SEQUENCE); EditableTask task = new EditableTask(model, "id", "name", "ua.junit"); root.addSubtask(group); group.addSubtask(task); skip(root); assertEquals(root, TaskStateUtilities.findSkippedAncestor(task)); assertNull(TaskStateUtilities.findBlockedAncestor(task)); } @Test public void testCompletedGrandparent() { TaskGroup root = new TaskGroup(model, "root", "rname", ITaskGroup.CHOICE); TaskGroup group = new TaskGroup(model, "group", "gname", ITaskGroup.SEQUENCE); EditableTask task = new EditableTask(model, "id", "name", "ua.junit"); task.setSkippable(true); EditableTask completed = new EditableTask(model, "id2", "name2", "ua.junit"); root.addSubtask(group); group.addSubtask(task); root.addSubtask(completed); assertNull(TaskStateUtilities.findCompletedAncestor(task)); assertNull(TaskStateUtilities.findBlockedAncestor(task)); assertNull(TaskStateUtilities.findSkippedAncestor(task)); assertTrue(TaskStateUtilities.isStartEnabled(task)); assertTrue(TaskStateUtilities.isSkipEnabled(task)); completed.complete(); assertEquals(root, TaskStateUtilities.findCompletedAncestor(task)); assertFalse(TaskStateUtilities.isStartEnabled(task)); assertFalse(TaskStateUtilities.isSkipEnabled(task)); } @Test public void testBlockedGrandparent() { TaskGroup root = new TaskGroup(model, "root", "rname", ITaskGroup.SET); TaskGroup grandparent = new TaskGroup(model, "group1", "gname1", ITaskGroup.SEQUENCE); TaskGroup parent = new TaskGroup(model, "group2", "gname2", ITaskGroup.SEQUENCE); EditableTask task = new EditableTask(model, "id", "name", "ua.junit"); task.setSkippable(true); EditableTask required = new EditableTask(model, "id2", "name2", "ua.junit"); root.addSubtask(grandparent); grandparent.addSubtask(parent); parent.addSubtask(task); root.addSubtask(required); grandparent.addRequiredTask(required); assertNull(TaskStateUtilities.findCompletedAncestor(task)); assertNull(TaskStateUtilities.findSkippedAncestor(task)); assertEquals(grandparent, TaskStateUtilities.findBlockedAncestor(task)); assertNull(TaskStateUtilities.findBlockedAncestor(grandparent)); assertFalse(TaskStateUtilities.isStartEnabled(task)); assertTrue(TaskStateUtilities.isSkipEnabled(task)); required.complete(); assertNull(TaskStateUtilities.findBlockedAncestor(task)); assertTrue(TaskStateUtilities.isStartEnabled(task)); assertTrue(TaskStateUtilities.isSkipEnabled(task)); assertFalse(TaskStateUtilities.isStartEnabled(parent)); } @Test public void testRestartStates() { TaskGroup root = new TaskGroup(model, "root", "rname", ITaskGroup.SET); TaskGroup group = new TaskGroup(model, "group1", "gname", ITaskGroup.SET); EditableTask task1 = new EditableTask(model, "id1", "name1", "ua.junit"); EditableTask task2 = new EditableTask(model, "id2", "name2", "ua.junit"); EditableTask task3 = new EditableTask(model, "id3", "name3", "ua.junit"); EditableTask task4 = new EditableTask(model, "id4", "name4", "ua.junit"); task4.setSkippable(true); root.addSubtask(task1); root.addSubtask(task2); root.addSubtask(group); group.addSubtask(task3); group.addSubtask(task4); task1.setState(ICompositeCheatSheetTask.IN_PROGRESS); task2.setState(ICompositeCheatSheetTask.COMPLETED); task4.setState(ICompositeCheatSheetTask.SKIPPED); assertEquals(1, TaskStateUtilities.getRestartTasks(task1).length); assertEquals(task1, TaskStateUtilities.getRestartTasks(task1)[0]); assertEquals(1, TaskStateUtilities.getRestartTasks(task2).length); assertEquals(0, TaskStateUtilities.getRestartTasks(task3).length); assertEquals(1, TaskStateUtilities.getRestartTasks(task4).length); assertEquals(1, TaskStateUtilities.getRestartTasks(group).length); assertEquals(task4, TaskStateUtilities.getRestartTasks(group)[0]); assertEquals(3, TaskStateUtilities.getRestartTasks(root).length); } /** * Test that resetting a task resets dependents and their children also */ @Test public void testResetDependents() { TaskGroup root = new TaskGroup(model, "root", "rname", ITaskGroup.SET); TaskGroup group = new TaskGroup(model, "group1", "gname", ITaskGroup.SET); TaskGroup subGroup = new TaskGroup(model, "group2", "gname2", ITaskGroup.SET); EditableTask task1 = new EditableTask(model, "id1", "name1", "ua.junit"); EditableTask task2 = new EditableTask(model, "id2", "name2", "ua.junit"); EditableTask task3 = new EditableTask(model, "id3", "name3", "ua.junit"); EditableTask task4 = new EditableTask(model, "id4", "name4", "ua.junit"); EditableTask task5 = new EditableTask(model, "id5", "name5", "ua.junit"); task2.addRequiredTask(task1); task3.addRequiredTask(task2); subGroup.addRequiredTask(task3); task4.addRequiredTask(subGroup); root.addSubtask(group); group.addSubtask(task1); group.addSubtask(task2); group.addSubtask(task3); group.addSubtask(subGroup); group.addSubtask(task4); subGroup.addSubtask(task5); task1.complete(); task2.complete(); task3.complete(); task5.setStarted(); assertEquals(4, TaskStateUtilities.getRestartTasks(root).length); assertEquals(4, TaskStateUtilities.getRestartTasks(task1).length); assertEquals(3, TaskStateUtilities.getRestartTasks(task2).length); assertEquals(2, TaskStateUtilities.getRestartTasks(task3).length); assertEquals(1, TaskStateUtilities.getRestartTasks(subGroup).length); // Reset task5 and start task 1 and 3 and skip task 2. // Resetting task1 will not require task2 or task3 to be reset task5.setState(ICompositeCheatSheetTask.NOT_STARTED); task3.setState(ICompositeCheatSheetTask.NOT_STARTED); task2.setState(ICompositeCheatSheetTask.NOT_STARTED); task2.setState(ICompositeCheatSheetTask.SKIPPED); task3.setStarted(); assertEquals(3, TaskStateUtilities.getRestartTasks(root).length); assertEquals(1, TaskStateUtilities.getRestartTasks(task1).length); assertEquals(2, TaskStateUtilities.getRestartTasks(task2).length); } }