/*******************************************************************************
 * Copyright (c) 2020 Christian Pontesegger and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Christian Pontesegger - initial API and implementation
 *******************************************************************************/

package org.eclipse.skills.model;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Date;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class TaskDependencyTest {

	private ITaskDependency fDependency;

	@BeforeEach
	public void setupFixture() {
		fDependency = ISkillsFactory.eINSTANCE.createTaskDependency();
	}

	@Test
	@DisplayName("getUser() uses custom user")
	public void getUserUsesCustomUser() {
		final IUser user = ISkillsFactory.eINSTANCE.createUser();

		fDependency.setUser(user);
		assertEquals(user, fDependency.getUser());
	}

	@Test
	@DisplayName("getUser() has a default value")
	public void getUserHasADefaultValue() {
		assertNotNull(fDependency.getUser());
	}

	@Test
	@DisplayName("Without task dependency cannot be fulfilled")
	public void emptyDependencyIsNotFulfilled() {
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Is not fulfilled when waiting for completion of open task")
	public void notFulfilledWhenWaitingForOpenTask() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();

		fDependency.setTask(task);
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Is not fulfilled when waiting for completion of scheduled task")
	public void notFulfilledWhenWaitingForScheduledTask() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();

		final IUser user = ISkillsFactory.eINSTANCE.createUser();
		user.addTask(task);

		fDependency.setUser(user);
		fDependency.setTask(task);
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Is not fulfilled when waiting for completion of running task")
	public void notFulfilledWhenWaitingForRunningTask() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();
		task.setGoal(ISkillsFactory.eINSTANCE.createNotDependency());

		final IUser user = ISkillsFactory.eINSTANCE.createUser();
		final IUserTask userTask = user.addTask(task);
		userTask.setStarted(new Date());

		fDependency.setUser(user);
		fDependency.setTask(task);
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Is fulfilled when waiting for completion of completed task")
	public void fulfilledWhenWaitingForCompletedTask() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();

		final IUser user = ISkillsFactory.eINSTANCE.createUser();
		final IUserTask userTask = user.addTask(task);
		userTask.setFinished(new Date());

		fDependency.setUser(user);
		fDependency.setTask(task);
		fDependency.activate();

		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Is fulfilled when waiting for completion of completing task")
	public void fulfilledWhenWaitingForCompletingTask() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();

		final IUser user = ISkillsFactory.eINSTANCE.createUser();
		final IUserTask userTask = user.addTask(task);

		fDependency.setUser(user);
		fDependency.setTask(task);
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());

		userTask.setFinished(new Date());
		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Activate dependency before task is started")
	public void activateDependencyBeforeTask() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();

		final IUser user = ISkillsFactory.eINSTANCE.createUser();

		fDependency.setUser(user);
		fDependency.setTask(task);
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());

		final IUserTask userTask = user.addTask(task);
		assertFalse(fDependency.isFulfilled());

		userTask.setStarted(new Date());
		assertFalse(fDependency.isFulfilled());

		userTask.setFinished(new Date());
		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Is not fulfilled when waiting for start of non-scheduled task")
	public void notFulfilledWhenWaitingForNewTask() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();

		final IUser user = ISkillsFactory.eINSTANCE.createUser();

		fDependency.setUser(user);
		fDependency.setTask(task);
		fDependency.setCompleted(false);
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Is not fulfilled when waiting for start of open task")
	public void notFulfilledWhenWaitingForStartOfOpenTask() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();

		final IUser user = ISkillsFactory.eINSTANCE.createUser();
		user.addTask(task);

		fDependency.setUser(user);
		fDependency.setTask(task);
		fDependency.setCompleted(false);
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Is fulfilled when waiting for running task")
	public void fulfilledWhenWaitingForRunningTask() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();

		final IUser user = ISkillsFactory.eINSTANCE.createUser();
		final IUserTask userTask = user.addTask(task);
		userTask.setStarted(new Date());

		fDependency.setUser(user);
		fDependency.setTask(task);
		fDependency.setCompleted(false);
		fDependency.activate();

		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Is fulfilled when waiting for task activation")
	public void fulfilledWhenWaitingForTaskActivation() {
		final ITask task = ISkillsFactory.eINSTANCE.createTask();

		final IUser user = ISkillsFactory.eINSTANCE.createUser();

		fDependency.setUser(user);
		fDependency.setTask(task);
		fDependency.setCompleted(false);
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());

		final IUserTask userTask = user.addTask(task);
		assertFalse(fDependency.isFulfilled());

		userTask.setStarted(new Date());
		assertTrue(fDependency.isFulfilled());
	}
}
