blob: 0d91497567b53ba26908186d5bf2bbca780cc3e4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.debug.tests.variables;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.eval.IEvaluationListener;
import org.eclipse.jdt.debug.eval.IEvaluationResult;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.eval.ast.engine.ASTEvaluationEngine;
/**
* Tests launching / suspending and evaluating within anonymous
* types
*/
public class TestAnonymousInspect extends AbstractDebugTest {
static final String TYPE_NAME = "InspectTests";
static final String SNIPPET = "getchar()";
class Listener implements IEvaluationListener {
IEvaluationResult fResult;
@Override
public void evaluationComplete(IEvaluationResult result) {
fResult= result;
}
public IEvaluationResult getResult() {
return fResult;
}
}
Listener listener= new Listener();
/**
* Constructor
*/
public TestAnonymousInspect() {
super("TestAnonymousInspect");
}
/* (non-Javadoc)
* @see org.eclipse.jdt.debug.tests.AbstractDebugTest#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
createLaunchConfiguration(get14Project(), TYPE_NAME);
}
/**
* Perform the actual evaluation (inspect)
* @param thread
* @return the result of the evaluation
* @throws Exception
*/
IValue doEval(IJavaThread thread) throws Exception{
IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
assertNotNull("There should be a stackframe", frame);
ASTEvaluationEngine engine = new ASTEvaluationEngine(get14Project(), (IJavaDebugTarget) thread.getDebugTarget());
try {
engine.evaluate(SNIPPET, frame, listener, DebugEvent.EVALUATION_IMPLICIT, false);
long timeout = System.currentTimeMillis()+5000;
while(listener.fResult == null && System.currentTimeMillis() < timeout) {
Thread.sleep(100);
}
assertFalse("The evaluation should not have errors", listener.fResult.hasErrors());
return listener.fResult.getValue();
}
finally {
engine.dispose();
}
}
/**
* Tests that we can successfully inspect a method call from an anonymous type declaration that is assigned
* to a field
*
* @throws Exception
*/
public void testInspectInAnonField() throws Exception {
IJavaThread thread = null;
try {
createLineBreakpoint(26, TYPE_NAME);
thread = launchToBreakpoint(TYPE_NAME);
assertNotNull("The application should have suspended - we cannot have a null thread", thread);
IValue value = doEval(thread);
assertNotNull("The evaluation result cannot be null", value);
assertEquals("The type must be char", "char", value.getReferenceTypeName());
assertEquals("The value must be 'a'", "a", value.getValueString());
}
finally {
terminateAndRemove(thread);
removeAllBreakpoints();
listener.fResult = null;
}
}
/**
* Tests that we can successfully inspect a method call from an anonymous type declaration within a method
* declaration
*
* @throws Exception
*/
public void testInspectInAnonMethod() throws Exception {
IJavaThread thread = null;
try {
createLineBreakpoint(34, TYPE_NAME);
thread = launchToBreakpoint(TYPE_NAME);
assertNotNull("The application should have suspended - we cannot have a null thread", thread);
IValue value = doEval(thread);
assertNotNull("The evaluation result cannot be null", value);
assertEquals("The type must be char", "char", value.getReferenceTypeName());
assertEquals("The value must be 'b'", "b", value.getValueString());
}
finally {
terminateAndRemove(thread);
removeAllBreakpoints();
listener.fResult = null;
}
}
/**
* Tests that we can successfully inspect a method call from an anonymous type declaration within a static
* initializer
*
* @throws Exception
*/
public void testInspectInAnonInitializer() throws Exception {
IJavaThread thread = null;
try {
createLineBreakpoint(17, TYPE_NAME);
thread = launchToBreakpoint(TYPE_NAME);
assertNotNull("The application should have suspended - we cannot have a null thread", thread);
IValue value = doEval(thread);
assertNotNull("The evaluation result cannot be null", value);
assertEquals("The type must be char", "char", value.getReferenceTypeName());
assertEquals("The value must be 's'", "s", value.getValueString());
}
finally {
terminateAndRemove(thread);
removeAllBreakpoints();
listener.fResult = null;
}
}
}