/*******************************************************************************
 * Copyright (c) 2008, 2012 Red Hat Inc. 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:
 *     Red Hat Incorporated - initial API and implementation
 *     Marc-Andre Laperle - Fix failing test on Windows
 *******************************************************************************/
package org.eclipse.cdt.autotools.tests;

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

import java.io.File;

import org.eclipse.cdt.autotools.core.AutotoolsNewProjectNature;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.URIUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

// This test verifies using Autotools with a linked folder.
public class AutotoolsVirtualFolderTest {

	private IProject testProject;

	@Before
	public void setUp() throws Exception {
		if (!ProjectTools.setup())
			fail("could not perform basic project workspace setup");
		testProject = ProjectTools.createProject("testProjectVirtualFolder");
		if (testProject == null) {
			fail("Unable to create test project");
		}
		testProject.open(new NullProgressMonitor());
	}

	/**
	 * Test sample project with a virtual folder that points to configure scripts.
	 * Tests Bug 434275 - Autotools configuration in subfolder not found 
	 * @throws Exception
	 */
	@Test
	public void testAutotoolsVirtualFolder() throws Exception {
		Path p = new Path("zip/project2.zip");
		IWorkspaceRoot root = ProjectTools.getWorkspaceRoot();
		IPath rootPath = root.getLocation();
		IPath configPath = rootPath.append("config");
		File configDir = configPath.toFile();
		configDir.deleteOnExit();
		assertTrue(configDir.mkdir());
		ProjectTools.createLinkedFolder(testProject, "src", URIUtil.append(root.getLocationURI(), "config"));
		ProjectTools.addSourceContainerWithImport(testProject, "src", p);
		assertTrue(testProject.hasNature(AutotoolsNewProjectNature.AUTOTOOLS_NATURE_ID));
		assertTrue(exists("src/ChangeLog"));
		ProjectTools.setConfigDir(testProject, "src");
		ProjectTools.markExecutable(testProject, "src/autogen.sh");
		assertFalse(exists("src/configure"));
		assertFalse(exists("src/Makefile.in"));
		assertFalse(exists("src/sample/Makefile.in"));
		assertFalse(exists("src/aclocal.m4"));
		assertTrue(ProjectTools.build());
		assertTrue(exists("src/configure"));
		assertTrue(exists("src/Makefile.in"));
		assertTrue(exists("src/sample/Makefile.in"));
		assertTrue(exists("src/aclocal.m4"));
		assertTrue(exists("config.status"));
		assertTrue(exists("Makefile"));
		String extension = Platform.getOS().equals(Platform.OS_WIN32) ? ".exe" : "";
		assertTrue(exists("sample/a.out" + extension));
		assertTrue(exists("sample/Makefile"));
	}

	private boolean exists(String path) {
		return testProject.exists(new Path(path));
	}

	@After
	public void tearDown() throws Exception {
		testProject.refreshLocal(IResource.DEPTH_INFINITE, null);
		try {
			testProject.delete(true, true, null);
		} catch (Exception e) {
			//FIXME: Why does a ResourceException occur when deleting the project??
		}
	}

}
