/*******************************************************************************
 * Copyright (c) 2000, 2011 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
 *******************************************************************************/
package org.eclipse.jdt.debug.tests.sourcelookup;

import java.io.File;

import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.launching.sourcelookup.DirectorySourceLocation;
import org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation;
import org.eclipse.jdt.launching.sourcelookup.LocalFileStorage;

/**
 * Tests source lookup in directories
 */
@SuppressWarnings("deprecation")
public class DirectorySourceLookupTests extends AbstractDebugTest {

	public DirectorySourceLookupTests(String name) {
		super(name);
	}

	/**
	 * Tests source lookup in a top level type, in the default package.
	 */
	public void testDefTopLevelType() throws Exception {
		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
		File rootFile = root.getResource().getLocation().toFile();
		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);

		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
		assertTrue("did not find compilation unit for Breakpoints.java", cu.exists());
		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());

		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("Breakpoints"));
	}

	/**
	 * Tests source lookup in an inner type, the default package.
	 */
	public void testDefInnerType() throws Exception {
		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
		File rootFile = root.getResource().getLocation().toFile();
		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);

		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
		assertTrue("did not find compilation unit for Breakpoints.java", cu.exists());
		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());

		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("Breakpoints$InnerRunnable"));
	}


	/**
	 * Tests source lookup in a top level type.
	 */
	public void testTopLevelType() throws Exception {
		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
		File rootFile = root.getResource().getLocation().toFile();
		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);

		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
		assertTrue("did not find compilation unit for SourceLookup.java", cu.exists());
		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());

		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup"));
	}

	/**
	 * Tests source lookup in an inner type.
	 */
	public void testInnerType() throws Exception {
		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
		File rootFile = root.getResource().getLocation().toFile();
		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);

		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
		assertTrue("did not find compilation unit for SourceLookup.java", cu.exists());
		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());

		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner"));
	}

	/**
	 * Tests source lookup in an inner, inner type.
	 */
	public void testNestedType() throws Exception {
		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
		File rootFile = root.getResource().getLocation().toFile();
		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);

		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "SourceLookup.java");
		assertTrue("did not find compilation unit for SourceLookup.java", cu.exists());
		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());

		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.SourceLookup$Inner$Nested"));
	}

	/**
	 * Tests source lookup in a top level type, with a $ named class
	 */
	public void testTopLevel$Type() throws Exception {
		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
		File rootFile = root.getResource().getLocation().toFile();
		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);

		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java");
		assertTrue("did not find compilation unit for Source_$_Lookup.java", cu.exists());
		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());

		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup"));
	}

	/**
	 * Tests source lookup in an inner type in a $ named class.
	 */
	public void testInner$Type() throws Exception {
		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
		File rootFile = root.getResource().getLocation().toFile();
		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);

		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java");
		assertTrue("did not find compilation unit for Source_$_Lookup.java", cu.exists());
		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());

		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner"));
	}

	/**
	 * Tests source lookup in an inner type in a $ named class.
	 */
	public void testInnerNested$Type() throws Exception {
		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
		File rootFile = root.getResource().getLocation().toFile();
		IJavaSourceLocation location = new DirectorySourceLocation(rootFile);

		ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "Source_$_Lookup.java");
		assertTrue("did not find compilation unit for Source_$_Lookup.java", cu.exists());
		LocalFileStorage expectedSource = new LocalFileStorage(cu.getResource().getLocation().toFile());

		assertEquals("Source lookup failed", expectedSource, location.findSourceElement("org.eclipse.debug.tests.targets.Source_$_Lookup$Inner$Nested"));
	}
}
