/*******************************************************************************
 * Copyright (c) 2011 Tasktop Technologies.
 * 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
 *******************************************************************************/

package org.eclipse.mylyn.versions.core;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

import java.io.IOException;
import java.util.List;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil;
import org.eclipse.mylyn.versions.core.spi.ScmConnector;
import org.eclipse.mylyn.versions.tests.support.MockRepositoryProvider;
import org.eclipse.mylyn.versions.tests.support.MockScmConnector;
import org.junit.Assert;
import org.junit.Test;

/**
 * @author Steffen Pingel
 */
public class ScmCoreTest {

	@Test
	public void testMockConnectorPresent() {
		List<ScmConnector> connectors = ScmCore.getAllRegisteredConnectors();
		for (ScmConnector connector : connectors) {
			if (MockRepositoryProvider.ID.equals(connector.getProviderId())) {
				assertEquals(MockScmConnector.class, connector.getClass());
				return;
			}
		}
		Assert.fail("Expected MockScmConnector in " + connectors.toString());
	}

	@Test
	public void testGetResource() throws Exception {
		setupTestWorkspace();
		IResource expectedResource = ResourcesPlugin.getWorkspace()
				.getRoot()
				.findMember("/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java");

		assertEquals(expectedResource,
				ScmCore.findResource("/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java"));
		assertEquals(expectedResource,
				ScmCore.findResource("project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java"));
	}

	@Test
	public void testGetResourcePathChild() throws Exception {
		setupTestWorkspace();
		IResource expectedResource = ResourcesPlugin.getWorkspace()
				.getRoot()
				.findMember("/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java");

		assertEquals(
				expectedResource,
				ScmCore.findResource("/root/level1/level2/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java"));
		assertEquals(
				expectedResource,
				ScmCore.findResource("root/level1/level2/project1/src/org/eclipse/mylar/tests/project1/Project1Plugin.java"));

	}

	@Test
	public void testGetResourceFromProject() throws Exception {
		setupTestWorkspace();
		IResource expectedResource = ResourcesPlugin.getWorkspace()
				.getRoot()
				.findMember("/project2/src/org/eclipse/mylar/tests/project2/Project2Plugin.java");

		assertEquals(expectedResource,
				ScmCore.findResource("/src/org/eclipse/mylar/tests/project2/Project2Plugin.java"));
		assertEquals(expectedResource, ScmCore.findResource("src/org/eclipse/mylar/tests/project2/Project2Plugin.java"));
	}

	@Test
	public void testGetResourceCannotFind() throws Exception {
		setupTestWorkspace();
		assertNull(ScmCore.findResource("/project1/randompath"));
		assertNull(ScmCore.findResource("/2/src/org/eclipse/mylar/tests/project2/Project2Plugin.java"));
		assertNull(ScmCore.findResource("/org/eclipse/mylar/tests/project2/Project2Plugin.java"));
	}

	private void setupTestWorkspace() throws CoreException, ZipException, IOException {
		setupProjectFromZipFile(ScmCoreTest.class, "project1", "project1.zip");
		setupProjectFromZipFile(ScmCoreTest.class, "project2", "project2.zip");
	}

	private IProject setupProjectFromZipFile(Object source, String projectName, String zipFileName)
			throws ZipException, IOException, CoreException {
		IProject project = createTestProject(projectName);
		ZipFile zip = new ZipFile(CommonTestUtil.getFile(source, "testdata/projects/" + zipFileName));

		CommonTestUtil.unzip(zip, project.getLocation().toFile());
		project.refreshLocal(IResource.DEPTH_INFINITE, null);
		return project;
	}

	private IProject createTestProject(String projectName) throws CoreException {
		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
		IProject project = root.getProject(projectName);
		if (!project.exists()) {
			project.create(new NullProgressMonitor());
		} else {
			project.refreshLocal(IResource.DEPTH_INFINITE, null);
		}

		if (!project.isOpen()) {
			project.open(new NullProgressMonitor());
		}

		return project;
	}

}
