/*******************************************************************************
 * 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;
		}
	}
}
