/*******************************************************************************
 * Copyright (c) 2006 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 junit.framework.TestCase;

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;

/**
 * Tests for the functions which determine the state of tasks
 */

public class TestState extends TestCase {
	
	private CompositeCheatSheetModel model;
	
	protected void setUp() throws Exception {
		model = new CompositeCheatSheetModel("name", "description", "explorerId");
	}
	
	private void skip(ICompositeCheatSheetTask task) {
		((AbstractTask)task).setState(ICompositeCheatSheetTask.SKIPPED);
	}

	public void testNoParent() {
		EditableTask task = new EditableTask(model, "id", "name", "ua.junit");
		assertNull(TaskStateUtilities.findSkippedAncestor(task));
		assertNull(TaskStateUtilities.findCompletedAncestor(task));
		assertNull(TaskStateUtilities.findBlockedAncestor(task));
	}
	
	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));
	}

	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));
	}
	
	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));
	}

	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));
	}
	
	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));
	}
	
	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
	 */
	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);
	}

}
