/*******************************************************************************
 * 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 org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.model.ISourceLocator;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.launching.sourcelookup.IJavaSourceLocation;
import org.eclipse.jdt.launching.sourcelookup.PackageFragmentRootSourceLocation;

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

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

	/**
	 * See Bug 53646
	 */
	public void testPackageFragmentRoots() throws Exception {
		IJavaProject javaProject = get14Project();
		IPackageFragmentRoot[] roots = javaProject.getPackageFragmentRoots();
		IResource resource = javaProject.getProject().getFile("src/A.jar");
		IPackageFragmentRoot packageFragmentRoot = javaProject.getPackageFragmentRoot(resource);
		assertTrue("package fragment root should exist", packageFragmentRoot.exists());
		for (int i = 0; i < roots.length; i++) {
			IPackageFragmentRoot root = roots[i];
			if (packageFragmentRoot.equals(root)) {
				return;
			}
		}
		assertTrue("Failed to locate package fragment root", false);
	}

	/**
	 * see Bug 37545
	 */
	public void testStackFrameReuse() throws Exception {
		String typeName = "org.eclipse.debug.tests.targets.CallStack";
		createLineBreakpoint(28, "org.eclipse.debug.tests.targets.ClassOne");
		createLineBreakpoint(28, "org.eclipse.debug.tests.targets.ClassTwo");

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);

			// get source element for first breakpoint
			IStackFrame[] frames = thread.getStackFrames();
			IStackFrame frame = frames[2];
			ISourceLocator sourceLocator = thread.getLaunch().getSourceLocator();
			Object source1 = sourceLocator.getSourceElement(frame);
			source1 = ((IAdaptable)source1).getAdapter(IJavaElement.class);

			IPackageFragment[] fragments = get14Project().getPackageFragments();
			IPackageFragment fragment = null;
			for (int i = 0; i < fragments.length; i++) {
				if (fragments[i].getElementName().equals("org.eclipse.debug.tests.targets")) {
					fragment = fragments[i];
					break;
				}
			}
			assertNotNull("Did not locate package framgment 'org.eclipse.debug.tests.targets'", fragment);
			ICompilationUnit unit1 = fragment.getCompilationUnit("ClassOne.java");
			assertEquals("Source lookup failed for frame1", unit1, source1);

			// resume to second breakpoint
			thread = resume(thread);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			IStackFrame frame2 = thread.getStackFrames()[2];
			Object source2 = sourceLocator.getSourceElement(frame2);
			source2 = ((IAdaptable)source2).getAdapter(IJavaElement.class);
			ICompilationUnit unit2 = fragment.getCompilationUnit("ClassTwo.java");
			assertEquals("Source lookup failed for frame2", unit2, source2);

			// the source elements should not be equal
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

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

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

		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");
		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);

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

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

	/**
	 * Tests source lookup in an anonymous inner type, in the default package.
	 * Must debug since we do not know name of type.
	 */
	public void testDefAnonInnerType() throws Exception {
		String typeName = "Breakpoints";
		createLineBreakpoint(43, typeName);
		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
		assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists());

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);

			// get source element for top frame
			IStackFrame frame = thread.getTopStackFrame();
			ISourceLocator sourceLocator = thread.getLaunch().getSourceLocator();
			Object source = sourceLocator.getSourceElement(frame);
			assertEquals("Source lookup failed", expectedSource.getResource(), source);
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Tests source lookup in a named local type, in the default package.
	 * Must debug to test this, since we do no know name of local type.
	 */
	public void testDefLocalType() throws Exception {
		String typeName = "Breakpoints";
		createLineBreakpoint(30, typeName);
		ICompilationUnit expectedSource = getCompilationUnit(get14Project(), "src", IInternalDebugCoreConstants.EMPTY_STRING, "Breakpoints.java");
		assertTrue("did not find compilation unit for Breakpoints.java", expectedSource.exists());

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);

			// get source element for top frame
			IStackFrame frame = thread.getTopStackFrame();
			ISourceLocator sourceLocator = thread.getLaunch().getSourceLocator();
			Object source = sourceLocator.getSourceElement(frame);
			assertEquals("Source lookup failed", expectedSource.getResource(), source);
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

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

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

		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");
		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);

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

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

	/**
	 * Tests source lookup in an inner inner type.
	 */
	public void testInnerNestedType() throws Exception {
		IPackageFragmentRoot root = getPackageFragmentRoot(get14Project(), "src");
		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);

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

		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");
		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);

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

		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");
		IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);

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

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

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

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

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