/*******************************************************************************
 * 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
 *     Ivan Popov - [Bug 193488] org.eclipse.jdt.debug.test.stepping.StepIntoSelectionTests
 *     					depend on VM behavior
 *******************************************************************************/
package org.eclipse.jdt.debug.test.stepping;

import org.eclipse.debug.core.DebugEvent;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.testplugin.DebugElementEventWaiter;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.ui.actions.StepIntoSelectionHandler;

/**
 * Tests 'step into selection'
 */
public class StepIntoSelectionTests extends AbstractDebugTest {

	/**
	 * Constructor
	 */
	public StepIntoSelectionTests(String name) {
		super(name);
	}

	/**
	 * Step into 'new StepIntoSelectionClass()'
	 *
	 * @throws Exception
	 */
	public void testStepIntoSourceConstructor() throws Exception {
		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
		createLineBreakpoint(21, typeName);

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

			ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "StepIntoSelectionClass.java");
			IType type = cu.getType("StepIntoSelectionClass");
			IMethod method = type.getMethod("StepIntoSelectionClass", new String[0]);
			assertTrue("Could not find constructor", method.exists());

			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
			handler.step();
			Object source = waiter.waitForEvent();
			assertEquals("Step did not complete", thread, source);
			thread = (IJavaThread)source;

			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
			assertEquals("Should be in constructor", "<init>", frame.getMethodName());


		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Step into 'step()'
	 *
	 * @throws Exception
	 */
	public void testStepIntoSourceMethod() throws Exception {
		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
		createLineBreakpoint(23, typeName);

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

			ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "StepIntoSelectionClass.java");
			IType type = cu.getType("StepIntoSelectionClass");
			IMethod method = type.getMethod("step", new String[0]);
			assertTrue("Could not find method 'step'", method.exists());

			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
			handler.step();
			Object source = waiter.waitForEvent();
			assertEquals("Step did not complete", thread, source);
			thread = (IJavaThread)source;

			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
			assertEquals("Should be in method 'step'", "step", frame.getMethodName());


		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Step into 'method1(int[], String[])'
	 *
	 * @throws Exception
	 */
	public void testStepIntoSourceMethodWithParameters() throws Exception {
		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
		createLineBreakpoint(36, typeName);

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

			ICompilationUnit cu = getCompilationUnit(get14Project(), "src", "org.eclipse.debug.tests.targets", "StepIntoSelectionClass.java");
			IType type = cu.getType("StepIntoSelectionClass");
			IMethod method = type.getMethod("method1", new String[] {"[I", "[QString;"});
			assertTrue("Could not find method 'method1'", method.exists());

			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
			handler.step();
			Object source = waiter.waitForEvent();
			assertEquals("Step did not complete", thread, source);
			thread = (IJavaThread)source;

			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
			assertEquals("Should be in method 'step'", "method1", frame.getMethodName());


		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Step into 'Vector.addElement(Object)'
	 *
	 * @throws Exception
	 */
	public void testStepIntoBinaryMethod() throws Exception {
		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
		createLineBreakpoint(34, typeName);

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

			IType type = get14Project().findType("java.util.Vector");
			IMethod method = type.getMethod("addElement", new String[]{"Ljava.lang.Object;"});
			//for 1.5 compliance, addElement has a type 'E' not an object as the param type
			if(!method.exists()) {
				method = type.getMethod("addElement", new String[] {"TE;"});
			}
			assertTrue("Could not find method 'addElement'", method.exists());

			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
			handler.step();
			Object source = waiter.waitForEvent();
			assertEquals("Step did not complete", thread, source);
			thread = (IJavaThread)source;

			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
			assertEquals("Should be in method 'addElement'", "addElement", frame.getMethodName());


		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Step into 'new Integer(i)'
	 *
	 * @throws Exception
	 */
	public void testStepIntoBinaryConstructor() throws Exception {
		String typeName = "org.eclipse.debug.tests.targets.StepIntoSelectionClass";
		createLineBreakpoint(34, typeName);

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

			IType type = get14Project().findType("java.lang.Integer");
			IMethod method = type.getMethod("Integer", new String[]{"I"});
			assertTrue("Could not find method constructor", method.exists());

			StepIntoSelectionHandler handler = new StepIntoSelectionHandler(thread, (IJavaStackFrame)thread.getTopStackFrame(), method);
			DebugElementEventWaiter waiter = new DebugElementEventWaiter(DebugEvent.SUSPEND, thread);
			handler.step();
			Object source = waiter.waitForEvent();
			assertEquals("Step did not complete", thread, source);
			thread = (IJavaThread)source;

			IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
			assertEquals("Should be in constructor", "<init>", frame.getMethodName());


		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}
}
