/*******************************************************************************
 * 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
 *     Matt Chapman  - initial version
 *******************************************************************************/
package org.eclipse.ajdt.core.tests;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.ajdt.core.BuildConfig;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;

/**
 * Tests for BuildConfig
 */
public class BuildConfigTest extends AJDTCoreTestCase {

	/**
	 * Test that getIncludedSourceFiles returns the complete set of source files
	 * in a project
	 * 
	 * @throws Exception
	 */
	public void testGetIncludedSourceFiles() throws Exception {
		IProject project = createPredefinedProject("TJP Example"); //$NON-NLS-1$
		String expected1 = "Demo.java"; //$NON-NLS-1$
		String expected2 = "GetInfo.aj"; //$NON-NLS-1$
		Set<IFile> files = BuildConfig.getIncludedSourceFiles(project);
		assertNotNull("getIncludedSourceFiles return null", files); //$NON-NLS-1$
		assertEquals(
				"getIncludedSourceFiles returned incorrect number of files", //$NON-NLS-1$
				2, files.size());
		Iterator<IFile> iter = files.iterator();
		String name1 = iter.next().getName();
		String name2 = iter.next().getName();
		if (!(name1.equals(expected1) || name2.equals(expected1))) {
			fail("Didn't find " + expected1 + " in list of source files"); //$NON-NLS-1$//$NON-NLS-2$
		}
		if (!(name1.equals(expected2) || name2.equals(expected2))) {
			fail("Didn't find " + expected2 + " in list of source files"); //$NON-NLS-1$ //$NON-NLS-2$
		}
	}

	/**
	 * Test that getIncludedSourceFiles returns the complete set of source files
	 * in a project
	 * 
	 * @throws Exception
	 */
	public void testGetIncludedSourceFilesBug153597() throws Exception {
		IProject project = createPredefinedProject("bug153597"); //$NON-NLS-1$
		Set<IFile> files = BuildConfig.getIncludedSourceFiles(project);
		assertNotNull(
				"BuildConfig.getIncludedSourceFiles should not return null", files); //$NON-NLS-1$
		List<IFile> asList = new ArrayList<IFile>(files);
		Collections.sort(asList, new Comparator<IFile>() {
			public int compare(IFile o1, IFile o2) {
				String s1 = o1.getProjectRelativePath()
						.toPortableString();
				String s2 = o2.getProjectRelativePath()
						.toPortableString();
				return s1.compareTo(s2);
			}
		});

		assertTrue(
				"BuildConfig.getIncludedSourceFiles should have returned at least one item", files.size() >= 1); //$NON-NLS-1$
		IFile f1 = asList.get(0);
		String s1 = f1.getProjectRelativePath().toPortableString();
		assertEquals(
				"BuildConfig.getIncludedSourceFiles should have returned s2/B.java", "s2/B.java", s1); //$NON-NLS-1$ //$NON-NLS-2$

		assertTrue(
				"BuildConfig.getIncludedSourceFiles should have returned two or more items", files.size() >= 2); //$NON-NLS-1$
		IFile f2 = asList.get(1);
		String s2 = f2.getProjectRelativePath().toPortableString();
		assertEquals(
				"BuildConfig.getIncludedSourceFiles should have returned src/A.java", "src/A.java", s2); //$NON-NLS-1$ //$NON-NLS-2$

		assertEquals(
				"BuildConfig.getIncludedSourceFiles should have returned exactly 2 files", 2, files.size()); //$NON-NLS-1$

	}

	/**
	 * Test that isIncluded returns true for source files on the build path,
	 * false otherwise
	 * 
	 * @throws Exception
	 */
	public void testIsIncluded() throws Exception {
		IProject project = createPredefinedProject("TJP Example"); //$NON-NLS-1$
		IResource demo = project.findMember("src/tjp/Demo.java"); //$NON-NLS-1$
		assertNotNull("Couldn't find Demo.java file", demo); //$NON-NLS-1$
		assertTrue("Demo.java should be included", BuildConfig //$NON-NLS-1$
				.isIncluded(demo));
		IResource getinfo = project.findMember("src/tjp/GetInfo.aj"); //$NON-NLS-1$
		assertNotNull("Couldn't find GetInfo.aj file", getinfo); //$NON-NLS-1$
		assertTrue("GetInfo.aj should be included", BuildConfig //$NON-NLS-1$
				.isIncluded(getinfo));
		IResource ajprop = project.findMember("build.ajproperties"); //$NON-NLS-1$
		assertNotNull("Couldn't find build.ajproperties file", ajprop); //$NON-NLS-1$
		assertFalse("build.ajproperties should NOT be included", //$NON-NLS-1$
				BuildConfig.isIncluded(ajprop));
	}
}