blob: e4eea7aa6b314a74887a672ffdec7158b59d8651 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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.core;
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.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
*/
public class SourceLookupTests extends AbstractDebugTest {
public SourceLookupTests(String name) {
super(name);
}
/**
* See Bug 53646
*/
public void testPackageFragmentRoots() throws Exception {
IJavaProject javaProject = getJavaProject();
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 = getJavaProject().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(getJavaProject(), "src");
IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
ICompilationUnit expectedSource = getCompilationUnit(getJavaProject(), "src", "", "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(getJavaProject(), "src");
IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
ICompilationUnit expectedSource = getCompilationUnit(getJavaProject(), "src", "", "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(getJavaProject(), "src", "", "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(getJavaProject(), "src", "", "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(getJavaProject(), "src");
IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
ICompilationUnit expectedSource = getCompilationUnit(getJavaProject(), "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(getJavaProject(), "src");
IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
ICompilationUnit expectedSource = getCompilationUnit(getJavaProject(), "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(getJavaProject(), "src");
IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
ICompilationUnit expectedSource = getCompilationUnit(getJavaProject(), "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(getJavaProject(), "src");
IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
ICompilationUnit expectedSource = getCompilationUnit(getJavaProject(), "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(getJavaProject(), "src");
IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
ICompilationUnit expectedSource = getCompilationUnit(getJavaProject(), "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(getJavaProject(), "src");
IJavaSourceLocation location = new PackageFragmentRootSourceLocation(root);
ICompilationUnit expectedSource = getCompilationUnit(getJavaProject(), "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"));
}
}