/******************************************************************************* * Copyright (c) 2011, 2015 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.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; } } }