/*******************************************************************************
 * 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.dependencies;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.io.ByteArrayInputStream;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class ResourceExistsDependencyTest {

	private ResourceExistsDependency fDependency;

	@BeforeEach
	public void setup() {
		fDependency = new ResourceExistsDependency();
	}

	@Test
	@DisplayName("Resource exists before activation for exact match")
	public void projectAlreadyExists() throws CoreException {

		ResourcesPlugin.getWorkspace().getRoot().getProject("Testproject").create(null);

		fDependency.setAttributes("Testproject");
		fDependency.activate();

		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Resource created after activation for exact match")
	public void projectGetsCreated() throws CoreException {
		fDependency.setAttributes("Testproject2");
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());

		ResourcesPlugin.getWorkspace().getRoot().getProject("Testproject2").create(null);

		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Resource created after activation for wildcard match")
	public void projectWithWildcard() throws CoreException {
		fDependency.setAttributes("Wildcard*");
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());

		ResourcesPlugin.getWorkspace().getRoot().getProject("WildcardProject").create(null);

		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Resource with path wildcard")
	public void projectWithPathWildcard() throws CoreException {
		fDependency.setAttributes("Project1/**/Simple.txt");
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());

		final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("Project1");
		project.create(null);
		project.open(null);

		project.getFile("Simple.txt").create(new ByteArrayInputStream("test".getBytes()), true, null);

		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Resource containing subfolders with path wildcard")
	public void projectWithPathWildcard2() throws CoreException {
		fDependency.setAttributes("Project2/**/Simple.txt");
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());

		final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("Project2");
		project.create(null);
		project.open(null);

		final IFolder folder1 = project.getFolder("parent");
		folder1.create(true, true, null);

		final IFolder folder2 = project.getFolder("child");
		folder2.create(true, true, null);

		folder2.getFile("Simple.txt").create(new ByteArrayInputStream("test".getBytes()), true, null);

		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Resource containing subfolders with path wildcard and file wildcard")
	public void projectWithPathAndFileWildcard() throws CoreException {
		fDependency.setAttributes("Project3/**/*.txt");
		fDependency.activate();

		assertFalse(fDependency.isFulfilled());

		final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("Project3");
		project.create(null);
		project.open(null);

		final IFolder folder1 = project.getFolder("parent");
		folder1.create(true, true, null);

		final IFolder folder2 = project.getFolder("child");
		folder2.create(true, true, null);

		folder2.getFile("Simple.bin").create(new ByteArrayInputStream("test".getBytes()), true, null);

		assertFalse(fDependency.isFulfilled());

		folder2.getFile("Simple.txt").create(new ByteArrayInputStream("test".getBytes()), true, null);

		assertTrue(fDependency.isFulfilled());
	}

	@Test
	@DisplayName("Existing resource gets deleted")
	public void existingProjectGetsDeleted() throws CoreException {
		final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("Project1");

		fDependency.setAttributes("Testproject");

		ResourcesPlugin.getWorkspace().getRoot().getProject("Testproject").create(null);

		fDependency.activate();
		assertTrue(fDependency.isFulfilled());

		ResourcesPlugin.getWorkspace().getRoot().getProject("Testproject").delete(true, null);

		assertFalse(fDependency.isFulfilled());
	}
}
